kolega-code 0.16.0__tar.gz → 0.17.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 (517) hide show
  1. {kolega_code-0.16.0 → kolega_code-0.17.0}/.env.example +6 -0
  2. {kolega_code-0.16.0 → kolega_code-0.17.0}/.github/workflows/ci.yml +5 -1
  3. {kolega_code-0.16.0 → kolega_code-0.17.0}/.github/workflows/release.yml +3 -0
  4. {kolega_code-0.16.0 → kolega_code-0.17.0}/CHANGELOG.md +42 -0
  5. {kolega_code-0.16.0 → kolega_code-0.17.0}/PKG-INFO +4 -1
  6. {kolega_code-0.16.0 → kolega_code-0.17.0}/RELEASING.md +2 -2
  7. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/assets/coverage.svg +1 -1
  8. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/concepts/tools.md +19 -5
  9. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/environment-variables.md +24 -0
  10. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/providers-and-models.mdx +10 -0
  11. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/settings-and-api-keys.mdx +4 -0
  12. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/__init__.py +1 -1
  13. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/__init__.py +1 -1
  14. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/browseragent.py +15 -0
  15. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +9 -0
  16. kolega_code-0.17.0/kolega_code/agent/tool_backend/browser_tool.py +395 -0
  17. kolega_code-0.17.0/kolega_code/agent/tool_backend/glob_tool.py +533 -0
  18. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_codebase_tool.py +245 -40
  19. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch/__init__.py +1 -0
  20. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch/answering.py +213 -0
  21. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch/documents.py +58 -0
  22. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch/extractors.py +255 -0
  23. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch/pipeline.py +217 -0
  24. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch/retrieval.py +276 -0
  25. kolega_code-0.17.0/kolega_code/agent/tool_backend/web_fetch_tool.py +234 -0
  26. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tools.py +206 -224
  27. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/app.py +2 -0
  28. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/messages.py +12 -0
  29. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/provider_registry.py +8 -2
  30. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/theme.py +1 -1
  31. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/agent_runtime.py +7 -0
  32. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/settings_panel.py +95 -1
  33. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/state.py +2 -2
  34. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/styles.tcss +30 -1
  35. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/transcript.py +35 -47
  36. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/widgets.py +20 -5
  37. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/models.py +7 -0
  38. kolega_code-0.17.0/kolega_code/services/base.py +199 -0
  39. kolega_code-0.17.0/kolega_code/services/browser.py +911 -0
  40. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/detector.py +60 -66
  41. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/manager.py +14 -0
  42. kolega_code-0.17.0/kolega_code/services/workspace_scan.py +244 -0
  43. {kolega_code-0.16.0 → kolega_code-0.17.0}/pyproject.toml +4 -1
  44. {kolega_code-0.16.0 → kolega_code-0.17.0}/scripts/bench_hotpaths.py +5 -5
  45. kolega_code-0.17.0/scripts/bench_web_fetch.py +90 -0
  46. kolega_code-0.17.0/tests/agent/services/test_browser_console_logs.py +129 -0
  47. kolega_code-0.17.0/tests/agent/services/test_browser_content.py +130 -0
  48. kolega_code-0.17.0/tests/agent/services/test_browser_integration.py +36 -0
  49. kolega_code-0.17.0/tests/agent/services/test_browser_parity.py +117 -0
  50. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_agent_tools_inventory.py +82 -9
  51. kolega_code-0.17.0/tests/agent/tool_backend/test_browser_tool.py +167 -0
  52. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_glob_tool.py +79 -2
  53. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_glob_tool_sandbox_parity.py +1 -1
  54. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_search_codebase_tool.py +78 -0
  55. kolega_code-0.17.0/tests/agent/tool_backend/test_web_fetch_answering.py +73 -0
  56. kolega_code-0.17.0/tests/agent/tool_backend/test_web_fetch_pipeline.py +260 -0
  57. kolega_code-0.17.0/tests/agent/tool_backend/test_web_fetch_tool.py +187 -0
  58. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_bootstrap_settings.py +89 -0
  59. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_lsp_settings_status.py +25 -0
  60. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_entries.py +95 -0
  61. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_selection.py +6 -6
  62. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_tools.py +111 -0
  63. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_provider_registry.py +10 -0
  64. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_transcript_streaming_render.py +21 -14
  65. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_detector.py +21 -0
  66. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_manager.py +14 -0
  67. kolega_code-0.17.0/tests/services/test_workspace_scan.py +116 -0
  68. {kolega_code-0.16.0 → kolega_code-0.17.0}/uv.lock +579 -10
  69. kolega_code-0.16.0/kolega_code/agent/tool_backend/browser_tool.py +0 -271
  70. kolega_code-0.16.0/kolega_code/agent/tool_backend/glob_tool.py +0 -325
  71. kolega_code-0.16.0/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -204
  72. kolega_code-0.16.0/kolega_code/services/base.py +0 -233
  73. kolega_code-0.16.0/kolega_code/services/browser.py +0 -446
  74. kolega_code-0.16.0/tests/agent/services/test_browser_console_logs.py +0 -314
  75. kolega_code-0.16.0/tests/agent/services/test_browser_content.py +0 -94
  76. kolega_code-0.16.0/tests/agent/services/test_browser_integration.py +0 -120
  77. kolega_code-0.16.0/tests/agent/services/test_browser_parity.py +0 -355
  78. kolega_code-0.16.0/tests/agent/tool_backend/test_browser_tool.py +0 -335
  79. kolega_code-0.16.0/tests/agent/tool_backend/test_web_fetch_tool.py +0 -217
  80. {kolega_code-0.16.0 → kolega_code-0.17.0}/.githooks/pre-commit +0 -0
  81. {kolega_code-0.16.0 → kolega_code-0.17.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  82. {kolega_code-0.16.0 → kolega_code-0.17.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  83. {kolega_code-0.16.0 → kolega_code-0.17.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  84. {kolega_code-0.16.0 → kolega_code-0.17.0}/.github/workflows/docs.yml +0 -0
  85. {kolega_code-0.16.0 → kolega_code-0.17.0}/.gitignore +0 -0
  86. {kolega_code-0.16.0 → kolega_code-0.17.0}/.pre-commit-config.yaml +0 -0
  87. {kolega_code-0.16.0 → kolega_code-0.17.0}/CONTRIBUTING.md +0 -0
  88. {kolega_code-0.16.0 → kolega_code-0.17.0}/LICENSE +0 -0
  89. {kolega_code-0.16.0 → kolega_code-0.17.0}/README.md +0 -0
  90. {kolega_code-0.16.0 → kolega_code-0.17.0}/SECURITY.md +0 -0
  91. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/.gitignore +0 -0
  92. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/README.md +0 -0
  93. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/astro.config.mjs +0 -0
  94. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/package-lock.json +0 -0
  95. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/package.json +0 -0
  96. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/public/favicon.svg +0 -0
  97. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/assets/demo.gif +0 -0
  98. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/assets/kolega-dark.svg +0 -0
  99. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/assets/kolega-light.svg +0 -0
  100. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/cli/ask.md +0 -0
  101. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/cli/doctor.md +0 -0
  102. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/cli/overview.md +0 -0
  103. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/cli/sessions.md +0 -0
  104. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/concepts/agents.md +0 -0
  105. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/concepts/how-it-works.md +0 -0
  106. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/lsp.md +0 -0
  107. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/mcp.md +0 -0
  108. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/prompt-overrides.md +0 -0
  109. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/configuration/sign-in-with-chatgpt.mdx +0 -0
  110. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/getting-started/installation.mdx +0 -0
  111. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/getting-started/quick-start.mdx +0 -0
  112. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/gigacode.mdx +0 -0
  113. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/goal.md +0 -0
  114. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/hooks.md +0 -0
  115. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/index.mdx +0 -0
  116. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/skills.mdx +0 -0
  117. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/troubleshooting/diagnostics.md +0 -0
  118. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/troubleshooting/terminal-tmux.md +0 -0
  119. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/tui/composer.md +0 -0
  120. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/tui/interface.md +0 -0
  121. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/tui/modes.md +0 -0
  122. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/tui/sessions-and-resume.md +0 -0
  123. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content/docs/tui/slash-commands.md +0 -0
  124. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/content.config.ts +0 -0
  125. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/src/styles/brand.css +0 -0
  126. {kolega_code-0.16.0 → kolega_code-0.17.0}/docs/tsconfig.json +0 -0
  127. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/baseagent.py +0 -0
  128. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/coder.py +0 -0
  129. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/common.py +0 -0
  130. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/compression.py +0 -0
  131. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/context.py +0 -0
  132. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/conversation.py +0 -0
  133. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/errors.py +0 -0
  134. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/generalagent.py +0 -0
  135. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/goal.py +0 -0
  136. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/investigationagent.py +0 -0
  137. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  138. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/budget.py +0 -0
  139. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/errors.py +0 -0
  140. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/executor.py +0 -0
  141. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/guide.py +0 -0
  142. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/journal.py +0 -0
  143. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  144. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/orchestration/types.py +0 -0
  145. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/planningagent.py +0 -0
  146. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_dump.py +0 -0
  147. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_overrides.py +0 -0
  148. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_provider.py +0 -0
  149. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  150. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  151. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  152. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  153. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
  154. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  155. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  156. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  157. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  158. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  159. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  160. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  161. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  162. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  163. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  164. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  165. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  166. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  167. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  168. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  169. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  170. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  171. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/prompts.py +0 -0
  172. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  173. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  174. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  175. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  176. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  177. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
  178. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  179. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  180. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  181. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  182. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  183. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  184. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  185. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  186. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  187. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  188. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  189. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  190. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  191. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  192. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  193. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
  194. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  195. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  196. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/agent/utils/commands.py +0 -0
  197. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/auth/__init__.py +0 -0
  198. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/auth/_jwt.py +0 -0
  199. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  200. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/auth/constants.py +0 -0
  201. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/auth/tokens.py +0 -0
  202. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/__init__.py +0 -0
  203. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/clipboard_image.py +0 -0
  204. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/config.py +0 -0
  205. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/connection.py +0 -0
  206. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/diagnostics.py +0 -0
  207. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/file_index.py +0 -0
  208. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/goal.py +0 -0
  209. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/main.py +0 -0
  210. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/mentions.py +0 -0
  211. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/plan_artifacts.py +0 -0
  212. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/session_store.py +0 -0
  213. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/settings.py +0 -0
  214. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/skills.py +0 -0
  215. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/slash_commands.py +0 -0
  216. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/__init__.py +0 -0
  217. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/app_base.py +0 -0
  218. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  219. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  220. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/constants.py +0 -0
  221. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  222. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/session_diff.py +0 -0
  223. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  224. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  225. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  226. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/cli/updater.py +0 -0
  227. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/config.py +0 -0
  228. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/events.py +0 -0
  229. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/__init__.py +0 -0
  230. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/backends.py +0 -0
  231. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/config.py +0 -0
  232. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/dispatcher.py +0 -0
  233. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/events.py +0 -0
  234. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/matcher.py +0 -0
  235. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/hooks/outcome.py +0 -0
  236. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/client.py +0 -0
  237. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/exceptions.py +0 -0
  238. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/instrumented_client.py +0 -0
  239. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/__init__.py +0 -0
  240. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/anthropic.py +0 -0
  241. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/base.py +0 -0
  242. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  243. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/google.py +0 -0
  244. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/models.py +0 -0
  245. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/openai.py +0 -0
  246. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  247. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/providers/responses_common.py +0 -0
  248. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/ratelimit.py +0 -0
  249. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/__init__.py +0 -0
  250. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/accessors.py +0 -0
  251. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  252. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  253. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  254. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  255. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  256. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  257. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  258. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  259. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  260. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  261. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  262. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  263. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  264. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  265. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/thinking.py +0 -0
  266. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/specs/types.py +0 -0
  267. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/timeouts.py +0 -0
  268. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  269. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/local_state.py +0 -0
  270. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/__init__.py +0 -0
  271. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/config.py +0 -0
  272. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/oauth.py +0 -0
  273. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/service.py +0 -0
  274. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/state.py +0 -0
  275. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/tools.py +0 -0
  276. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/mcp/transport.py +0 -0
  277. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/models/__init__.py +0 -0
  278. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  279. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/permissions.py +0 -0
  280. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/runtime.py +0 -0
  281. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/README.md +0 -0
  282. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/__init__.py +0 -0
  283. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  284. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/base.py +0 -0
  285. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/browser.py +0 -0
  286. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/event_loop.py +0 -0
  287. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/filesystem.py +0 -0
  288. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/local.py +0 -0
  289. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/serializer.py +0 -0
  290. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/terminal.py +0 -0
  291. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/sandbox/utils.py +0 -0
  292. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/file_system.py +0 -0
  293. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/html.py +0 -0
  294. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/__init__.py +0 -0
  295. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/client.py +0 -0
  296. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/config.py +0 -0
  297. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  298. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/edits.py +0 -0
  299. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/registry.py +0 -0
  300. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/lsp/registry.yaml +0 -0
  301. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/snapshots.py +0 -0
  302. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/terminal.py +0 -0
  303. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/services/terminal_buffer.py +0 -0
  304. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/tools/__init__.py +0 -0
  305. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/tools/core.py +0 -0
  306. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/tools/definitions.py +0 -0
  307. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/tools/registry.py +0 -0
  308. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/utils/__init__.py +0 -0
  309. {kolega_code-0.16.0 → kolega_code-0.17.0}/kolega_code/utils/images.py +0 -0
  310. {kolega_code-0.16.0 → kolega_code-0.17.0}/run_tests.sh +0 -0
  311. {kolega_code-0.16.0 → kolega_code-0.17.0}/scripts/check-dev-hooks.sh +0 -0
  312. {kolega_code-0.16.0 → kolega_code-0.17.0}/scripts/install-kolega-code.sh +0 -0
  313. {kolega_code-0.16.0 → kolega_code-0.17.0}/scripts/setup-dev.sh +0 -0
  314. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/__init__.py +0 -0
  315. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/__init__.py +0 -0
  316. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/compaction_helpers.py +0 -0
  317. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/conftest.py +0 -0
  318. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/__init__.py +0 -0
  319. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/_token_counting_utils.py +0 -0
  320. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_anthropic_local_token_counting_incremental.py +0 -0
  321. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_anthropic_token_counting.py +0 -0
  322. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_billing_openai_cache.py +0 -0
  323. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_chatgpt_live.py +0 -0
  324. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_chatgpt_oauth_auth_config.py +0 -0
  325. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_chatgpt_oauth_conversion.py +0 -0
  326. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_chatgpt_oauth_provider.py +0 -0
  327. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_chatgpt_oauth_provider_generate.py +0 -0
  328. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_chatgpt_oauth_streaming.py +0 -0
  329. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_client.py +0 -0
  330. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_client_live.py +0 -0
  331. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_client_runtime.py +0 -0
  332. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_dashscope_mapping.py +0 -0
  333. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_error_boundary.py +0 -0
  334. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_exceptions.py +0 -0
  335. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_google_thought_signature.py +0 -0
  336. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_google_tool_signature_live.py +0 -0
  337. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_instrumented_client.py +0 -0
  338. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_instrumented_client_integration.py +0 -0
  339. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_instrumented_client_stream.py +0 -0
  340. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_langfuse_normalization.py +0 -0
  341. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_live_providers.py +0 -0
  342. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_message_conversion.py +0 -0
  343. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_model_specs.py +0 -0
  344. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_cached_tokens.py +0 -0
  345. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_cached_tokens_stream.py +0 -0
  346. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_message_conversion.py +0 -0
  347. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_reasoning_replay.py +0 -0
  348. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_responses_provider.py +0 -0
  349. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_stream_accumulation.py +0 -0
  350. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_token_counting.py +0 -0
  351. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_openai_token_counting_incremental.py +0 -0
  352. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_provider_usage_mapping.py +0 -0
  353. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_streaming_timeouts.py +0 -0
  354. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_supports_vision.py +0 -0
  355. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_thinking_effort.py +0 -0
  356. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_tool_execution_ids.py +0 -0
  357. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/llm/test_xai_prompt_cache_header.py +0 -0
  358. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/orchestration/__init__.py +0 -0
  359. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/orchestration/test_orchestration.py +0 -0
  360. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/__init__.py +0 -0
  361. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_browser.py +0 -0
  362. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_file_system.py +0 -0
  363. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_file_system_integration.py +0 -0
  364. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_file_system_path.py +0 -0
  365. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_local_file_system.py +0 -0
  366. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_sandbox_terminal_input.py +0 -0
  367. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_terminal.py +0 -0
  368. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_terminal_buffer.py +0 -0
  369. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/services/test_terminal_state_serializer.py +0 -0
  370. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent.py +0 -0
  371. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_anthropic_history_validation.py +0 -0
  372. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_compaction.py +0 -0
  373. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_effective_history.py +0 -0
  374. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_history_serialization.py +0 -0
  375. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_prompt_context.py +0 -0
  376. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_role_overrides.py +0 -0
  377. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_runtime.py +0 -0
  378. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_tool_call_repair.py +0 -0
  379. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_tool_call_repair_integration.py +0 -0
  380. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_base_agent_tool_execution.py +0 -0
  381. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_coder_attachments.py +0 -0
  382. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_coder_prompt_extensions.py +0 -0
  383. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_commands.py +0 -0
  384. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_compaction_integration.py +0 -0
  385. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_compaction_persistence.py +0 -0
  386. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_compaction_subagent.py +0 -0
  387. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_compaction_tui_events.py +0 -0
  388. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_compress_command.py +0 -0
  389. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_compression.py +0 -0
  390. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_conversation_compaction.py +0 -0
  391. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_duplicate_tool_results.py +0 -0
  392. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_empty_message_handling.py +0 -0
  393. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_event_emitter.py +0 -0
  394. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_general_agent.py +0 -0
  395. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_gigacode_gating.py +0 -0
  396. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_goal.py +0 -0
  397. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_goal_evaluate.py +0 -0
  398. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_history_adapter_thinking.py +0 -0
  399. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_history_image_blocks.py +0 -0
  400. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_hooks_integration.py +0 -0
  401. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_html.py +0 -0
  402. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_image_compat.py +0 -0
  403. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_parallel_tool_calls.py +0 -0
  404. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_permissions.py +0 -0
  405. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_planning_agent.py +0 -0
  406. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_prompt_dump.py +0 -0
  407. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_prompt_overrides.py +0 -0
  408. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_prompt_provider.py +0 -0
  409. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_prompts.py +0 -0
  410. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_read_image_tool.py +0 -0
  411. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tool_collection_builtin_dispatch.py +0 -0
  412. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tool_collection_config.py +0 -0
  413. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tool_collection_extensions.py +0 -0
  414. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tool_collection_initialization.py +0 -0
  415. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tool_collection_memory.py +0 -0
  416. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tool_registry.py +0 -0
  417. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/test_tools.py +0 -0
  418. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/__init__.py +0 -0
  419. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_agent_tool.py +0 -0
  420. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_base_tool.py +0 -0
  421. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_build_tool.py +0 -0
  422. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_edit_preview.py +0 -0
  423. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_edit_tool.py +0 -0
  424. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_list_directory_tool.py +0 -0
  425. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_lsp_tool.py +0 -0
  426. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_read_file_tool.py +0 -0
  427. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_snapshot_tool.py +0 -0
  428. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_terminal_tool.py +0 -0
  429. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_think_hard_integration.py +0 -0
  430. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_think_hard_streaming.py +0 -0
  431. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_think_hard_streaming_content.py +0 -0
  432. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_think_hard_streaming_errors.py +0 -0
  433. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_think_hard_streaming_updates.py +0 -0
  434. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_web_search_tool.py +0 -0
  435. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/agent/tool_backend/test_workflow_tool.py +0 -0
  436. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/auth/__init__.py +0 -0
  437. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/auth/test_chatgpt_oauth.py +0 -0
  438. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/auth/test_tokens.py +0 -0
  439. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/__init__.py +0 -0
  440. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/_app_test_utils.py +0 -0
  441. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app.py +0 -0
  442. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_agent_wiring.py +0 -0
  443. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_changes_inspector.py +0 -0
  444. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_compaction_restore.py +0 -0
  445. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_composer_commands.py +0 -0
  446. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_composer_input.py +0 -0
  447. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_conversation_rendering.py +0 -0
  448. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_diagnostics.py +0 -0
  449. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_focus_behavior.py +0 -0
  450. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_goal_command.py +0 -0
  451. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_image_vision_warning.py +0 -0
  452. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_mention_dropdown.py +0 -0
  453. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_misc_commands.py +0 -0
  454. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_model_effort_commands.py +0 -0
  455. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_model_switch_vision.py +0 -0
  456. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_modes_planning.py +0 -0
  457. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_navigation_commands.py +0 -0
  458. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_permission_prompts.py +0 -0
  459. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_persistence_history.py +0 -0
  460. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_plan_lifecycle.py +0 -0
  461. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_planning_questions.py +0 -0
  462. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_planning_restore.py +0 -0
  463. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_errors.py +0 -0
  464. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_scroll.py +0 -0
  465. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_status.py +0 -0
  466. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_streaming.py +0 -0
  467. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_rendering_terminal_logs.py +0 -0
  468. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_session_diff_async.py +0 -0
  469. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_skill_commands.py +0 -0
  470. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_slash_dropdown.py +0 -0
  471. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_status_modes.py +0 -0
  472. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_sub_agents_workflows.py +0 -0
  473. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_app_tmux_shortcuts.py +0 -0
  474. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_ask_goal.py +0 -0
  475. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_cli_config.py +0 -0
  476. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_clipboard_image.py +0 -0
  477. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_connection.py +0 -0
  478. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_diagnostics.py +0 -0
  479. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_file_index.py +0 -0
  480. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_main.py +0 -0
  481. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_mcp_cli.py +0 -0
  482. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_mcp_settings_formatting.py +0 -0
  483. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_mentions.py +0 -0
  484. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_plan_artifacts.py +0 -0
  485. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_session_diff.py +0 -0
  486. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_session_store.py +0 -0
  487. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_settings.py +0 -0
  488. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_skills.py +0 -0
  489. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_slash_commands.py +0 -0
  490. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_sub_agent_stream_accumulation.py +0 -0
  491. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_terminal_display.py +0 -0
  492. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_themes.py +0 -0
  493. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_tui_stylesheet.py +0 -0
  494. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/cli/test_updater.py +0 -0
  495. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/conftest.py +0 -0
  496. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/hooks/__init__.py +0 -0
  497. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/hooks/test_hooks.py +0 -0
  498. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/mcp/test_config_state_tools.py +0 -0
  499. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/_fake_server.py +0 -0
  500. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/conftest.py +0 -0
  501. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_client.py +0 -0
  502. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_diagnostics.py +0 -0
  503. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_edits.py +0 -0
  504. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_integration.py +0 -0
  505. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_lsp_edit_tool_integration.py +0 -0
  506. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_project_config.py +0 -0
  507. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_registry.py +0 -0
  508. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/lsp/test_trust.py +0 -0
  509. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/services/test_snapshots.py +0 -0
  510. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/test_agent_config_serialization.py +0 -0
  511. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/test_mcp_permissions.py +0 -0
  512. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/test_mcp_transport.py +0 -0
  513. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/tools/__init__.py +0 -0
  514. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/tools/test_definitions.py +0 -0
  515. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/utils/__init__.py +0 -0
  516. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/utils/test_images.py +0 -0
  517. {kolega_code-0.16.0 → kolega_code-0.17.0}/tests/utils/test_images_ascii.py +0 -0
@@ -25,6 +25,12 @@ OLLAMA_API_KEY=
25
25
  KOLEGA_CODE_THINKING_EFFORT=
26
26
 
27
27
  BROWSERLESS_API_KEY=
28
+ # Optional Browserless connection overrides. CDP and the SFO region remain the defaults.
29
+ # BROWSERLESS_WS_ENDPOINT=wss://production-sfo.browserless.io
30
+ # BROWSERLESS_REGION=sfo
31
+ # BROWSERLESS_PROTOCOL=cdp
32
+ # BROWSERLESS_TIMEOUT_MS=300000
33
+ # BROWSER_CONNECT_TIMEOUT_MS=30000
28
34
 
29
35
  LANGFUSE_HOST=https://us.cloud.langfuse.com
30
36
  LANGFUSE_PUBLIC_KEY=
@@ -3,7 +3,7 @@ name: CI
3
3
  on:
4
4
  pull_request:
5
5
  branches: [main]
6
- types: [opened, synchronize, reopened, ready_for_review]
6
+ types: [opened, synchronize, reopened]
7
7
  push:
8
8
  branches: [main]
9
9
  workflow_dispatch:
@@ -84,6 +84,10 @@ jobs:
84
84
  if: needs.changes.outputs.coverage-badge-only != 'true'
85
85
  run: uv sync --extra dev --frozen
86
86
 
87
+ - name: Install Playwright Chromium
88
+ if: needs.changes.outputs.coverage-badge-only != 'true'
89
+ run: uv run playwright install --with-deps chromium
90
+
87
91
  - name: Run pre-commit hooks
88
92
  if: needs.changes.outputs.coverage-badge-only != 'true'
89
93
  run: uv run pre-commit run --all-files --show-diff-on-failure
@@ -34,6 +34,9 @@ jobs:
34
34
  - name: Install dependencies
35
35
  run: uv sync --extra dev --frozen
36
36
 
37
+ - name: Install Playwright Chromium
38
+ run: uv run playwright install --with-deps chromium
39
+
37
40
  - name: Verify release version metadata
38
41
  run: |
39
42
  uv run python - <<'PY'
@@ -6,6 +6,48 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.17.0 - 2026-07-10
10
+
11
+ ### Changed
12
+
13
+ - Rebuilt the browser agent on a Playwright MCP-style accessibility-snapshot
14
+ toolset (`browser_navigate`, `browser_snapshot`, `browser_find`,
15
+ `browser_click`, `browser_type`, and more). Actions use stable element refs
16
+ (e.g. `e12`) and return an updated snapshot, so the agent interacts
17
+ deterministically without inventing CSS selectors or relying on screenshots.
18
+ - The browser agent now requires a vision-capable model. Models without image
19
+ input support are rejected with guidance to choose a vision-capable model or
20
+ inherit the default.
21
+
22
+ ### Fixed
23
+
24
+ - Prevented `glob`, `search_codebase`, and LSP language detection from hanging
25
+ on large or broad project directories by adding bounded, cancellable,
26
+ timeout-limited workspace traversal.
27
+ - Normalized TUI transcript indentation for consistent rendering.
28
+
29
+ ### Security
30
+
31
+ - Hardened browser URL validation to address CodeQL static-analysis findings.
32
+
33
+ ## 0.16.1 - 2026-07-10
34
+
35
+ ### Changed
36
+
37
+ - Rebuilt `web_fetch` as a fully local, content-type-aware pipeline with bounded
38
+ HTTP retries, automatic quality-gated Trafilatura/Readability/DOM extraction,
39
+ JSON/text/feed handling, and local PDF/Office conversion.
40
+ - `web_fetch` now returns grounded fast-model answers with verified page excerpts,
41
+ long-content chunking, and a bounded extracted-content fallback when answering fails.
42
+
43
+ ### Fixed
44
+
45
+ - `web_fetch` now reports HTTP, extraction, unsupported-content, scanned-document,
46
+ and JavaScript-rendered SPA failures precisely instead of collapsing them into
47
+ empty Trafilatura output, and UI progress failures no longer discard results.
48
+ - Removed the arbitrary 512-character answer clipping and first-100,000-character
49
+ page truncation that could omit valid answers near the end of a resource.
50
+
9
51
  ## 0.16.0 - 2026-07-09
10
52
 
11
53
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.16.0
3
+ Version: 0.17.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/
@@ -235,6 +235,8 @@ Requires-Dist: httpx==0.28.1
235
235
  Requires-Dist: jinja2==3.1.6
236
236
  Requires-Dist: langfuse==3.14.5
237
237
  Requires-Dist: lxml-html-clean==0.4.5
238
+ Requires-Dist: markdownify==1.2.3
239
+ Requires-Dist: markitdown[docx,pdf,pptx,xls,xlsx]==0.1.6
238
240
  Requires-Dist: mcp>=1.21.2
239
241
  Requires-Dist: nest-asyncio==1.6.0
240
242
  Requires-Dist: openai==1.109.1
@@ -246,6 +248,7 @@ Requires-Dist: psutil==7.2.2
246
248
  Requires-Dist: pydantic==2.13.4
247
249
  Requires-Dist: python-dotenv==1.2.2
248
250
  Requires-Dist: pyyaml==6.0.3
251
+ Requires-Dist: readability-lxml==0.8.4.1
249
252
  Requires-Dist: tavily-python==0.7.26
250
253
  Requires-Dist: tenacity==9.1.4
251
254
  Requires-Dist: textual==8.2.5
@@ -115,8 +115,8 @@ the organization request.
115
115
 
116
116
  2. In GitHub, create an environment named `pypi`.
117
117
 
118
- Require approval from trusted maintainers before deployment. The release
119
- workflow will pause before publishing to PyPI.
118
+ The release workflow publishes to PyPI automatically when a release tag is
119
+ pushed; no manual deployment approval is required.
120
120
 
121
121
  ## Installer handoff
122
122
 
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 79.93%"><title>coverage: 79.93%</title><filter id="blur"><feGaussianBlur stdDeviation="16"/></filter><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#67ac09"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="315" y="150" fill-opacity=".8" filter="url(#blur)" textLength="510">coverage</text><text x="315" y="150" fill-opacity=".3" textLength="510">coverage</text></g><text x="315" y="140" textLength="510">coverage</text></g><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="865" y="150" fill-opacity=".8" filter="url(#blur)" textLength="430">79.93%</text><text x="865" y="150" fill-opacity=".3" textLength="430">79.93%</text></g><text x="865" y="140" textLength="430">79.93%</text></g></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 79.92%"><title>coverage: 79.92%</title><filter id="blur"><feGaussianBlur stdDeviation="16"/></filter><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#67ac09"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="315" y="150" fill-opacity=".8" filter="url(#blur)" textLength="510">coverage</text><text x="315" y="150" fill-opacity=".3" textLength="510">coverage</text></g><text x="315" y="140" textLength="510">coverage</text></g><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="865" y="150" fill-opacity=".8" filter="url(#blur)" textLength="430">79.92%</text><text x="865" y="150" fill-opacity=".3" textLength="430">79.92%</text></g><text x="865" y="140" textLength="430">79.92%</text></g></g></svg>
@@ -31,10 +31,14 @@ Run shell commands in the project and stream their output to the **Terminal** ta
31
31
 
32
32
  Drive a real browser (Playwright) for web tasks:
33
33
 
34
- - `launch_browser`, `list_browsers`, `close_browser`
35
- - `get_browser_interactive_elements`, `get_browser_console_logs`
36
- - `take_browser_screenshot`
37
- - `interact_with_browser`, `set_browser_select_value`
34
+ - `browser_navigate`, `browser_snapshot`, `browser_find`, `browser_close`
35
+ - `browser_click`, `browser_type`, `browser_fill_form`, `browser_select_option`
36
+ - `browser_tabs`, `browser_wait_for`, `browser_handle_dialog`, `browser_file_upload`
37
+ - `browser_console_messages`, `browser_network_requests`, `browser_take_screenshot`
38
+
39
+ The browser agent uses accessibility snapshots with element refs such as `e12`.
40
+ Actions return an updated snapshot, so the agent can interact deterministically
41
+ without inventing CSS selectors or relying on screenshots.
38
42
 
39
43
  Launch visible browser windows (instead of headless) with `--browser-visible` on
40
44
  the [TUI](../../cli/overview/) or [`ask`](../../cli/ask/).
@@ -42,13 +46,23 @@ the [TUI](../../cli/overview/) or [`ask`](../../cli/ask/).
42
46
  ### Web
43
47
 
44
48
  - `web_search` — search the web for relevant pages and return ranked results.
45
- - `web_fetch` — fetch and parse a web page without a full browser.
49
+ - `web_fetch` — retrieve a URL, extract local-readable content, and answer an
50
+ instruction with source evidence. It handles HTML, plain text, Markdown,
51
+ JSON/XML/feeds, PDF, DOCX, PPTX, XLSX, and XLS. HTML extraction uses a
52
+ quality-gated local chain (Trafilatura, Readability, semantic DOM, then full
53
+ visible text) and automatically selects the best result.
46
54
 
47
55
  Use `web_search` when you do not already know the right URL, then follow up with
48
56
  `web_fetch` to read a result in depth. The default backend is keyless DuckDuckGo;
49
57
  Firecrawl, Tavily, and self-hosted SearXNG can be selected in Settings or with
50
58
  environment variables.
51
59
 
60
+ `web_fetch` never sends the URL or page content to a third-party reader service
61
+ and does not launch a browser. If a page appears to be a JavaScript-rendered SPA,
62
+ the result says that its content may be incomplete so the agent can use the
63
+ browser tools instead. Scanned/image-only PDFs and legacy DOC/PPT files require
64
+ OCR/conversion outside this tool.
65
+
52
66
  ### Reasoning & memory
53
67
 
54
68
  - `think_hard` — an extended-reasoning step that uses the
@@ -86,6 +86,12 @@ section.
86
86
  | `KOLEGA_CODE_<ROLE>_MODEL` | Model for that agent |
87
87
  | `KOLEGA_CODE_<ROLE>_EFFORT` | Thinking effort for that agent |
88
88
 
89
+ The `BROWSER` role requires a vision-capable model. An incompatible explicit or
90
+ inherited model is never replaced automatically; dispatching the browser agent
91
+ fails with a configuration error until `KOLEGA_CODE_BROWSER_PROVIDER` and
92
+ `KOLEGA_CODE_BROWSER_MODEL` (or the equivalent Settings override) select a model
93
+ with vision support.
94
+
89
95
  ## State & environment
90
96
 
91
97
  | Variable | Purpose |
@@ -106,6 +112,24 @@ explicitly when you want a cloud provider or a self-hosted SearXNG instance.
106
112
  | `TAVILY_API_KEY` | Tavily API key |
107
113
  | `SEARXNG_BASE_URL` | Base URL for a self-hosted SearXNG instance |
108
114
 
115
+ ## Browser automation
116
+
117
+ Local browser automation needs no credentials. Hosted sandbox deployments can
118
+ connect the same browser agent to Browserless.
119
+
120
+ | Variable | Purpose |
121
+ | --- | --- |
122
+ | `BROWSERLESS_API_KEY` | Browserless cloud API token |
123
+ | `BROWSERLESS_WS_ENDPOINT` | Optional cloud or self-hosted WebSocket endpoint |
124
+ | `BROWSERLESS_REGION` | Cloud region used when no endpoint is supplied: `sfo`, `lon`, or `ams` |
125
+ | `BROWSERLESS_PROTOCOL` | Connection protocol: `cdp` (default) or `playwright` |
126
+ | `BROWSERLESS_TIMEOUT_MS` | Optional maximum Browserless session duration; must fit the account plan |
127
+ | `BROWSER_CONNECT_TIMEOUT_MS` | Browser transport connection timeout (default 30000 ms) |
128
+
129
+ Custom endpoint query parameters are preserved, including Browserless proxy,
130
+ stealth, profile, and recording options. If `BROWSERLESS_TIMEOUT_MS` is unset,
131
+ Browserless applies the account's default session duration.
132
+
109
133
  ## Telemetry (Langfuse)
110
134
 
111
135
  Optional [Langfuse](https://langfuse.com/) tracing of LLM usage.
@@ -149,6 +149,12 @@ In the **Settings tab**, the **Agent Models** section (below the main Model sect
149
149
  has a provider/model/effort group per role. Leave a role on **Default** to inherit;
150
150
  pick a provider, model, and thinking effort to override it.
151
151
 
152
+ The **Browser** role requires a model whose catalog entry supports vision. It does
153
+ not fall back to another model or run in a text-only mode. If **Default** resolves
154
+ to a non-vision model, Settings shows a warning and the browser agent fails with a
155
+ configuration error when dispatched. Select an explicit vision-capable Browser
156
+ model to enable it.
157
+
152
158
  Or use environment variables, named `KOLEGA_CODE_<ROLE>_PROVIDER` / `_MODEL` / `_EFFORT`:
153
159
 
154
160
  ```bash
@@ -156,6 +162,10 @@ Or use environment variables, named `KOLEGA_CODE_<ROLE>_PROVIDER` / `_MODEL` / `
156
162
  export KOLEGA_CODE_INVESTIGATION_PROVIDER=deepseek
157
163
  export KOLEGA_CODE_INVESTIGATION_MODEL=deepseek-v4-flash
158
164
  export KOLEGA_CODE_INVESTIGATION_EFFORT=high
165
+
166
+ # Browser overrides must name a vision-capable model.
167
+ export KOLEGA_CODE_BROWSER_PROVIDER=anthropic
168
+ export KOLEGA_CODE_BROWSER_MODEL=claude-sonnet-4-6
159
169
  ```
160
170
 
161
171
  Resolution order for a role (first match wins): **env var → saved Settings → the
@@ -32,6 +32,10 @@ agents (planning, building, investigation, general, browser) their own provider,
32
32
  model, and effort. Leave a role on **Default** to inherit the active model. See
33
33
  [Per-agent models](../providers-and-models/#per-agent-models).
34
34
 
35
+ The Browser role only accepts vision-capable model overrides. If it inherits a
36
+ non-vision active model, Settings allows the inheritance but warns that the browser
37
+ agent is unavailable until you choose a compatible Browser model.
38
+
35
39
  The **Web Search** section configures the `web_search` tool. DuckDuckGo is the
36
40
  default and needs no key. Firecrawl can also run without a key, with an optional
37
41
  key for higher rate limits. Tavily requires a key, and SearXNG requires the base
@@ -151,4 +151,4 @@ __all__ = [
151
151
  "parse_git_status_output",
152
152
  ]
153
153
 
154
- __version__ = "0.16.0"
154
+ __version__ = "0.17.0"
@@ -44,4 +44,4 @@ __all__ = [
44
44
  "ToolExtension",
45
45
  ]
46
46
 
47
- __version__ = "0.16.0"
47
+ __version__ = "0.17.0"
@@ -5,6 +5,7 @@ from .baseagent import BaseAgent
5
5
  from kolega_code.config import AgentConfig
6
6
  from kolega_code.events import AgentConnectionManager
7
7
  from kolega_code.llm.models import Message, TextBlock
8
+ from kolega_code.llm.specs import supports_vision as model_supports_vision
8
9
  from .prompt_provider import AgentMode, AgentType, PromptExtension, PromptProvider
9
10
  from .tools import ToolCollection
10
11
 
@@ -19,6 +20,19 @@ class BrowserAgent(BaseAgent):
19
20
 
20
21
  agent_name = "browser-agent"
21
22
 
23
+ @classmethod
24
+ def validate_model_capabilities(cls, config: AgentConfig) -> None:
25
+ """Require the resolved browser-agent model to accept image input."""
26
+ model_config = config.model_config_for_agent(cls.agent_name)
27
+ provider = getattr(model_config.provider, "value", model_config.provider)
28
+ if model_supports_vision(provider, model_config.model):
29
+ return
30
+ raise ValueError(
31
+ "BrowserAgent requires a vision-capable model, but "
32
+ f"{provider}/{model_config.model} does not support image input. "
33
+ "Configure a vision-capable model for the Browser agent."
34
+ )
35
+
22
36
  def __init__(
23
37
  self,
24
38
  project_path: str | Path,
@@ -74,6 +88,7 @@ class BrowserAgent(BaseAgent):
74
88
  usage_recorder: Optional callback for recording normalized LLM usage
75
89
  sub_agent_recorder: Optional callback for persisting sub-agent conversation state
76
90
  """
91
+ self.validate_model_capabilities(config)
77
92
  super().__init__(
78
93
  project_path,
79
94
  workspace_id,
@@ -45,6 +45,15 @@ If you are asked for links to assets such as images, do not answer from your mem
45
45
 
46
46
  1. If a website has a cookie consent popup, avoid it. Try another website if you can.
47
47
  2. Your search engine of choice is duckduckgo.com
48
+ 3. Navigate with `browser_navigate`; it starts the browser session automatically.
49
+ 4. Use `browser_snapshot` to understand the page. Prefer exact element refs such as `e12` from the snapshot
50
+ over manually invented selectors.
51
+ 5. Every state-changing action returns an updated snapshot. Use the new refs from that result because refs can
52
+ become stale when the page changes.
53
+ 6. On large pages, use `browser_find` to locate relevant snapshot nodes without loading the entire tree again.
54
+ 7. Use `browser_take_screenshot` only for visual inspection. Do not choose interaction targets from screenshots.
55
+ 8. Use explicit waits for visible or disappearing text when an application updates asynchronously.
56
+ 9. If an action reports a dialog or file chooser, handle that modal before attempting another browser action.
48
57
 
49
58
  ## **CRITICAL: URL Navigation Guidelines**
50
59