kolega-code 0.28.4__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 (441) hide show
  1. {kolega_code-0.28.4 → kolega_code-0.29.0}/CHANGELOG.md +24 -0
  2. {kolega_code-0.28.4 → kolega_code-0.29.0}/PKG-INFO +1 -1
  3. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/__init__.py +3 -2
  4. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/baseagent.py +3 -0
  6. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/context.py +5 -0
  7. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/terminal_tool.py +3 -0
  8. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +3 -0
  9. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/config.py +276 -17
  10. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/main.py +51 -0
  11. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/messages.py +9 -0
  12. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/model_connection.py +6 -0
  13. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/provider_registry.py +35 -2
  14. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/settings.py +62 -1
  15. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/onboarding_screen.py +7 -1
  16. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/settings_panel.py +343 -10
  17. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/settings_screen.py +92 -0
  18. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/config.py +102 -2
  19. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/client.py +30 -0
  20. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/instrumented_client.py +6 -2
  21. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/models.py +4 -0
  22. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/anthropic.py +1 -0
  23. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/openai.py +12 -3
  24. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/responses_common.py +9 -5
  25. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/__init__.py +16 -0
  26. kolega_code-0.29.0/kolega_code/llm/specs/custom_endpoints.py +156 -0
  27. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/thinking.py +27 -1
  28. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/usage.py +20 -4
  29. {kolega_code-0.28.4 → kolega_code-0.29.0}/pyproject.toml +1 -1
  30. {kolega_code-0.28.4 → kolega_code-0.29.0}/.gitignore +0 -0
  31. {kolega_code-0.28.4 → kolega_code-0.29.0}/CONTRIBUTING.md +0 -0
  32. {kolega_code-0.28.4 → kolega_code-0.29.0}/LICENSE +0 -0
  33. {kolega_code-0.28.4 → kolega_code-0.29.0}/MIGRATION.md +0 -0
  34. {kolega_code-0.28.4 → kolega_code-0.29.0}/README.md +0 -0
  35. {kolega_code-0.28.4 → kolega_code-0.29.0}/RELEASING.md +0 -0
  36. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  37. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  38. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  39. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  40. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  41. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  42. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  43. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  44. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  45. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  46. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  47. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  48. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  49. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  50. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  51. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  52. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  53. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  54. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  55. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  56. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  57. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  58. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  59. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  60. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  61. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  62. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  63. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  64. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  65. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  66. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  67. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  68. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  69. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  70. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  71. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  72. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  73. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  74. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  75. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  76. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  77. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  78. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  79. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  80. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  81. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  82. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  83. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  84. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  85. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  86. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  87. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  88. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/browseragent.py +0 -0
  89. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/coder.py +0 -0
  90. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/common.py +0 -0
  91. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/compression.py +0 -0
  92. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/conversation.py +0 -0
  93. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/custom_agents.py +0 -0
  94. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/edit_protocols.py +0 -0
  95. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/errors.py +0 -0
  96. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/__init__.py +0 -0
  97. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/bridge.py +0 -0
  98. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  99. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  100. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/env.py +0 -0
  101. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  102. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/kernel.py +0 -0
  103. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/prelude.js +0 -0
  104. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/prelude.py +0 -0
  105. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/protocol.py +0 -0
  106. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  107. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/runner.js +0 -0
  108. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/runner.py +0 -0
  109. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/generalagent.py +0 -0
  110. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/goal.py +0 -0
  111. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/investigationagent.py +0 -0
  112. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/model_routing.py +0 -0
  113. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  114. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  115. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/budget.py +0 -0
  116. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/context.py +0 -0
  117. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/errors.py +0 -0
  118. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/executor.py +0 -0
  119. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/guide.py +0 -0
  120. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/journal.py +0 -0
  121. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  122. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/types.py +0 -0
  123. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/planningagent.py +0 -0
  124. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_dump.py +0 -0
  125. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_overrides.py +0 -0
  126. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_provider.py +0 -0
  127. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  128. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  129. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  130. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  131. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  132. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  133. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  134. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  135. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  136. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  137. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  138. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  139. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  140. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  141. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  142. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  143. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  144. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  145. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  146. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  147. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  148. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  149. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  150. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  151. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  152. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  153. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  154. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  155. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  156. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  157. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  158. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  159. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  160. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  161. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  162. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  163. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  164. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  165. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  166. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  167. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  168. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  169. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  170. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  171. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  172. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  173. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  174. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  175. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  176. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  177. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  178. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  179. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  180. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  181. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  182. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  183. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  184. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  185. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  186. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  187. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  188. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  189. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  190. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  191. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  192. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  193. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  194. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  195. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  196. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  197. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  198. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  199. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  200. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  201. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  202. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  203. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  204. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  205. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  206. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  207. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  208. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  209. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  210. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  211. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  212. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  213. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  214. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  215. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  216. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  217. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  218. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  219. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  220. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  221. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompts.py +0 -0
  222. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  223. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  224. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  225. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  226. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  227. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  228. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  229. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  230. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  231. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  232. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  233. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  234. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  235. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  236. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  237. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  238. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  239. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  240. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  241. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  242. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  243. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  244. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  245. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  246. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  247. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  248. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  249. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  250. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  251. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  252. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  253. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  254. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_definitions.py +0 -0
  255. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tools.py +0 -0
  256. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/utils/commands.py +0 -0
  257. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/volatile_context.py +0 -0
  258. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/__init__.py +0 -0
  259. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/_jwt.py +0 -0
  260. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  261. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/constants.py +0 -0
  262. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/tokens.py +0 -0
  263. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/__init__.py +0 -0
  264. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/framing.py +0 -0
  265. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/installer.py +0 -0
  266. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/manager.py +0 -0
  267. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/multiplex.py +0 -0
  268. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/native_host.py +0 -0
  269. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/protocol.py +0 -0
  270. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/registry.py +0 -0
  271. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/runtime.py +0 -0
  272. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/__init__.py +0 -0
  273. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/app.py +0 -0
  274. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/ask_output.py +0 -0
  275. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/atif_export.py +0 -0
  276. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/browser_backend.py +0 -0
  277. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/clipboard_image.py +0 -0
  278. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/connection.py +0 -0
  279. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/cron.py +0 -0
  280. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/diagnostics.py +0 -0
  281. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/file_index.py +0 -0
  282. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/goal.py +0 -0
  283. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/loop.py +0 -0
  284. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/mentions.py +0 -0
  285. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/model_catalog.py +0 -0
  286. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/plan_artifacts.py +0 -0
  287. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_event_protocol.py +0 -0
  288. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_event_store.py +0 -0
  289. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_journal.py +0 -0
  290. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_store.py +0 -0
  291. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_usage.py +0 -0
  292. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/skills.py +0 -0
  293. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/slash_commands.py +0 -0
  294. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/theme.py +0 -0
  295. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/__init__.py +0 -0
  296. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
  297. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/app_base.py +0 -0
  298. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  299. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  300. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/constants.py +0 -0
  301. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/custom_model.py +0 -0
  302. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  303. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  304. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/pacing.py +0 -0
  305. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  306. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/session_diff.py +0 -0
  307. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/state.py +0 -0
  308. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  309. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/styles.tcss +0 -0
  310. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  311. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  312. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/transcript.py +0 -0
  313. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/widgets.py +0 -0
  314. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/updater.py +0 -0
  315. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/events.py +0 -0
  316. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/extensions.py +0 -0
  317. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/git_env.py +0 -0
  318. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/__init__.py +0 -0
  319. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/backends.py +0 -0
  320. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/config.py +0 -0
  321. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/dispatcher.py +0 -0
  322. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/events.py +0 -0
  323. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/matcher.py +0 -0
  324. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/outcome.py +0 -0
  325. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/exceptions.py +0 -0
  326. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/ledger.py +0 -0
  327. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/__init__.py +0 -0
  328. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  329. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/base.py +0 -0
  330. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  331. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  332. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/google.py +0 -0
  333. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/models.py +0 -0
  334. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  335. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/tinker.py +0 -0
  336. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  337. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/ratelimit.py +0 -0
  338. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/accessors.py +0 -0
  339. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  340. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  341. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  342. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  343. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  344. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  345. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  346. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  347. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  348. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  349. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  350. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  351. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  352. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  353. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  354. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  355. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  356. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  357. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  358. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  359. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/types.py +0 -0
  360. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/validation.py +0 -0
  361. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/timeouts.py +0 -0
  362. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  363. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/local_state.py +0 -0
  364. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/__init__.py +0 -0
  365. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/config.py +0 -0
  366. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/oauth.py +0 -0
  367. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/service.py +0 -0
  368. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/state.py +0 -0
  369. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/tools.py +0 -0
  370. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/transport.py +0 -0
  371. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/__init__.py +0 -0
  372. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/identity.py +0 -0
  373. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/manager.py +0 -0
  374. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/manifest.py +0 -0
  375. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/markdown.py +0 -0
  376. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/models.py +0 -0
  377. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/protocol.py +0 -0
  378. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/registry.py +0 -0
  379. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/models/__init__.py +0 -0
  380. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  381. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/permissions.py +0 -0
  382. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/runtime.py +0 -0
  383. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/README.md +0 -0
  384. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/__init__.py +0 -0
  385. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  386. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/base.py +0 -0
  387. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/browser.py +0 -0
  388. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/event_loop.py +0 -0
  389. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/filesystem.py +0 -0
  390. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/local.py +0 -0
  391. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/serializer.py +0 -0
  392. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/terminal.py +0 -0
  393. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/utils.py +0 -0
  394. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/scratchpad.py +0 -0
  395. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/security/__init__.py +0 -0
  396. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/security/secrets.py +0 -0
  397. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/base.py +0 -0
  398. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/browser.py +0 -0
  399. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/file_system.py +0 -0
  400. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/html.py +0 -0
  401. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/__init__.py +0 -0
  402. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/client.py +0 -0
  403. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/config.py +0 -0
  404. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/detector.py +0 -0
  405. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  406. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/edits.py +0 -0
  407. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/manager.py +0 -0
  408. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/registry.py +0 -0
  409. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/registry.yaml +0 -0
  410. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/snapshots.py +0 -0
  411. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/terminal.py +0 -0
  412. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/terminal_buffer.py +0 -0
  413. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/workspace_scan.py +0 -0
  414. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/__init__.py +0 -0
  415. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/control.py +0 -0
  416. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/inmemory.py +0 -0
  417. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/projection.py +0 -0
  418. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/recording.py +0 -0
  419. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/runtime.py +0 -0
  420. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/store.py +0 -0
  421. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/testing/__init__.py +0 -0
  422. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/testing/store_conformance.py +0 -0
  423. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/__init__.py +0 -0
  424. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/core.py +0 -0
  425. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/definitions.py +0 -0
  426. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/param_aliases.py +0 -0
  427. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/registry.py +0 -0
  428. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/utils/__init__.py +0 -0
  429. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/utils/images.py +0 -0
  430. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/__init__.py +0 -0
  431. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/fold.js +0 -0
  432. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/player.css +0 -0
  433. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/player.html +0 -0
  434. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/player.js +0 -0
  435. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/bundle.py +0 -0
  436. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/hosting.py +0 -0
  437. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/redaction.py +0 -0
  438. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/server.py +0 -0
  439. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/singlefile.py +0 -0
  440. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/theme_css.py +0 -0
  441. {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,30 @@ 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
+
9
33
  ## 0.28.4 - 2026-08-12
10
34
 
11
35
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.28.4
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.4"
177
+ __version__ = "0.29.0"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.28.4"
54
+ __version__ = "0.29.0"
@@ -1741,6 +1741,7 @@ class BaseAgent(LogMixin):
1741
1741
 
1742
1742
  from kolega_code.llm.client import LLMClient
1743
1743
 
1744
+ endpoint = self.config.custom_endpoint_for(model_config)
1744
1745
  client = LLMClient(
1745
1746
  provider=model_config.provider.value,
1746
1747
  api_key=self.config.get_api_key(model_config.provider) or "",
@@ -1751,6 +1752,8 @@ class BaseAgent(LogMixin):
1751
1752
  token_manager=self.config.get_chatgpt_token_manager(),
1752
1753
  usage_ledger=self.usage_ledger,
1753
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,
1754
1757
  )
1755
1758
  with llm_call_origin(helper_origin("hook_prompt")):
1756
1759
  response = await client.generate(
@@ -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
  )
@@ -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):
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import os
6
7
  from dataclasses import dataclass
