kolega-code 0.29.0__tar.gz → 0.30.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 (444) hide show
  1. {kolega_code-0.29.0 → kolega_code-0.30.0}/CHANGELOG.md +38 -0
  2. {kolega_code-0.29.0 → kolega_code-0.30.0}/PKG-INFO +1 -1
  3. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/baseagent.py +36 -12
  6. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/agent_tool.py +1 -1
  7. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tools.py +0 -6
  8. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/config.py +11 -2
  9. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/main.py +75 -14
  10. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/model_catalog.py +5 -2
  11. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/provider_registry.py +9 -2
  12. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/slash_commands.py +1 -1
  13. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/theme.py +18 -18
  14. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/agent_runtime.py +21 -0
  15. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/command_handlers.py +15 -1
  16. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/settings_panel.py +7 -2
  17. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/config.py +5 -0
  18. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/client.py +18 -24
  19. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/exceptions.py +59 -28
  20. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/models.py +89 -25
  21. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/anthropic.py +5 -5
  22. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/deepseek_responses.py +5 -6
  23. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/models.py +3 -0
  24. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/openai.py +4 -2
  25. kolega_code-0.30.0/kolega_code/llm/providers/perplexity_responses.py +107 -0
  26. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/responses_common.py +98 -4
  27. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/__init__.py +3 -0
  28. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/deepseek.py +5 -4
  29. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/google.py +13 -0
  30. kolega_code-0.30.0/kolega_code/llm/specs/catalog/perplexity_agent.py +616 -0
  31. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/xai.py +12 -0
  32. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/zai.py +12 -0
  33. kolega_code-0.30.0/kolega_code/llm/specs/perplexity_catalog.py +267 -0
  34. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/thinking.py +1 -11
  35. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/usage.py +1 -0
  36. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/config.py +49 -7
  37. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/service.py +103 -3
  38. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/tools.py +29 -12
  39. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/async_filesystem.py +0 -3
  40. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/filesystem.py +0 -3
  41. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/serializer.py +4 -13
  42. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/terminal.py +10 -72
  43. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/utils.py +0 -4
  44. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/file_system.py +1 -4
  45. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/html.py +0 -19
  46. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/manager.py +5 -5
  47. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/registry.py +0 -1
  48. {kolega_code-0.29.0 → kolega_code-0.30.0}/pyproject.toml +1 -1
  49. {kolega_code-0.29.0 → kolega_code-0.30.0}/.gitignore +0 -0
  50. {kolega_code-0.29.0 → kolega_code-0.30.0}/CONTRIBUTING.md +0 -0
  51. {kolega_code-0.29.0 → kolega_code-0.30.0}/LICENSE +0 -0
  52. {kolega_code-0.29.0 → kolega_code-0.30.0}/MIGRATION.md +0 -0
  53. {kolega_code-0.29.0 → kolega_code-0.30.0}/README.md +0 -0
  54. {kolega_code-0.29.0 → kolega_code-0.30.0}/RELEASING.md +0 -0
  55. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  56. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  57. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  58. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  59. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  60. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  61. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  62. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  63. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  64. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  65. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  66. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  67. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  68. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  69. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  70. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  71. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  72. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  73. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  74. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  75. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  76. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  77. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  78. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  79. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  80. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  81. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  82. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  83. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  84. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  85. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  86. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  87. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  88. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  89. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  90. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  91. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  92. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  93. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  94. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  95. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  96. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  97. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  98. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  99. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  100. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  101. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  102. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  103. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  104. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  105. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  106. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  107. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/browseragent.py +0 -0
  108. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/coder.py +0 -0
  109. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/common.py +0 -0
  110. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/compression.py +0 -0
  111. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/context.py +0 -0
  112. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/conversation.py +0 -0
  113. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/custom_agents.py +0 -0
  114. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/edit_protocols.py +0 -0
  115. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/errors.py +0 -0
  116. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/__init__.py +0 -0
  117. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/bridge.py +0 -0
  118. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  119. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  120. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/env.py +0 -0
  121. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  122. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/kernel.py +0 -0
  123. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/prelude.js +0 -0
  124. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/prelude.py +0 -0
  125. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/protocol.py +0 -0
  126. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  127. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/runner.js +0 -0
  128. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/runner.py +0 -0
  129. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/generalagent.py +0 -0
  130. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/goal.py +0 -0
  131. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/investigationagent.py +0 -0
  132. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/model_routing.py +0 -0
  133. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  134. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  135. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/budget.py +0 -0
  136. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/context.py +0 -0
  137. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/errors.py +0 -0
  138. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/executor.py +0 -0
  139. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/guide.py +0 -0
  140. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/journal.py +0 -0
  141. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  142. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/types.py +0 -0
  143. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/planningagent.py +0 -0
  144. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_dump.py +0 -0
  145. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_overrides.py +0 -0
  146. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_provider.py +0 -0
  147. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  148. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  149. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  150. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  151. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  152. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  153. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  154. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  155. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  156. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  157. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  158. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  159. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  160. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  161. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  162. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  163. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  164. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  165. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  166. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  167. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  168. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  169. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  170. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  171. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  172. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  173. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  174. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  175. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  176. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  177. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  178. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  179. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  180. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  181. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  182. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  183. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  184. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  185. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  186. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  187. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  188. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  189. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  190. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  191. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  192. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  193. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  194. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  195. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  196. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  197. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  198. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  199. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  200. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  201. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  202. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  203. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  204. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  205. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  206. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  207. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  208. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  209. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  210. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  211. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  212. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  213. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  214. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  215. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  216. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  217. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  218. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  219. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  220. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  221. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  222. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  223. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  224. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  225. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  226. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  227. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  228. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  229. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  230. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  231. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  232. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  233. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  234. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  235. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  236. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  237. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  238. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  239. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  240. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  241. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompts.py +0 -0
  242. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  243. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  244. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  245. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  246. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  247. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  248. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  249. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  250. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  251. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  252. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  253. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  254. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  255. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  256. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  257. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  258. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  259. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  260. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  261. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  262. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  263. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  264. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  265. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  266. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  267. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  268. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  269. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  270. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  271. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  272. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  273. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  274. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  275. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_definitions.py +0 -0
  276. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/utils/commands.py +0 -0
  277. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/volatile_context.py +0 -0
  278. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/__init__.py +0 -0
  279. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/_jwt.py +0 -0
  280. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  281. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/constants.py +0 -0
  282. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/tokens.py +0 -0
  283. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/__init__.py +0 -0
  284. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/framing.py +0 -0
  285. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/installer.py +0 -0
  286. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/manager.py +0 -0
  287. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/multiplex.py +0 -0
  288. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/native_host.py +0 -0
  289. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/protocol.py +0 -0
  290. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/registry.py +0 -0
  291. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/runtime.py +0 -0
  292. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/__init__.py +0 -0
  293. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/app.py +0 -0
  294. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/ask_output.py +0 -0
  295. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/atif_export.py +0 -0
  296. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/browser_backend.py +0 -0
  297. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/clipboard_image.py +0 -0
  298. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/connection.py +0 -0
  299. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/cron.py +0 -0
  300. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/diagnostics.py +0 -0
  301. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/file_index.py +0 -0
  302. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/goal.py +0 -0
  303. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/loop.py +0 -0
  304. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/mentions.py +0 -0
  305. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/messages.py +0 -0
  306. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/model_connection.py +0 -0
  307. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/plan_artifacts.py +0 -0
  308. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_event_protocol.py +0 -0
  309. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_event_store.py +0 -0
  310. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_journal.py +0 -0
  311. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_store.py +0 -0
  312. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_usage.py +0 -0
  313. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/settings.py +0 -0
  314. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/skills.py +0 -0
  315. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/__init__.py +0 -0
  316. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/app_base.py +0 -0
  317. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  318. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/constants.py +0 -0
  319. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/custom_model.py +0 -0
  320. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  321. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  322. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  323. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/pacing.py +0 -0
  324. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  325. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/session_diff.py +0 -0
  326. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/settings_screen.py +0 -0
  327. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/state.py +0 -0
  328. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  329. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/styles.tcss +0 -0
  330. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  331. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  332. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/transcript.py +0 -0
  333. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/widgets.py +0 -0
  334. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/updater.py +0 -0
  335. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/events.py +0 -0
  336. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/extensions.py +0 -0
  337. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/git_env.py +0 -0
  338. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/__init__.py +0 -0
  339. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/backends.py +0 -0
  340. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/config.py +0 -0
  341. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/dispatcher.py +0 -0
  342. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/events.py +0 -0
  343. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/matcher.py +0 -0
  344. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/outcome.py +0 -0
  345. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/instrumented_client.py +0 -0
  346. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/ledger.py +0 -0
  347. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/__init__.py +0 -0
  348. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  349. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/base.py +0 -0
  350. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  351. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/google.py +0 -0
  352. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  353. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/tinker.py +0 -0
  354. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  355. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/ratelimit.py +0 -0
  356. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/__init__.py +0 -0
  357. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/accessors.py +0 -0
  358. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  359. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  360. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  361. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  362. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  363. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  364. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  365. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  366. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  367. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  368. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  369. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  370. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  371. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  372. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  373. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  374. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/types.py +0 -0
  375. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/validation.py +0 -0
  376. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/timeouts.py +0 -0
  377. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  378. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/local_state.py +0 -0
  379. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/__init__.py +0 -0
  380. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/oauth.py +0 -0
  381. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/state.py +0 -0
  382. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/transport.py +0 -0
  383. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/__init__.py +0 -0
  384. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/identity.py +0 -0
  385. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/manager.py +0 -0
  386. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/manifest.py +0 -0
  387. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/markdown.py +0 -0
  388. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/models.py +0 -0
  389. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/protocol.py +0 -0
  390. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/registry.py +0 -0
  391. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/models/__init__.py +0 -0
  392. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  393. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/permissions.py +0 -0
  394. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/runtime.py +0 -0
  395. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/README.md +0 -0
  396. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/__init__.py +0 -0
  397. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/base.py +0 -0
  398. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/browser.py +0 -0
  399. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/event_loop.py +0 -0
  400. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/local.py +0 -0
  401. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/scratchpad.py +0 -0
  402. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/security/__init__.py +0 -0
  403. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/security/secrets.py +0 -0
  404. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/base.py +0 -0
  405. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/browser.py +0 -0
  406. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/__init__.py +0 -0
  407. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/client.py +0 -0
  408. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/config.py +0 -0
  409. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/detector.py +0 -0
  410. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  411. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/edits.py +0 -0
  412. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/registry.yaml +0 -0
  413. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/snapshots.py +0 -0
  414. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/terminal.py +0 -0
  415. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/terminal_buffer.py +0 -0
  416. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/workspace_scan.py +0 -0
  417. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/__init__.py +0 -0
  418. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/control.py +0 -0
  419. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/inmemory.py +0 -0
  420. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/projection.py +0 -0
  421. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/recording.py +0 -0
  422. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/runtime.py +0 -0
  423. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/store.py +0 -0
  424. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/testing/__init__.py +0 -0
  425. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/testing/store_conformance.py +0 -0
  426. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/__init__.py +0 -0
  427. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/core.py +0 -0
  428. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/definitions.py +0 -0
  429. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/param_aliases.py +0 -0
  430. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/registry.py +0 -0
  431. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/utils/__init__.py +0 -0
  432. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/utils/images.py +0 -0
  433. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/__init__.py +0 -0
  434. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/fold.js +0 -0
  435. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/player.css +0 -0
  436. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/player.html +0 -0
  437. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/player.js +0 -0
  438. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/bundle.py +0 -0
  439. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/hosting.py +0 -0
  440. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/redaction.py +0 -0
  441. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/server.py +0 -0
  442. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/singlefile.py +0 -0
  443. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/theme_css.py +0 -0
  444. {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,44 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.30.0 - 2026-08-14
10
+
11
+ ### Added
12
+
13
+ - Added Google Gemini 3.7 Flash (`gemini-3.7-flash`): 1M-token context, 64K
14
+ output, vision and function calling, and `low`/`medium`/`high` thinking
15
+ levels. It omits Google's deprecated temperature parameter and is now the
16
+ default Google model.
17
+ - DeepSeek V4-Pro now routes to the Responses API by default (joining V4-Flash),
18
+ removing the model-name carve-out. Both DeepSeek models support `none`, `low`,
19
+ `high`, and `max` reasoning effort (`low` is new; `none` disables reasoning).
20
+ Hosted web search is now available on V4-Pro as well as V4-Flash.
21
+ - Added support for xAI Grok 4.6 (`grok-4.6`): 500K-token context, vision input,
22
+ and `low`/`medium`/`high`/`xhigh` reasoning effort. Selectable in the Settings
23
+ UI, `/model` picker, CLI flags, and env vars.
24
+ - Added support for Z.AI GLM-5.3 (`glm-5.3`) on the GLM Coding Plan provider:
25
+ 1M-token context, 128K max output, and `high`/`max` thinking effort. GLM-5.3
26
+ is now the Z.AI default model.
27
+ - Added the Perplexity Agent API provider (`perplexity_agent`): one
28
+ `PERPLEXITY_API_KEY` reaches OpenAI, Anthropic, Google, xAI, and Perplexity
29
+ models through Perplexity's Responses-compatible Agent API, with optional
30
+ hosted search tools.
31
+ - `/plan` accepts an optional prompt: `/plan <task>` switches to plan mode and
32
+ starts that planning turn. Bare `/plan` still only switches mode.
33
+
34
+ ### Fixed
35
+
36
+ - Google Gemini models no longer reject builtin tool calls with a 400 about
37
+ `additionalProperties` in function-declaration schemas.
38
+ - Quitting the TUI no longer waits up to 30s for an unresponsive language
39
+ server to acknowledge shutdown.
40
+ - The Z.AI context-window gauge now counts tokens locally (Z.AI's count
41
+ endpoint reports 0 for GLM-5.3) and residual usage calibrates from
42
+ multi-provider response billing.
43
+ - MCP tools whose names contain invalid characters or exceed provider length
44
+ limits are sanitized at collection time, and provider 400 details are shown
45
+ in the turn error instead of a generic failure.
46
+
9
47
  ## 0.29.0 - 2026-08-13
10
48
 
11
49
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.29.0
3
+ Version: 0.30.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/
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.29.0"
177
+ __version__ = "0.30.0"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.29.0"
54
+ __version__ = "0.30.0"
@@ -521,6 +521,8 @@ class BaseAgent(LogMixin):
521
521
  # gate reads client_web_tools_enabled, the stream call reads
522
522
  # hosted_web_search_active.
523
523
  self.supports_hosted_web_search = bool(model_specs.get("supports_hosted_web_search", False))
524
+ # Spec-declared server-side tools; _apply_web_search_state derives the live list.
525
+ self._model_server_tools: List[str] = [str(tool) for tool in model_specs.get("server_tools") or []]
524
526
  self.web_search_mode = getattr(self.config, "web_search_mode", "auto") or "auto"
525
527
  self._apply_web_search_state()
526
528
 
@@ -731,22 +733,27 @@ class BaseAgent(LogMixin):
731
733
  initialize()
732
734
 
733
735
  def _apply_web_search_state(self) -> None:
734
- """Resolve web_search_mode + model capability into the two live gates.
736
+ """Resolve web_search_mode + model capability into the live gates.
735
737
 
736
738
  ``hosted_web_search_active`` — request the provider's server-side
737
739
  web_search tool on main-loop stream calls. ``client_web_tools_enabled``
738
740
  — register the client-side web_search/web_fetch tools (read by the
739
- ToolCollection gate). Hosted active always excludes the client tools:
740
- two search paths confuse the model and waste schema tokens.
741
+ ToolCollection gate). ``server_tools`` — the spec-declared server-side
742
+ tools (e.g. the Perplexity Agent API's). One setting gates all of it:
743
+ auto/hosted request the server-side tooling, client defers to the
744
+ client-side web tools, off disables web tooling entirely. Active
745
+ server-side web tooling always excludes the client tools: two search
746
+ paths confuse the model and waste schema tokens.
741
747
  """
742
748
  mode = (self.web_search_mode or "auto").lower()
743
749
  supported = self.supports_hosted_web_search
750
+ server_web_tooling = supported or "web_search" in self._model_server_tools
744
751
  if mode == "off":
745
752
  hosted, client = False, False
746
753
  elif mode == "client":
747
754
  hosted, client = False, True
748
755
  elif mode == "hosted":
749
- if not supported:
756
+ if not server_web_tooling:
750
757
  provider = self.primary_model_config.provider
751
758
  logger.warning(
752
759
  "web_search_mode=hosted, but %s/%s has no hosted web search; falling back to the client tools",
@@ -758,6 +765,9 @@ class BaseAgent(LogMixin):
758
765
  hosted, client = supported, not supported
759
766
  self.hosted_web_search_active = hosted
760
767
  self.client_web_tools_enabled = client
768
+ self.server_tools = list(self._model_server_tools) if mode in ("auto", "hosted") else []
769
+ if "web_search" in self.server_tools:
770
+ self.client_web_tools_enabled = False
761
771
 
762
772
  def apply_web_search_mode(self, mode: str) -> None:
763
773
  """Change the web tool mode mid-session (TUI ``/web-search``).
@@ -770,31 +780,36 @@ class BaseAgent(LogMixin):
770
780
  self._apply_web_search_state()
771
781
 
772
782
  async def _emit_hosted_tool_call(self, delta: Dict[str, Any]) -> None:
773
- """Render a completed hosted web_search call as a tool_call/tool_result pair.
783
+ """Render a completed hosted/server-side tool call as a tool_call/tool_result pair.
774
784
 
775
785
  The call executed on the provider's servers; there is no local tool
776
- invocation and the searched content never reaches the client (it is
777
- injected into the model's context server-side). The shared item id
778
- correlates the pair in every transcript consumer.
786
+ invocation. For OpenAI/DeepSeek web_search the searched content never
787
+ reaches the client (it is injected into the model's context
788
+ server-side); Perplexity Agent API result items (search_results /
789
+ fetch_url_results) carry their results client-side via the delta's
790
+ item_type/payload. The shared item id correlates the pair in every
791
+ transcript consumer.
779
792
  """
780
793
  block = WebSearchCallBlock(
781
794
  item_id=delta.get("id") or None,
782
795
  status=delta.get("status"),
783
796
  action=delta.get("action") or {},
797
+ item_type=str(delta.get("item_type") or "web_search_call"),
798
+ payload=delta.get("payload"),
784
799
  )
785
800
  tool_call_id = block.item_id or str(uuid.uuid4())
786
801
  await self.send_chat_message(
787
802
  message_type="tool_call",
788
- content=f"Calling {WebSearchCallBlock.TOOL_LABEL}: {block.label()}",
803
+ content=f"Calling {block.tool_label}: {block.label()}",
789
804
  is_streaming=False,
790
- tool_description=WebSearchCallBlock.TOOL_LABEL,
805
+ tool_description=block.tool_label,
791
806
  tool_call_id=tool_call_id,
792
807
  )
793
808
  await self.send_chat_message(
794
809
  message_type="tool_result",
795
810
  content=block.result_summary(),
796
811
  is_streaming=False,
797
- tool_description=WebSearchCallBlock.TOOL_LABEL,
812
+ tool_description=block.tool_label,
798
813
  tool_call_id=tool_call_id,
799
814
  )
800
815
 
@@ -1130,7 +1145,15 @@ class BaseAgent(LogMixin):
1130
1145
  if new_calls:
1131
1146
  self._context_residual_tokens += self.HOSTED_SEARCH_PROVISIONAL_TOKENS * new_calls
1132
1147
  return
1133
- billed = (assistant_message.usage_metadata or {}).get("prompt_tokens")
1148
+ billed = (
1149
+ assistant_message.usage.input_tokens
1150
+ if assistant_message.usage and assistant_message.usage.reported
1151
+ else (
1152
+ (assistant_message.usage_metadata or {}).get("prompt_tokens")
1153
+ or (assistant_message.usage_metadata or {}).get("input_tokens")
1154
+ or (assistant_message.usage_metadata or {}).get("prompt_token_count")
1155
+ )
1156
+ )
1134
1157
  counted = self._last_raw_context_count
1135
1158
  if not isinstance(billed, int) or counted is None:
1136
1159
  return
@@ -2488,6 +2511,7 @@ class BaseAgent(LogMixin):
2488
2511
  tools=self.tool_collection.get_tool_list(),
2489
2512
  thinking=self.primary_model_config.thinking_effort,
2490
2513
  hosted_web_search=self.hosted_web_search_active,
2514
+ server_tools=self.server_tools or None,
2491
2515
  # The strict per-run budget rechecks this request inside
2492
2516
  # the client; hand it the count already taken for the
2493
2517
  # gauge (same history) so it is not counted twice.
@@ -399,7 +399,7 @@ class AgentTool(BaseTool):
399
399
  agent.session_recorder = scoped_recorder
400
400
 
401
401
  # Track messages and their sequence
402
- last_saved_index = -1 # Track what we've already saved
402
+ last_saved_index = -1
403
403
  streamed_messages = {} # Track messages by UUID for assembly
404
404
 
405
405
  # Process the task and stream messages
@@ -302,16 +302,13 @@ class ToolCollection(LogMixin):
302
302
  self.workspace_id = workspace_id
303
303
  self.thread_id = thread_id
304
304
 
305
- # Convert string path to Path object if needed
306
305
  self.project_path = Path(project_path) if isinstance(project_path, str) else project_path
307
306
 
308
- # Create filesystem instance if not provided
309
307
  if filesystem is None:
310
308
  self.filesystem = LocalFileSystem(root_path=self.project_path)
311
309
  else:
312
310
  self.filesystem = filesystem
313
311
 
314
- # Create terminal manager instance if not provided
315
312
  if terminal_manager is None:
316
313
  self.terminal_manager = LocalTerminalManager(
317
314
  workspace_id, thread_id, connection_manager, default_workdir=self.project_path
@@ -319,7 +316,6 @@ class ToolCollection(LogMixin):
319
316
  else:
320
317
  self.terminal_manager = terminal_manager
321
318
 
322
- # Create browser manager instance if not provided
323
319
  if browser_manager is None:
324
320
  self.browser_manager = PlaywrightBrowserManager()
325
321
  else:
@@ -388,7 +384,6 @@ class ToolCollection(LogMixin):
388
384
  }
389
385
  self.tool_exclusions.extend(tool_config.tool_exclusions)
390
386
 
391
- # Initialize tool backends
392
387
  self._initialize_tools()
393
388
  self._register_tool_extensions()
394
389
 
@@ -619,7 +614,6 @@ class ToolCollection(LogMixin):
619
614
  browser_manager=self.browser_manager,
620
615
  )
621
616
 
622
- # Build tool
623
617
  self.build_tool = BuildTool(
624
618
  self.project_path,
625
619
  self.workspace_id,
@@ -74,6 +74,7 @@ API_KEY_ENV = {
74
74
  ModelProvider.THINKING_MACHINES: "TINKER_API_KEY",
75
75
  # Native Tinker sampling authenticates with the same key.
76
76
  ModelProvider.TINKER: "TINKER_API_KEY",
77
+ ModelProvider.PERPLEXITY_AGENT: "PERPLEXITY_API_KEY",
77
78
  }
78
79
 
79
80
  DEFAULT_WEB_SEARCH_BACKEND = "duckduckgo"
@@ -780,13 +781,20 @@ def _resolve_active_thinking_effort(
780
781
  settings: Optional[CliSettings],
781
782
  ) -> Optional[str]:
782
783
  explicit_effort = overrides.thinking_effort or env.get("KOLEGA_CODE_THINKING_EFFORT")
784
+ saved_effort: Optional[str] = None
783
785
  if explicit_effort is None and settings:
784
786
  settings_model_matches = settings.active_provider == provider.value and settings.active_model == model
785
787
  if settings_model_matches:
786
- explicit_effort = settings.active_thinking_effort
788
+ saved_effort = settings.active_thinking_effort
787
789
  try:
788
- return normalize_thinking_effort(provider, model, explicit_effort)
790
+ return normalize_thinking_effort(
791
+ provider, model, explicit_effort if explicit_effort is not None else saved_effort
792
+ )
789
793
  except ValueError as exc:
794
+ if saved_effort is not None and explicit_effort is None:
795
+ # A saved effort can outlive a catalog change; fall back to the default
796
+ # instead of locking startup. Explicit requests still error.
797
+ return normalize_thinking_effort(provider, model, None)
790
798
  raise CliConfigError(str(exc)) from exc
791
799
 
792
800
 
@@ -971,6 +979,7 @@ def build_agent_config(
971
979
  ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
972
980
  openrouter_api_key=_api_key_for_provider(ModelProvider.OPENROUTER, loaded_env, settings),
973
981
  thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
982
+ perplexity_api_key=_api_key_for_provider(ModelProvider.PERPLEXITY_AGENT, loaded_env, settings),
974
983
  environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
975
984
  edit_protocol=edit_protocol,
976
985
  long_context_config=_model_config(
@@ -48,17 +48,24 @@ from kolega_code.hooks import HookDispatcher, HookEvent, load_hook_config
48
48
  from kolega_code.llm.exceptions import LLMBillingError, billing_error_message
49
49
  from kolega_code.llm.models import Message, TextBlock
50
50
  from kolega_code.mcp.config import (
51
+ _SERVER_ID_MAX_LENGTH,
52
+ LoadedMCPConfig,
51
53
  MCPConfigError,
52
54
  MCPServerConfig,
53
55
  global_mcp_config_path,
54
56
  load_mcp_config,
55
57
  project_mcp_config_path,
56
58
  remove_server_config,
59
+ sanitize_mcp_server_id,
57
60
  server_fingerprint,
58
61
  set_server_enabled,
59
62
  upsert_server_config,
60
63
  )
61
- from kolega_code.mcp.service import MCP_FAILURE_MESSAGE_GENERIC, MCPService
64
+ from kolega_code.mcp.service import (
65
+ MCP_FAILURE_MESSAGE_GENERIC,
66
+ MCPService,
67
+ mcp_tool_name_adjustment_note,
68
+ )
62
69
  from kolega_code.mcp.tools import build_mcp_tool_extension
63
70
  from kolega_code.agent.prompt_provider import AgentMode
64
71
  from kolega_code.permissions import (
@@ -1606,6 +1613,8 @@ async def _run_ask(args: argparse.Namespace) -> int:
1606
1613
  )
1607
1614
  if mcp_extension is not None:
1608
1615
  tool_extensions.append(mcp_extension)
1616
+ if mcp_config is not None:
1617
+ _print_mcp_tool_name_warnings(mcp_config, settings_store.root, project_path)
1609
1618
  extension_bundle = None
1610
1619
  if extension_selection is not None:
1611
1620
  extension_host = KolegaExtensionHost(
@@ -2335,6 +2344,8 @@ async def _run_mcp(args: argparse.Namespace) -> int:
2335
2344
  return 0
2336
2345
 
2337
2346
  if args.mcp_command == "verify":
2347
+ if getattr(args, "server_id", None):
2348
+ args.server_id = sanitize_mcp_server_id(args.server_id)
2338
2349
  server_ids = _mcp_verify_server_ids(args, config)
2339
2350
  if not server_ids:
2340
2351
  raise ValueError("No MCP servers to verify.")
@@ -2366,33 +2377,41 @@ async def _run_mcp(args: argparse.Namespace) -> int:
2366
2377
  except MCPConfigError as exc:
2367
2378
  raise ValueError(str(exc)) from exc
2368
2379
  print(f"Saved MCP server {server.id} to {path}")
2380
+ if args.server_id.strip() != server.id:
2381
+ print(
2382
+ f"mcp: server id '{args.server_id}' exceeds {_SERVER_ID_MAX_LENGTH} characters; "
2383
+ f"saved as '{server.id}'.",
2384
+ file=sys.stderr,
2385
+ )
2369
2386
  if source == "project" and not settings.is_mcp_project_trusted(project_path):
2370
2387
  print("Project MCP config is not trusted yet. Re-run with --trust-mcp to enable it.", file=sys.stderr)
2371
2388
  return 0
2372
2389
 
2373
2390
  if args.mcp_command == "remove":
2374
2391
  path, source = _mcp_mutation_target(args, project_path, settings_store.root)
2392
+ server_id = sanitize_mcp_server_id(args.server_id)
2375
2393
  try:
2376
- removed = remove_server_config(path, args.server_id, source=source)
2394
+ removed = remove_server_config(path, server_id, source=source)
2377
2395
  except MCPConfigError as exc:
2378
2396
  raise ValueError(str(exc)) from exc
2379
2397
  if not removed:
2380
- raise ValueError(f"MCP server not found in {path}: {args.server_id}")
2381
- service.status_store.clear(args.server_id)
2382
- service.oauth_store.clear(args.server_id)
2383
- print(f"Removed MCP server {args.server_id} from {path}")
2398
+ raise ValueError(f"MCP server not found in {path}: {server_id}")
2399
+ service.status_store.clear(server_id)
2400
+ service.oauth_store.clear(server_id)
2401
+ print(f"Removed MCP server {server_id} from {path}")
2384
2402
  return 0
2385
2403
 
2386
2404
  if args.mcp_command in {"enable", "disable"}:
2387
2405
  path, source = _mcp_mutation_target(args, project_path, settings_store.root)
2388
2406
  enabled = args.mcp_command == "enable"
2407
+ server_id = sanitize_mcp_server_id(args.server_id)
2389
2408
  try:
2390
- changed = set_server_enabled(path, args.server_id, enabled, source=source)
2409
+ changed = set_server_enabled(path, server_id, enabled, source=source)
2391
2410
  except MCPConfigError as exc:
2392
2411
  raise ValueError(str(exc)) from exc
2393
2412
  if not changed:
2394
- raise ValueError(f"MCP server not found in {path}: {args.server_id}")
2395
- print(f"{'Enabled' if enabled else 'Disabled'} MCP server {args.server_id} in {path}")
2413
+ raise ValueError(f"MCP server not found in {path}: {server_id}")
2414
+ print(f"{'Enabled' if enabled else 'Disabled'} MCP server {server_id} in {path}")
2396
2415
  return 0
2397
2416
 
2398
2417
  raise ValueError(f"Unknown mcp command: {args.mcp_command}")
@@ -2411,21 +2430,41 @@ def _print_mcp_list(config, service: MCPService) -> None:
2411
2430
  return
2412
2431
  print("ID\tSOURCE\tTRANSPORT\tENABLED\tOAUTH\tSTATUS\tTOOLS\tMESSAGE")
2413
2432
  for server in config.servers.values():
2414
- status_text, tool_count, message = _mcp_cli_status_parts(server, service)
2433
+ status_text, tool_count, message, _ = _mcp_cli_status_parts(server, service)
2415
2434
  print(
2416
2435
  f"{server.id}\t{server.source}\t{server.transport}\t{server.enabled}\t{server.oauth.enabled}\t"
2417
2436
  f"{status_text}\t{tool_count}\t{message}"
2418
2437
  )
2419
2438
 
2420
2439
 
2421
- def _mcp_cli_status_parts(server: MCPServerConfig, service: MCPService) -> tuple[str, int, str]:
2440
+ def _print_mcp_tool_name_warnings(config: LoadedMCPConfig, state_dir: Path, project_path: Path) -> None:
2441
+ """Warn on stderr when verified MCP tools get provider-adjusted wire names.
2442
+
2443
+ Mirrors the ``mcp: {diagnostic}`` startup output: the model-facing names are
2444
+ sanitized, and silently renaming them would be confusing.
2445
+ """
2446
+ service = MCPService(config, state_dir=state_dir, project_path=project_path)
2447
+ for server in config.enabled_servers:
2448
+ status = service.server_status(server)
2449
+ if not status or status.status != "verified":
2450
+ continue
2451
+ if status.fingerprint != server_fingerprint(server):
2452
+ continue
2453
+ note = mcp_tool_name_adjustment_note(server.id, status.tools)
2454
+ if note:
2455
+ print(f"mcp: warning: server '{server.id}': {note}", file=sys.stderr)
2456
+
2457
+
2458
+ def _mcp_cli_status_parts(server: MCPServerConfig, service: MCPService) -> tuple[str, int, str, str]:
2422
2459
  status = service.server_status(server)
2423
2460
  current_fingerprint = server_fingerprint(server)
2424
2461
  verified = bool(status and status.status == "verified" and status.fingerprint == current_fingerprint)
2425
2462
  stale = bool(status and status.fingerprint and status.fingerprint != current_fingerprint)
2463
+ note = ""
2426
2464
  if verified and status:
2427
2465
  status_text = "verified"
2428
2466
  tool_count = status.tool_count
2467
+ note = mcp_tool_name_adjustment_note(server.id, status.tools)
2429
2468
  elif stale:
2430
2469
  status_text = "stale"
2431
2470
  tool_count = 0
@@ -2435,12 +2474,13 @@ def _mcp_cli_status_parts(server: MCPServerConfig, service: MCPService) -> tuple
2435
2474
  else:
2436
2475
  status_text = "unverified"
2437
2476
  tool_count = 0
2438
- return status_text, tool_count, _mcp_cli_list_message(status_text, tool_count)
2477
+ return status_text, tool_count, _mcp_cli_list_message(status_text, tool_count, note), note
2439
2478
 
2440
2479
 
2441
- def _mcp_cli_list_message(status: str, tool_count: int) -> str:
2480
+ def _mcp_cli_list_message(status: str, tool_count: int, note: str = "") -> str:
2442
2481
  if status == "verified":
2443
- return f"Verified {tool_count} tool(s)."
2482
+ message = f"Verified {tool_count} tool(s)."
2483
+ return f"{message} {note}" if note else message
2444
2484
  if status == "stale":
2445
2485
  return "Configuration changed since last verification. Verify again."
2446
2486
  if status == "failed":
@@ -2586,6 +2626,27 @@ def _run_doctor(args: argparse.Namespace) -> int:
2586
2626
  line("Long model", f"{summary['long_provider']}/{summary['long_model']}")
2587
2627
  line("Fast model", f"{summary['fast_provider']}/{summary['fast_model']}")
2588
2628
  line("Thinking effort", summary["thinking_effort"])
2629
+
2630
+ # MCP servers: offline status from config + local verification state (no network).
2631
+ mcp_config = load_mcp_config(
2632
+ project_path, settings_store.root, project_trusted=settings.is_mcp_project_trusted(project_path)
2633
+ )
2634
+ mcp_service = MCPService(mcp_config, state_dir=settings_store.root, project_path=project_path)
2635
+ for diagnostic in mcp_config.diagnostics:
2636
+ print(f"mcp: {diagnostic}", file=sys.stderr)
2637
+ if not mcp_config.servers:
2638
+ line("MCP servers", "none configured", "muted")
2639
+ for server in mcp_config.servers.values():
2640
+ status_text, tool_count, _, note = _mcp_cli_status_parts(server, mcp_service)
2641
+ status_style = "success" if status_text == "verified" else ("error" if status_text == "failed" else "muted")
2642
+ line(
2643
+ f"MCP {server.id}",
2644
+ f"{server.transport} · {'enabled' if server.enabled else 'disabled'} · {status_text} · "
2645
+ f"{tool_count} tool(s)",
2646
+ status_style,
2647
+ )
2648
+ if note:
2649
+ line(f"MCP {server.id} tool names", f"{note} See `kolega-code mcp list` for detail.", "warning")
2589
2650
  return 0
2590
2651
 
2591
2652
 
@@ -23,19 +23,22 @@ from kolega_code.config import ModelProvider
23
23
  from kolega_code.llm.specs import MODEL_SPECS, is_featured_model
24
24
  from kolega_code.llm.specs import ollama_cloud_catalog as ollama_cloud
25
25
  from kolega_code.llm.specs import openrouter_catalog as openrouter
26
+ from kolega_code.llm.specs import perplexity_catalog as perplexity
26
27
  from kolega_code.llm.specs import tinker_catalog as tinker
27
28
  from kolega_code.llm.specs.validation import validate_model_spec
28
29
 
29
30
  from .provider_registry import PROVIDER_LABELS, get_ui_model, rebuild_ui_model_options
30
31
  from .session_store import default_state_dir
31
32
 
32
- # Overlay sources keyed by provider value. Each module exposes PROVIDER,
33
+ # Overlay sources keyed by provider value. Each entry exposes PROVIDER,
33
34
  # MODELS_URL, CACHE_FILENAME, fetch_models(), catalog_entries(), load_cache()
34
- # and save_cache().
35
+ # and save_cache(). The Perplexity entry is a duck-typed catalog object rather
36
+ # than a module — same contract.
35
37
  OVERLAY_SOURCES = {
36
38
  ollama_cloud.PROVIDER: ollama_cloud,
37
39
  openrouter.PROVIDER: openrouter,
38
40
  tinker.PROVIDER: tinker,
41
+ perplexity.AGENT_PROVIDER: perplexity.AGENT_CATALOG,
39
42
  }
40
43
 
41
44
  # Capture the release snapshot before startup applies any runtime caches.
@@ -45,6 +45,7 @@ PROVIDER_LABELS: dict[ModelProvider, str] = {
45
45
  ModelProvider.OPENROUTER: "OpenRouter",
46
46
  ModelProvider.THINKING_MACHINES: "Thinking Machines",
47
47
  ModelProvider.TINKER: "Tinker",
48
+ ModelProvider.PERPLEXITY_AGENT: "Perplexity Agent API",
48
49
  }
49
50
 
50
51
  # Friendly display names for models. Anything not listed falls back to its raw
@@ -64,6 +65,7 @@ MODEL_LABELS: dict[str, str] = {
64
65
  "deepseek-v4-pro": "DeepSeek V4 Pro",
65
66
  "deepseek-v4-flash": "DeepSeek V4 Flash",
66
67
  # Z.AI (GLM Coding Plan)
68
+ "glm-5.3": "GLM-5.3",
67
69
  "glm-5.2": "GLM-5.2",
68
70
  "glm-5.1": "GLM-5.1",
69
71
  # Anthropic
@@ -86,11 +88,13 @@ MODEL_LABELS: dict[str, str] = {
86
88
  "gpt-5.4-mini": "GPT-5.4 Mini",
87
89
  "gpt-5.3-codex-spark": "GPT-5.3 Codex Spark",
88
90
  # Google
91
+ "gemini-3.7-flash": "Gemini 3.7 Flash",
89
92
  "gemini-3.6-flash": "Gemini 3.6 Flash",
90
93
  "gemini-3.5-flash-lite": "Gemini 3.5 Flash-Lite",
91
94
  "gemini-3.1-pro-preview": "Gemini 3.1 Pro",
92
95
  "gemini-3.5-flash": "Gemini 3.5 Flash",
93
96
  # xAI
97
+ "grok-4.6": "Grok 4.6",
94
98
  "grok-4.5": "Grok 4.5",
95
99
  "grok-4.3": "Grok 4.3",
96
100
  "grok-build-0.1": "Grok Build 0.1",
@@ -148,12 +152,12 @@ MODEL_LABELS: dict[str, str] = {
148
152
  PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
149
153
  ModelProvider.MOONSHOT: "kimi-k3",
150
154
  ModelProvider.DEEPSEEK: "deepseek-v4-pro",
151
- ModelProvider.ZAI: "glm-5.2",
155
+ ModelProvider.ZAI: "glm-5.3",
152
156
  ModelProvider.KIMI_CODING: "kimi-for-coding",
153
157
  ModelProvider.ANTHROPIC: "claude-opus-5",
154
158
  ModelProvider.OPENAI: "gpt-5.6-sol",
155
159
  ModelProvider.OPENAI_CHATGPT: "gpt-5.6-sol",
156
- ModelProvider.GOOGLE: "gemini-3.1-pro-preview",
160
+ ModelProvider.GOOGLE: "gemini-3.7-flash",
157
161
  ModelProvider.XAI: "grok-4.5",
158
162
  ModelProvider.FIREWORKS: "accounts/fireworks/models/glm-5p2",
159
163
  ModelProvider.TOGETHER: "moonshotai/Kimi-K2.7-Code",
@@ -166,6 +170,7 @@ PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
166
170
  # Cheap and renderable without the optional tinker-inkling extra, so the
167
171
  # provider works out of the box for anyone who installs the base extras.
168
172
  ModelProvider.TINKER: "Qwen/Qwen3-8B",
173
+ ModelProvider.PERPLEXITY_AGENT: "openai/gpt-5.6-sol",
169
174
  }
170
175
 
171
176
  UI_DEFAULT_PROVIDER = ModelProvider.MOONSHOT.value
@@ -209,6 +214,8 @@ def _api_key_env(provider: ModelProvider) -> str:
209
214
  return "TINKER_API_KEY"
210
215
  if provider == ModelProvider.TINKER:
211
216
  return "TINKER_API_KEY"
217
+ if provider == ModelProvider.PERPLEXITY_AGENT:
218
+ return "PERPLEXITY_API_KEY"
212
219
  return f"{provider.value.upper()}_API_KEY"
213
220
 
214
221
 
@@ -52,7 +52,7 @@ TUI_COMMAND_ENTRIES: tuple[SlashCommandEntry, ...] = (
52
52
  ),
53
53
  SlashCommandEntry("detach", "Remove pending image attachments", CommandScope.TUI),
54
54
  SlashCommandEntry("init", "Create or update AGENTS.md for this repository", CommandScope.TUI),
55
- SlashCommandEntry("plan", "Switch to plan mode", CommandScope.TUI),
55
+ SlashCommandEntry("plan", "Switch to plan mode, optionally with a planning prompt", CommandScope.TUI),
56
56
  SlashCommandEntry("build", "Switch to build mode", CommandScope.TUI),
57
57
  SlashCommandEntry("sidebar", "Show or hide the side panel", CommandScope.TUI),
58
58
  SlashCommandEntry("settings", "Open Settings", CommandScope.TUI),
@@ -36,24 +36,24 @@ class Color:
36
36
  class Glyph:
37
37
  """Unicode glyphs used in the UI. Use g() to apply ASCII fallbacks."""
38
38
 
39
- USER = "❯" # ❯
40
- AGENT = "●" # ●
41
- STATUS = "●" # ●
42
- TOOL = "⏺" # ⏺
43
- SUB_AGENT = "◆" # ◆
44
- PLAN = "◆" # ◆
39
+ USER = "❯"
40
+ AGENT = "●"
41
+ STATUS = "●"
42
+ TOOL = "⏺"
43
+ SUB_AGENT = "◆"
44
+ PLAN = "◆"
45
45
  QUESTION = "?"
46
- INSET_BAR = "│" # │
47
- INSET_ELBOW = "└" # └
48
- ELLIPSIS = "…" # …
49
- BULLET_SEP = "·" # ·
50
- BAR_FILLED = "█" # █
51
- BAR_EMPTY = "░" # ░
52
- CHECK = "✓" # ✓
53
- CROSS = "✗" # ✗
54
- DOWN = "↓" # ↓
55
- PENDING = "○" # ○ — phase not started
56
- RUNNING = "▶" # ▶ — phase in progress
46
+ INSET_BAR = "│"
47
+ INSET_ELBOW = "└"
48
+ ELLIPSIS = "…"
49
+ BULLET_SEP = "·"
50
+ BAR_FILLED = "█"
51
+ BAR_EMPTY = "░"
52
+ CHECK = "✓"
53
+ CROSS = "✗"
54
+ DOWN = "↓"
55
+ PENDING = "○" # phase not started
56
+ RUNNING = "▶" # phase in progress
57
57
 
58
58
 
59
59
  ASCII_FALLBACKS = {
@@ -74,7 +74,7 @@ ASCII_FALLBACKS = {
74
74
  Glyph.RUNNING: ">",
75
75
  }
76
76
 
77
- SPINNER_FRAMES = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏" # ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏
77
+ SPINNER_FRAMES = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
78
78
  SPINNER_FRAMES_ASCII = "|/-\\"
79
79
  SPINNER_INTERVAL = 0.25
80
80
 
@@ -34,6 +34,8 @@ from kolega_code.agent.prompts import (
34
34
  from kolega_code.hooks import HookDispatcher, HookEvent, load_hook_config, project_hooks_present
35
35
  from kolega_code.scratchpad import SCRATCHPAD_PROMPT_EXTENSION_ID, ensure_scratchpad_dir, scratchpad_dir_for
36
36
  from kolega_code.llm.exceptions import LLMError, llm_error_message
37
+ from kolega_code.mcp.config import LoadedMCPConfig, server_fingerprint
38
+ from kolega_code.mcp.service import MCPService, mcp_tool_name_adjustment_note
37
39
  from kolega_code.mcp.tools import build_mcp_tool_extension
38
40
  from kolega_code.permissions import PermissionDecision
39
41
  from kolega_code.session.runtime import deserialize_permission_request
@@ -966,6 +968,23 @@ class AgentRuntimeMixin(tui_app_base.KolegaAppBase):
966
968
  if self._scheduled_loop is not None and self._scheduled_loop.is_active:
967
969
  self._request_loop_stop(messages.LOOP_STOPPED_BY_USER.format(iterations=self._scheduled_loop.iterations))
968
970
 
971
+ def _log_mcp_tool_name_warnings(self, mcp_config: LoadedMCPConfig) -> None:
972
+ """Warn in the log pane when verified MCP tools get provider-adjusted wire names.
973
+
974
+ Mirrors the ``mcp: {diagnostic}`` startup warnings: the model-facing names
975
+ are sanitized, and silently renaming them would be confusing.
976
+ """
977
+ service = MCPService(mcp_config, state_dir=self.settings_store.root, project_path=self.active_project_path)
978
+ for server in mcp_config.enabled_servers:
979
+ status = service.server_status(server)
980
+ if not status or status.status != "verified":
981
+ continue
982
+ if status.fingerprint != server_fingerprint(server):
983
+ continue
984
+ note = mcp_tool_name_adjustment_note(server.id, status.tools)
985
+ if note:
986
+ self._log_status(f"mcp: warning: server '{server.id}': {note}", level="warn")
987
+
969
988
  async def _ensure_agent_from_settings(self, rebuild: bool = False) -> None:
970
989
  try:
971
990
  config = build_agent_config(
@@ -1186,6 +1205,8 @@ class AgentRuntimeMixin(tui_app_base.KolegaAppBase):
1186
1205
  )
1187
1206
  if mcp_extension is not None:
1188
1207
  tool_extensions.append(mcp_extension)
1208
+ if mcp_config is not None and self.active_project_path == self.project_path:
1209
+ self._log_mcp_tool_name_warnings(mcp_config)
1189
1210
 
1190
1211
  # gigacode applies to any top-level agent and is carried across rebuilds.
1191
1212
  # In plan mode the orchestrating agent is read-only, so its workflow