7
8
  from pathlib import Path
@@ -10,12 +11,29 @@ from typing import Any, Mapping, NoReturn, Optional
10
11
  from pydantic import ValidationError
11
12
 
12
13
  from kolega_code.auth.tokens import ChatGPTTokenManager, OAuthTokens
13
- from kolega_code.config import AgentConfig, AgentRole, EditProtocol, ModelConfig, ModelProvider, RateLimitConfig
14
+ from kolega_code.config import (
15
+ AgentConfig,
16
+ AgentRole,
17
+ CustomEndpointConfig,
18
+ EditProtocol,
19
+ ModelConfig,
20
+ ModelProvider,
21
+ RateLimitConfig,
22
+ )
14
23
  from kolega_code.llm.specs import MODEL_SPECS, get_model_specs, model_is_known, normalize_thinking_effort
24
+ from kolega_code.llm.specs.custom_endpoints import (
25
+ API_STYLES,
26
+ CUSTOM_PROVIDER_PREFIX,
27
+ CUSTOM_THINKING_PRESETS,
28
+ REASONING_REPLAY_VALUES,
29
+ custom_endpoint_id,
30
+ is_custom_provider,
31
+ sync_custom_endpoint_specs,
32
+ )
15
33
  from kolega_code.mcp.config import load_mcp_config
16
34
  from kolega_code.services.lsp.config import LspConfig
17
35
 
18
- from .provider_registry import default_model_for_provider
36
+ from .provider_registry import default_model_for_provider, rebuild_ui_model_options, set_custom_provider_labels
19
37
  from .settings import (
20
38
  COMPRESSION_THRESHOLD_MAX_PERCENT,
21
39
  COMPRESSION_THRESHOLD_MIN_PERCENT,
@@ -86,6 +104,21 @@ SEARCH_BACKEND_KEY_ENV = {
86
104
  "tavily": "TAVILY_API_KEY",
87
105
  }
88
106
 
107
+ # Custom-endpoint definition layers: full JSON object, or flat fields describing
108
+ # one ephemeral endpoint under the id below. Never persisted to settings.json.
109
+ CUSTOM_ENDPOINTS_ENV = "KOLEGA_CODE_CUSTOM_ENDPOINTS"
110
+ ENDPOINT_URL_ENV = "KOLEGA_CODE_ENDPOINT_URL"
111
+ ENDPOINT_STYLE_ENV = "KOLEGA_CODE_ENDPOINT_STYLE"
112
+ ENDPOINT_API_KEY_ENV = "KOLEGA_CODE_ENDPOINT_API_KEY"
113
+ ENDPOINT_CONTEXT_ENV = "KOLEGA_CODE_ENDPOINT_CONTEXT"
114
+ ENDPOINT_MAX_OUTPUT_ENV = "KOLEGA_CODE_ENDPOINT_MAX_OUTPUT"
115
+ ENDPOINT_VISION_ENV = "KOLEGA_CODE_ENDPOINT_VISION"
116
+ ENDPOINT_THINKING_ENV = "KOLEGA_CODE_ENDPOINT_THINKING"
117
+ ENDPOINT_REASONING_ENV = "KOLEGA_CODE_ENDPOINT_REASONING"
118
+ ENDPOINT_TEMPERATURE_ENV = "KOLEGA_CODE_ENDPOINT_TEMPERATURE"
119
+ CLI_ENDPOINT_ID = "cli"
120
+ CLI_ENDPOINT_PROVIDER = f"{CUSTOM_PROVIDER_PREFIX}{CLI_ENDPOINT_ID}"
121
+
89
122
 
90
123
  class CliConfigError(ValueError):
91
124
  """Raised when CLI configuration is incomplete or invalid."""
@@ -121,6 +154,19 @@ class CliConfigOverrides:
121
154
  # validated as a pair in _strict_context_budget. Never persisted.
122
155
  context_window_tokens: Optional[str] = None
123
156
  max_output_tokens: Optional[str] = None
157
+ # Custom endpoint definition layers. --custom-endpoints carries the full JSON
158
+ # object; the --endpoint-* flags define one ephemeral endpoint "custom:cli".
159
+ # Neither is ever persisted.
160
+ custom_endpoints_json: Optional[str] = None
161
+ endpoint_url: Optional[str] = None
162
+ endpoint_style: Optional[str] = None
163
+ endpoint_api_key: Optional[str] = None
164
+ endpoint_context: Optional[str] = None
165
+ endpoint_max_output: Optional[str] = None
166
+ endpoint_vision: bool = False
167
+ endpoint_thinking: Optional[str] = None
168
+ endpoint_reasoning: Optional[str] = None
169
+ endpoint_temperature: Optional[str] = None
124
170
 
125
171
 
126
172
  def load_cli_env(project_path: Path, env: Optional[Mapping[str, str]] = None) -> dict[str, str]:
@@ -134,6 +180,108 @@ def load_cli_env(project_path: Path, env: Optional[Mapping[str, str]] = None) ->
134
180
  return dict(env if env is not None else os.environ)
135
181
 
136
182
 
183
+ def _parse_endpoints_json(raw: str, source: str) -> dict[str, dict]:
184
+ try:
185
+ parsed = json.loads(raw)
186
+ except json.JSONDecodeError as exc:
187
+ raise CliConfigError(f"{source} must be valid JSON: {exc.msg}") from exc
188
+ if not isinstance(parsed, dict) or not all(
189
+ isinstance(endpoint_id, str) and isinstance(entry, dict) for endpoint_id, entry in parsed.items()
190
+ ):
191
+ raise CliConfigError(f"{source} must be a JSON object of endpoint definitions.")
192
+ return dict(parsed)
193
+
194
+
195
+ def _flat_endpoint_fields(env: Mapping[str, str], overrides: CliConfigOverrides) -> dict[str, str]:
196
+ fields: dict[str, str] = {}
197
+ for name, env_key, value in (
198
+ ("api_style", ENDPOINT_STYLE_ENV, overrides.endpoint_style),
199
+ ("api_key", ENDPOINT_API_KEY_ENV, overrides.endpoint_api_key),
200
+ ("context_length", ENDPOINT_CONTEXT_ENV, overrides.endpoint_context),
201
+ ("max_output_tokens", ENDPOINT_MAX_OUTPUT_ENV, overrides.endpoint_max_output),
202
+ ("thinking", ENDPOINT_THINKING_ENV, overrides.endpoint_thinking),
203
+ ("reasoning_replay", ENDPOINT_REASONING_ENV, overrides.endpoint_reasoning),
204
+ ("temperature", ENDPOINT_TEMPERATURE_ENV, overrides.endpoint_temperature),
205
+ ):
206
+ resolved = value or env.get(env_key)
207
+ if resolved:
208
+ fields[name] = resolved
209
+ return fields
210
+
211
+
212
+ def _cli_endpoint(url: str, env: Mapping[str, str], overrides: CliConfigOverrides) -> dict[str, Any]:
213
+ """Build the ephemeral `custom:cli` endpoint from --endpoint-url and friends."""
214
+ if not url.strip():
215
+ raise CliConfigError("--endpoint-url/KOLEGA_CODE_ENDPOINT_URL must not be empty.")
216
+ if not url.startswith(("http://", "https://")):
217
+ raise CliConfigError(f"--endpoint-url must be an http(s) URL, got '{url}'.")
218
+ flat = _flat_endpoint_fields(env, overrides)
219
+ api_style = flat.get("api_style", "openai_chat")
220
+ if api_style not in API_STYLES:
221
+ raise CliConfigError(f"Unsupported endpoint style '{api_style}'. Valid styles: {', '.join(API_STYLES)}")
222
+ entry: dict[str, Any] = {"api_style": api_style, "base_url": url.rstrip("/")}
223
+ if flat.get("api_key"):
224
+ entry["api_key"] = flat["api_key"]
225
+ for key, flag in (("context_length", "context"), ("max_output_tokens", "max-output")):
226
+ raw = flat.get(key)
227
+ if raw is None:
228
+ continue
229
+ try:
230
+ value = int(raw)
231
+ except ValueError:
232
+ value = 0
233
+ if value <= 0:
234
+ raise CliConfigError(f"--endpoint-{flag} must be a positive integer, got '{raw}'.")
235
+ entry[key] = value
236
+ raw_temperature = flat.get("temperature")
237
+ if raw_temperature is not None:
238
+ try:
239
+ temperature = float(raw_temperature)
240
+ except ValueError:
241
+ temperature = 0.0
242
+ if not (0 < temperature <= 2):
243
+ raise CliConfigError(f"--endpoint-temperature must be between 0 and 2, got '{raw_temperature}'.")
244
+ entry["temperature"] = temperature
245
+ thinking = flat.get("thinking")
246
+ if thinking:
247
+ if thinking not in CUSTOM_THINKING_PRESETS:
248
+ valid = ", ".join(sorted(CUSTOM_THINKING_PRESETS))
249
+ raise CliConfigError(f"Unsupported --endpoint-thinking '{thinking}'. Valid modes: {valid}")
250
+ preset = CUSTOM_THINKING_PRESETS[thinking]
251
+ if preset["budgets_required"]:
252
+ raise CliConfigError(
253
+ f"--endpoint-thinking {thinking} needs per-effort budgets; define it with --custom-endpoints JSON."
254
+ )
255
+ entry["thinking"] = {"mode": thinking, "options": list(preset["options"]), "default": preset["default"]}
256
+ reasoning = flat.get("reasoning_replay")
257
+ if reasoning:
258
+ if reasoning not in REASONING_REPLAY_VALUES:
259
+ valid = ", ".join(REASONING_REPLAY_VALUES)
260
+ raise CliConfigError(f"Unsupported --endpoint-reasoning '{reasoning}'. Valid values: {valid}")
261
+ entry["reasoning_replay"] = reasoning
262
+ if overrides.endpoint_vision or env.get(ENDPOINT_VISION_ENV):
263
+ entry["supports_vision"] = True
264
+ return entry
265
+
266
+
267
+ def _merged_custom_endpoints(
268
+ env: Mapping[str, str],
269
+ overrides: CliConfigOverrides,
270
+ settings: Optional[CliSettings],
271
+ ) -> dict[str, dict]:
272
+ """Custom endpoints from settings.json overlaid with env JSON then flag JSON (per id)."""
273
+ merged: dict[str, dict] = dict(settings.custom_endpoints) if settings else {}
274
+ env_json = env.get(CUSTOM_ENDPOINTS_ENV)
275
+ if env_json:
276
+ merged.update(_parse_endpoints_json(env_json, CUSTOM_ENDPOINTS_ENV))
277
+ if overrides.custom_endpoints_json:
278
+ merged.update(_parse_endpoints_json(overrides.custom_endpoints_json, "--custom-endpoints"))
279
+ endpoint_url = overrides.endpoint_url or env.get(ENDPOINT_URL_ENV)
280
+ if endpoint_url:
281
+ merged[CLI_ENDPOINT_ID] = _cli_endpoint(endpoint_url, env, overrides)
282
+ return merged
283
+
284
+
137
285
  def _provider(value: str) -> ModelProvider:
138
286
  try:
139
287
  return ModelProvider(value.lower())
@@ -197,6 +345,13 @@ def _ensure_explicit_model_supported(
197
345
  provider_source: Optional[str],
198
346
  ) -> None:
199
347
  """Raise a targeted error when an explicit model is paired with the wrong provider."""
348
+ if is_custom_provider(provider) and not model_is_known(provider, model):
349
+ # A custom provider resolves any model only through its endpoint's
350
+ # wildcard; its absence here means the endpoint is not defined.
351
+ raise CliConfigError(
352
+ f"Custom endpoint '{custom_endpoint_id(provider)}' is not defined. Add it under custom_endpoints in "
353
+ "settings.json, or via --custom-endpoints/--endpoint-url for this session."
354
+ )
200
355
  if model_is_known(provider, model):
201
356
  return
202
357
 
@@ -226,7 +381,13 @@ def _api_key_for_provider(
226
381
  provider: ModelProvider,
227
382
  env: Mapping[str, str],
228
383
  settings: Optional[CliSettings],
384
+ custom_endpoints: Optional[Mapping[str, Any]] = None,
229
385
  ) -> Optional[str]:
386
+ endpoint_id = custom_endpoint_id(provider)
387
+ if endpoint_id is not None:
388
+ merged = custom_endpoints or _merged_custom_endpoints(env, CliConfigOverrides(), settings)
389
+ entry = merged.get(endpoint_id) or {}
390
+ return entry.get("api_key") or None
230
391
  env_name = API_KEY_ENV.get(provider)
231
392
  if env_name and env.get(env_name):
232
393
  return env[env_name]
@@ -451,16 +612,20 @@ def _validate_strict_context_budget_limits(
451
612
  )
452
613
 
453
614
 
454
- def _coerce_known_model(provider: ModelProvider, model: Optional[str]) -> str:
615
+ def _coerce_known_model(provider: ModelProvider, model: Optional[str]) -> Optional[str]:
455
616
  """Return ``model`` if it's a known spec for ``provider``, else the default.
456
617
 
457
618
  Guards against a settings.json that points at a model which has since been
458
619
  renamed or removed (e.g. an old ChatGPT slug): without this, config building
459
620
  raises and the TUI disables the composer, locking the user out. Wildcard-
460
- addressed models (Tinker checkpoint paths) count as known and are kept.
621
+ addressed models (Tinker checkpoint paths, custom endpoints) count as known
622
+ and are kept. A custom provider whose endpoint was deleted has no default:
623
+ return None so the caller degrades to unconfigured.
461
624
  """
462
625
  if model and model_is_known(provider, model):
463
626
  return model
627
+ if is_custom_provider(provider):
628
+ return None
464
629
  return default_model_for_provider(provider)
465
630
 
466
631
 
@@ -468,6 +633,7 @@ def _active_provider_model(
468
633
  env: Mapping[str, str],
469
634
  overrides: CliConfigOverrides,
470
635
  settings: Optional[CliSettings],
636
+ default_custom_provider: Optional[str] = None,
471
637
  ) -> tuple[Optional[ModelProvider], Optional[str]]:
472
638
  provider_value, provider_source = _explicit_value(overrides.provider, env, "KOLEGA_CODE_PROVIDER", "--provider")
473
639
  model_value, model_source = _explicit_value(overrides.model, env, "KOLEGA_CODE_MODEL", "--model")
@@ -475,7 +641,11 @@ def _active_provider_model(
475
641
  if provider_value or model_value:
476
642
  if not provider_value:
477
643
  assert model_value is not None
478
- _require_provider_for_model(model_value, model_source, "--provider or KOLEGA_CODE_PROVIDER")
644
+ if default_custom_provider:
645
+ provider_value = default_custom_provider
646
+ provider_source = None
647
+ else:
648
+ _require_provider_for_model(model_value, model_source, "--provider or KOLEGA_CODE_PROVIDER")
479
649
  if not model_value:
480
650
  _require_model_for_provider(provider_value, provider_source, "--model or KOLEGA_CODE_MODEL")
481
651
  provider = _provider(provider_value)
@@ -492,7 +662,10 @@ def _active_provider_model(
492
662
  provider = _provider(settings.active_provider)
493
663
  except CliConfigError:
494
664
  return None, None
495
- return provider, _coerce_known_model(provider, settings.active_model)
665
+ model = _coerce_known_model(provider, settings.active_model)
666
+ if model is None:
667
+ return None, None
668
+ return provider, model
496
669
 
497
670
  return None, None
498
671
 
@@ -506,6 +679,7 @@ def _slot_provider_model(
506
679
  active_provider: ModelProvider,
507
680
  active_model: str,
508
681
  saved: Optional[Mapping[str, str]] = None,
682
+ default_custom_provider: Optional[str] = None,
509
683
  ) -> tuple[ModelProvider, str]:
510
684
  """Resolve one operational slot: CLI flag > env var > saved slot > active model.
511
685
 
@@ -531,7 +705,11 @@ def _slot_provider_model(
531
705
  if provider_value and not model_value:
532
706
  _require_model_for_provider(provider_value, provider_source, f"{model_flag} or {model_env_key}")
533
707
  if model_value and not provider_value:
534
- _require_provider_for_model(model_value, model_source, f"{provider_flag} or {provider_env_key}")
708
+ if default_custom_provider:
709
+ provider_value = default_custom_provider
710
+ provider_source = None
711
+ else:
712
+ _require_provider_for_model(model_value, model_source, f"{provider_flag} or {provider_env_key}")
535
713
 
536
714
  if provider_value:
537
715
  assert model_value is not None
@@ -549,18 +727,42 @@ def _slot_provider_model(
549
727
  if saved_provider and saved_model:
550
728
  provider = _provider(saved_provider)
551
729
  if not model_is_known(provider, saved_model):
730
+ if is_custom_provider(provider):
731
+ # Endpoint deleted from settings: drop the override, inherit the active.
732
+ return active_provider, active_model
552
733
  saved_model = default_model_for_provider(provider)
553
734
  return provider, saved_model
554
735
 
555
736
  return active_provider, active_model
556
737
 
557
738
 
558
- def _model_config(provider: ModelProvider, model: str, thinking_effort: Optional[str] = None) -> ModelConfig:
739
+ def _model_config(
740
+ provider: ModelProvider,
741
+ model: str,
742
+ thinking_effort: Optional[str] = None,
743
+ custom_endpoints: Optional[Mapping[str, Any]] = None,
744
+ ) -> ModelConfig:
745
+ endpoint_id = custom_endpoint_id(provider)
746
+ if endpoint_id is not None and endpoint_id not in (custom_endpoints or {}):
747
+ raise CliConfigError(
748
+ f"Custom endpoint '{endpoint_id}' is not defined. Add it under custom_endpoints in settings.json, "
749
+ "or via --custom-endpoints/--endpoint-url for this session."
750
+ )
559
751
  try:
560
- get_model_specs(provider, model)
752
+ specs = get_model_specs(provider, model)
561
753
  resolved_thinking_effort = normalize_thinking_effort(provider, model, thinking_effort)
562
754
  except ValueError as exc:
563
755
  raise CliConfigError(str(exc)) from exc
756
+ if endpoint_id is not None:
757
+ thinking_spec = specs.get("thinking_effort")
758
+ if thinking_spec is not None and thinking_spec.mode == "anthropic_budget":
759
+ cap = specs["max_completion_tokens"]
760
+ over = [f"{option}={budget}" for option, budget in thinking_spec.budgets.items() if budget >= cap]
761
+ if over:
762
+ raise CliConfigError(
763
+ f"Custom endpoint '{endpoint_id}': anthropic_budget budgets must stay below max_output_tokens "
764
+ f"({cap}); over-limit: {', '.join(over)}."
765
+ )
564
766
 
565
767
  return ModelConfig(
566
768
  provider=provider,
@@ -602,6 +804,7 @@ def _agent_role_env_keys(role: AgentRole) -> tuple[str, str, str]:
602
804
  def _agent_model_overrides(
603
805
  env: Mapping[str, str],
604
806
  settings: Optional[CliSettings],
807
+ custom_endpoints: Optional[Mapping[str, Any]] = None,
605
808
  ) -> dict[str, ModelConfig]:
606
809
  """Resolve per-agent-role model overrides from env vars over saved settings.
607
810
 
@@ -640,8 +843,13 @@ def _agent_model_overrides(
640
843
  provider_source=provider_key if provider_env_value else None,
641
844
  )
642
845
  elif not model_is_known(provider, model_value):
846
+ if is_custom_provider(provider):
847
+ # Endpoint deleted from settings: drop the override, role inherits.
848
+ continue
643
849
  model_value = default_model_for_provider(provider)
644
- overrides[role.value] = _model_config(provider, model_value, thinking_effort=effort_value)
850
+ overrides[role.value] = _model_config(
851
+ provider, model_value, thinking_effort=effort_value, custom_endpoints=custom_endpoints
852
+ )
645
853
  return overrides
646
854
 
647
855
 
@@ -663,7 +871,18 @@ def build_agent_config(
663
871
  if "KOLEGA_CODE_THINKING_TOKENS" in loaded_env:
664
872
  raise CliConfigError(DEPRECATED_THINKING_TOKENS_MESSAGE)
665
873
 
666
- active_provider, active_model = _active_provider_model(loaded_env, overrides, settings)
874
+ if not (overrides.endpoint_url or loaded_env.get(ENDPOINT_URL_ENV)) and (
875
+ _flat_endpoint_fields(loaded_env, overrides) or overrides.endpoint_vision
876
+ ):
877
+ raise CliConfigError("--endpoint-* flags require --endpoint-url or KOLEGA_CODE_ENDPOINT_URL.")
878
+
879
+ merged_endpoints = _merged_custom_endpoints(loaded_env, overrides, settings)
880
+ sync_custom_endpoint_specs(merged_endpoints)
881
+ default_custom_provider = CLI_ENDPOINT_PROVIDER if CLI_ENDPOINT_ID in merged_endpoints else None
882
+
883
+ active_provider, active_model = _active_provider_model(
884
+ loaded_env, overrides, settings, default_custom_provider=default_custom_provider
885
+ )
667
886
  if active_provider is None or active_model is None:
668
887
  raise CliConfigError(MISSING_MODEL_SELECTION_MESSAGE)
669
888
 
@@ -675,6 +894,7 @@ def build_agent_config(
675
894
  overrides.model,
676
895
  active_provider,
677
896
  active_model,
897
+ default_custom_provider=default_custom_provider,
678
898
  )
679
899
  fast_provider, fast_model = _slot_provider_model(
680
900
  loaded_env,
@@ -694,7 +914,7 @@ def build_agent_config(
694
914
  settings,
695
915
  )
696
916
 
697
- agent_model_overrides = _agent_model_overrides(loaded_env, settings)
917
+ agent_model_overrides = _agent_model_overrides(loaded_env, settings, custom_endpoints=merged_endpoints)
698
918
  web_search_backend, web_search_api_key, web_search_base_url = _search_config(loaded_env, settings)
699
919
  web_search_mode = _web_search_mode(loaded_env, settings, overrides.web_search_mode)
700
920
  compression_threshold = _compression_threshold(loaded_env, settings, overrides.compression_threshold)
@@ -709,12 +929,13 @@ def build_agent_config(
709
929
 
710
930
  required_providers = {long_provider, fast_provider}
711
931
  required_providers.update(override.provider for override in agent_model_overrides.values())
712
- # API-key providers: env/settings key required. OAuth and local providers are
713
- # exempt (OAuth is checked via stored tokens below; LLAMA is keyless).
932
+ # API-key providers: env/settings key required. OAuth, local, and custom
933
+ # endpoint providers are exempt (endpoint keys are optional).
714
934
  missing_keys = [
715
935
  API_KEY_ENV[provider]
716
936
  for provider in sorted(required_providers, key=lambda item: item.value)
717
937
  if provider != ModelProvider.LLAMA
938
+ and not is_custom_provider(provider)
718
939
  and provider not in OAUTH_PROVIDERS
719
940
  and not _api_key_for_provider(provider, loaded_env, settings)
720
941
  ]
@@ -752,9 +973,15 @@ def build_agent_config(
752
973
  thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
753
974
  environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
754
975
  edit_protocol=edit_protocol,
755
- long_context_config=_model_config(long_provider, long_model, thinking_effort=active_thinking_effort),
756
- fast_config=_model_config(fast_provider, fast_model),
976
+ long_context_config=_model_config(
977
+ long_provider, long_model, thinking_effort=active_thinking_effort, custom_endpoints=merged_endpoints
978
+ ),
979
+ fast_config=_model_config(fast_provider, fast_model, custom_endpoints=merged_endpoints),
757
980
  agent_models=agent_model_overrides,
981
+ custom_endpoints={
982
+ endpoint_id: CustomEndpointConfig.model_validate(entry)
983
+ for endpoint_id, entry in merged_endpoints.items()
984
+ },
758
985
  web_search_mode=web_search_mode,
759
986
  web_search_backend=web_search_backend,
760
987
  web_search_api_key=web_search_api_key,
@@ -790,6 +1017,13 @@ def build_agent_config(
790
1017
  # to settings.json (only possible when a store is supplied by the caller).
791
1018
  if chatgpt_tokens is not None and settings is not None and settings_store is not None:
792
1019
  config.attach_chatgpt_token_manager(_build_chatgpt_token_manager(chatgpt_tokens, settings, settings_store))
1020
+
1021
+ # Keep the UI picker registry in sync with the endpoints resolved for this
1022
+ # process (includes env/flag-defined ones for the session).
1023
+ set_custom_provider_labels(
1024
+ {endpoint_id: endpoint.label or endpoint_id for endpoint_id, endpoint in config.custom_endpoints.items()}
1025
+ )
1026
+ rebuild_ui_model_options()
793
1027
  return config
794
1028
 
795
1029
 
@@ -798,6 +1032,19 @@ def key_status(provider: str, project_path: Path, settings: Optional[CliSettings
798
1032
  provider_value = _provider(provider)
799
1033
  if provider_value == ModelProvider.LLAMA:
800
1034
  return "not required for the local provider"
1035
+ endpoint_id = custom_endpoint_id(provider_value)
1036
+ if endpoint_id is not None:
1037
+ env = load_cli_env(project_path)
1038
+ merged = _merged_custom_endpoints(env, CliConfigOverrides(), settings)
1039
+ entry = merged.get(endpoint_id) or {}
1040
+ if endpoint_id not in merged:
1041
+ return "endpoint not defined"
1042
+ if entry.get("api_key"):
1043
+ saved_entry = (settings.custom_endpoints if settings else {}).get(endpoint_id) or {}
1044
+ if saved_entry.get("api_key") == entry["api_key"]:
1045
+ return "present in local settings"
1046
+ return "present via environment override"
1047
+ return "key not set (optional)"
801
1048
  if provider_value in OAUTH_PROVIDERS:
802
1049
  if settings and settings.has_oauth_token(provider_value.value):
803
1050
  token = settings.get_oauth_token(provider_value.value) or {}
@@ -842,6 +1089,14 @@ def active_model_override_message(
842
1089
  """Describe an explicit CLI/process-env active-model override, if one is in effect."""
843
1090
  overrides = overrides or CliConfigOverrides()
844
1091
  loaded_env = load_cli_env(project_path, env)
1092
+ endpoint_override = any(
1093
+ (
1094
+ overrides.custom_endpoints_json,
1095
+ overrides.endpoint_url,
1096
+ loaded_env.get(CUSTOM_ENDPOINTS_ENV),
1097
+ loaded_env.get(ENDPOINT_URL_ENV),
1098
+ )
1099
+ )
845
1100
  explicit_active_override = any(
846
1101
  (
847
1102
  overrides.provider,
@@ -850,14 +1105,18 @@ def active_model_override_message(
850
1105
  loaded_env.get("KOLEGA_CODE_MODEL"),
851
1106
  )
852
1107
  )
853
- if not explicit_active_override:
1108
+ if not explicit_active_override and not endpoint_override:
854
1109
  return None
855
1110
  if not settings or not (settings.active_provider and settings.active_model):
1111
+ if endpoint_override and is_custom_provider(config.long_context_config.provider):
1112
+ return "CLI/environment-defined custom endpoints apply to this session."
856
1113
  return None
857
1114
 
858
1115
  effective_provider = config.long_context_config.provider.value
859
1116
  effective_model = config.long_context_config.model
860
1117
  if settings.active_provider == effective_provider and settings.active_model == effective_model:
1118
+ if endpoint_override and is_custom_provider(config.long_context_config.provider):
1119
+ return "CLI/environment-defined custom endpoints apply to this session."
861
1120
  return None
862
1121
 
863
1122
  return (