kolega-code 0.26.8__tar.gz → 0.26.10__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 (372) hide show
  1. {kolega_code-0.26.8 → kolega_code-0.26.10}/CHANGELOG.md +143 -0
  2. {kolega_code-0.26.8 → kolega_code-0.26.10}/PKG-INFO +13 -1
  3. {kolega_code-0.26.8 → kolega_code-0.26.10}/README.md +11 -0
  4. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/__init__.py +1 -1
  5. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/__init__.py +1 -1
  6. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/baseagent.py +188 -1
  7. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/conversation.py +2 -1
  8. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/kernel.py +31 -4
  9. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +2 -0
  10. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +33 -37
  11. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/eval_tool.py +1 -0
  12. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/terminal_tool.py +13 -0
  13. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tools.py +16 -0
  14. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/app.py +8 -4
  15. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/ask_output.py +13 -1
  16. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/config.py +184 -82
  17. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/main.py +43 -3
  18. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/messages.py +20 -0
  19. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/model_connection.py +21 -16
  20. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/provider_registry.py +18 -1
  21. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_store.py +5 -0
  22. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/settings.py +35 -6
  23. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/agent_runtime.py +7 -2
  24. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/app_base.py +1 -0
  25. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/command_handlers.py +38 -0
  26. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/onboarding_screen.py +10 -1
  27. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/settings_panel.py +458 -116
  28. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/settings_screen.py +119 -49
  29. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/state.py +8 -0
  30. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/styles.tcss +16 -1
  31. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/transcript.py +75 -1
  32. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/widgets.py +25 -2
  33. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/config.py +7 -0
  34. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/client.py +8 -0
  35. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/models.py +172 -20
  36. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/deepseek_responses.py +24 -6
  37. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/models.py +3 -0
  38. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/openai.py +25 -1
  39. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/responses_common.py +128 -42
  40. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/__init__.py +2 -0
  41. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/accessors.py +27 -8
  42. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/deepseek.py +24 -7
  43. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openai.py +12 -0
  44. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openai_chatgpt.py +13 -0
  45. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/terminal.py +21 -2
  46. {kolega_code-0.26.8 → kolega_code-0.26.10}/pyproject.toml +16 -4
  47. {kolega_code-0.26.8 → kolega_code-0.26.10}/.gitignore +0 -0
  48. {kolega_code-0.26.8 → kolega_code-0.26.10}/CONTRIBUTING.md +0 -0
  49. {kolega_code-0.26.8 → kolega_code-0.26.10}/LICENSE +0 -0
  50. {kolega_code-0.26.8 → kolega_code-0.26.10}/MIGRATION.md +0 -0
  51. {kolega_code-0.26.8 → kolega_code-0.26.10}/RELEASING.md +0 -0
  52. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/LICENSE +0 -0
  53. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/manifest.json +0 -0
  54. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  55. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  56. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  57. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  58. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  59. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  60. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  61. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  62. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  63. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  64. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  65. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  66. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  67. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  68. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  69. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  70. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  71. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  72. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  73. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  74. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  75. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  76. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  77. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  78. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  79. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  80. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  81. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  82. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  83. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  84. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  85. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  86. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  87. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  88. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  89. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  90. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  91. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  92. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  93. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  94. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  95. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  96. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  97. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  98. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  99. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  100. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  101. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  102. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  103. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  104. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/browseragent.py +0 -0
  105. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/coder.py +0 -0
  106. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/common.py +0 -0
  107. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/compression.py +0 -0
  108. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/context.py +0 -0
  109. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/custom_agents.py +0 -0
  110. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/edit_protocols.py +0 -0
  111. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/errors.py +0 -0
  112. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/__init__.py +0 -0
  113. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/bridge.py +0 -0
  114. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  115. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  116. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/env.py +0 -0
  117. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/js_kernel.py +0 -0
  118. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/prelude.js +0 -0
  119. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/prelude.py +0 -0
  120. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/protocol.py +0 -0
  121. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/py_kernel.py +0 -0
  122. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/runner.js +0 -0
  123. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/runner.py +0 -0
  124. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/generalagent.py +0 -0
  125. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/goal.py +0 -0
  126. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/investigationagent.py +0 -0
  127. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/model_routing.py +0 -0
  128. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/__init__.py +0 -0
  129. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/accounting.py +0 -0
  130. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/budget.py +0 -0
  131. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/context.py +0 -0
  132. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/errors.py +0 -0
  133. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/executor.py +0 -0
  134. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/guide.py +0 -0
  135. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/journal.py +0 -0
  136. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/runtime.py +0 -0
  137. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/types.py +0 -0
  138. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/planningagent.py +0 -0
  139. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_dump.py +0 -0
  140. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_overrides.py +0 -0
  141. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_provider.py +0 -0
  142. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  143. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  144. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  145. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  146. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  147. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  148. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  149. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
  150. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  151. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  152. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  153. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  154. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  155. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  156. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  157. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  158. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  159. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  160. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  161. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  162. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  163. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  164. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  165. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  166. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  167. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  168. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  169. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  170. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  171. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  172. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  173. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  174. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompts.py +0 -0
  175. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  176. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  177. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  178. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  179. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  180. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  181. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  182. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
  183. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  184. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
  185. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  186. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  187. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/network_status.py +0 -0
  188. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  189. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  190. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  191. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  192. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  193. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  194. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  195. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  196. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  197. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  198. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
  199. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  200. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  201. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
  202. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  203. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  204. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  205. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  206. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  207. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  208. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  209. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  210. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  211. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/utils/commands.py +0 -0
  212. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/volatile_context.py +0 -0
  213. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/__init__.py +0 -0
  214. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/_jwt.py +0 -0
  215. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/chatgpt_oauth.py +0 -0
  216. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/constants.py +0 -0
  217. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/tokens.py +0 -0
  218. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/__init__.py +0 -0
  219. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/framing.py +0 -0
  220. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/installer.py +0 -0
  221. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/manager.py +0 -0
  222. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/multiplex.py +0 -0
  223. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/native_host.py +0 -0
  224. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/protocol.py +0 -0
  225. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/registry.py +0 -0
  226. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/runtime.py +0 -0
  227. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/__init__.py +0 -0
  228. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/browser_backend.py +0 -0
  229. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/clipboard_image.py +0 -0
  230. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/connection.py +0 -0
  231. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/cron.py +0 -0
  232. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/diagnostics.py +0 -0
  233. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/file_index.py +0 -0
  234. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/goal.py +0 -0
  235. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/loop.py +0 -0
  236. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/mentions.py +0 -0
  237. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/model_catalog.py +0 -0
  238. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/plan_artifacts.py +0 -0
  239. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_event_store.py +0 -0
  240. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_journal.py +0 -0
  241. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_usage.py +0 -0
  242. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/skills.py +0 -0
  243. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/slash_commands.py +0 -0
  244. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/theme.py +0 -0
  245. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/__init__.py +0 -0
  246. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/changes_screen.py +0 -0
  247. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/constants.py +0 -0
  248. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/custom_model.py +0 -0
  249. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/loop_runtime.py +0 -0
  250. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/memory_screen.py +0 -0
  251. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/prompt_flows.py +0 -0
  252. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/session_diff.py +0 -0
  253. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/status_dashboard.py +0 -0
  254. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  255. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/terminal_display.py +0 -0
  256. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/updater.py +0 -0
  257. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/events.py +0 -0
  258. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/git_env.py +0 -0
  259. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/__init__.py +0 -0
  260. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/backends.py +0 -0
  261. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/config.py +0 -0
  262. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/dispatcher.py +0 -0
  263. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/events.py +0 -0
  264. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/matcher.py +0 -0
  265. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/outcome.py +0 -0
  266. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/exceptions.py +0 -0
  267. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/instrumented_client.py +0 -0
  268. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/ledger.py +0 -0
  269. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/__init__.py +0 -0
  270. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/_token_encoding.py +0 -0
  271. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/anthropic.py +0 -0
  272. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/base.py +0 -0
  273. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  274. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/google.py +0 -0
  275. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/openai_responses.py +0 -0
  276. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/ratelimit.py +0 -0
  277. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  278. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  279. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  280. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  281. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/google.py +0 -0
  282. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  283. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  284. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  285. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  286. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/together.py +0 -0
  287. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/xai.py +0 -0
  288. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/zai.py +0 -0
  289. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  290. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/thinking.py +0 -0
  291. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/types.py +0 -0
  292. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/timeouts.py +0 -0
  293. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/tool_execution_ids.py +0 -0
  294. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/usage.py +0 -0
  295. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/local_state.py +0 -0
  296. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/__init__.py +0 -0
  297. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/config.py +0 -0
  298. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/oauth.py +0 -0
  299. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/service.py +0 -0
  300. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/state.py +0 -0
  301. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/tools.py +0 -0
  302. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/transport.py +0 -0
  303. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/__init__.py +0 -0
  304. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/identity.py +0 -0
  305. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/manager.py +0 -0
  306. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/manifest.py +0 -0
  307. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/markdown.py +0 -0
  308. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/models.py +0 -0
  309. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/protocol.py +0 -0
  310. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/registry.py +0 -0
  311. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/models/__init__.py +0 -0
  312. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/models/sandbox_terminal_state.py +0 -0
  313. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/permissions.py +0 -0
  314. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/runtime.py +0 -0
  315. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/README.md +0 -0
  316. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/__init__.py +0 -0
  317. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/async_filesystem.py +0 -0
  318. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/base.py +0 -0
  319. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/browser.py +0 -0
  320. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/event_loop.py +0 -0
  321. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/filesystem.py +0 -0
  322. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/local.py +0 -0
  323. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/serializer.py +0 -0
  324. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/terminal.py +0 -0
  325. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/utils.py +0 -0
  326. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/scratchpad.py +0 -0
  327. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/security/__init__.py +0 -0
  328. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/security/secrets.py +0 -0
  329. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/base.py +0 -0
  330. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/browser.py +0 -0
  331. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/file_system.py +0 -0
  332. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/html.py +0 -0
  333. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/__init__.py +0 -0
  334. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/client.py +0 -0
  335. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/config.py +0 -0
  336. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/detector.py +0 -0
  337. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/diagnostics.py +0 -0
  338. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/edits.py +0 -0
  339. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/manager.py +0 -0
  340. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/registry.py +0 -0
  341. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/registry.yaml +0 -0
  342. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/snapshots.py +0 -0
  343. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/terminal_buffer.py +0 -0
  344. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/workspace_scan.py +0 -0
  345. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/__init__.py +0 -0
  346. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/control.py +0 -0
  347. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/inmemory.py +0 -0
  348. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/projection.py +0 -0
  349. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/recording.py +0 -0
  350. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/runtime.py +0 -0
  351. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/store.py +0 -0
  352. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/testing/__init__.py +0 -0
  353. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/testing/store_conformance.py +0 -0
  354. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/__init__.py +0 -0
  355. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/core.py +0 -0
  356. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/definitions.py +0 -0
  357. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/param_aliases.py +0 -0
  358. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/registry.py +0 -0
  359. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/utils/__init__.py +0 -0
  360. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/utils/images.py +0 -0
  361. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/__init__.py +0 -0
  362. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/fold.js +0 -0
  363. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/player.css +0 -0
  364. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/player.html +0 -0
  365. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/player.js +0 -0
  366. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/bundle.py +0 -0
  367. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/hosting.py +0 -0
  368. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/redaction.py +0 -0
  369. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/server.py +0 -0
  370. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/singlefile.py +0 -0
  371. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/theme_css.py +0 -0
  372. {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,149 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.26.10 - 2026-08-05
10
+
11
+ ### Added
12
+
13
+ - Hosted (server-side) web search for Responses-API providers. On DeepSeek
14
+ flash and OpenAI gpt-5.x (API key or ChatGPT subscription), kolega can
15
+ request the provider's own
16
+ `{"type": "web_search"}` tool: searches and page-opens execute on the
17
+ provider's servers and the content is injected directly into the model's
18
+ context (billed as input tokens; the context gauge accounts for it from
19
+ usage, since the content never reaches the client). Calls render in the
20
+ transcript as `web_search (hosted)`. Controlled by a new web tool mode —
21
+ `auto` (default: hosted when the model supports it, else the client tools) /
22
+ `hosted` / `client` / `off` — via Settings, `KOLEGA_CODE_WEB_SEARCH_MODE`,
23
+ `ask --web-search`, or the TUI's `/web-search`. When hosted search is active
24
+ the client-side `web_search`/`web_fetch` tools are not registered; `off`
25
+ removes all web tools (for sandboxed/benchmark runs). Notes: provider
26
+ per-search fees, if any, are not modeled in cost reporting (injected tokens
27
+ are); sessions that used hosted search store a new `web_search_call` history
28
+ block that older kolega builds cannot load.
29
+ - LSP tools can now be forced on or off for a single launch: `--lsp on|off`
30
+ on both the TUI and `kolega-code ask`, plus a `KOLEGA_CODE_LSP` env var,
31
+ resolved flag > env > settings > default-enabled. `--lsp on` overrides a
32
+ persisted `lsp_enabled=false` without writing back to settings. Turning LSP
33
+ off now removes the `lsp`/`lsp_edit` tools from the model entirely —
34
+ previously they stayed registered and could only answer "LSP is not
35
+ available" — and the Settings LSP status notes when the launch flag is
36
+ forcing the mode.
37
+ - The per-session scratchpad directory is now exported as `KOLEGA_SCRATCHPAD`
38
+ to every shell command and eval kernel, so scripts and kernels can reach the
39
+ session's throwaway workspace by environment variable instead of hardcoding
40
+ a temp path.
41
+
42
+ ### Changed
43
+
44
+ - Thinking now renders as a collapsed row in the TUI transcript — `● Thinking
45
+ · … · 1.2k words` while streaming (a live word counter, never the text),
46
+ flipping to `● Thought · 12s · 1.2k words` on completion; expand the row to
47
+ read the full reasoning. Long reasoning turns (DeepSeek flash especially) no
48
+ longer dominate the transcript with full-height thinking walls.
49
+ - Resumed sessions now restore reasoning as the same collapsed thinking rows,
50
+ in true interleaved order with tool and hosted web-search rows: Anthropic
51
+ thinking text, DeepSeek flash's raw chain-of-thought, and OpenAI/ChatGPT
52
+ reasoning summaries all render (encrypted-only reasoning items have no
53
+ renderable text and are skipped). Previously reasoning vanished entirely
54
+ from restored transcripts.
55
+ - The coder prompt now follows a Codex-style final-message contract: the
56
+ closing report leads with what was delivered and its verified state, stays
57
+ brief by default with structure scaled to complexity, references files by
58
+ path instead of re-pasting contents, and never restates the plan step by
59
+ step. Preambles before tool calls are tightened to a single short line
60
+ naming the purpose of the next action, and verification effort is bounded —
61
+ tool results are trusted (no re-reading a file to confirm an edit applied)
62
+ and verification stops once no remaining check could realistically fail.
63
+
64
+ ### Fixed
65
+
66
+ - Hosted web-search calls now render in their true position in the TUI
67
+ transcript. Previously the rows mounted at the bottom and stayed pinned
68
+ there while post-search reasoning kept streaming into the thinking bubble
69
+ above them; the stream now closes the open thinking/response segment at
70
+ each hosted call, so reasoning after a search opens a new bubble below its
71
+ rows (think → search → think → answer). Resumed sessions now render hosted
72
+ `web_search (hosted)` rows from history too — previously they were dropped
73
+ from the restored transcript.
74
+ - `ask --json` no longer emits spurious synthetic message fragments when
75
+ hosted web search flushes response text mid-stream: the lost-text fallback
76
+ now applies once at end of turn, and only when the turn produced no
77
+ assistant message.
78
+ - The context gauge no longer under-reads on `deepseek-v4-flash`. DeepSeek's
79
+ Responses API silently re-attaches every prior round's reasoning server-side and
80
+ bills it as input, but the client history held none of it, so the gauge (and the
81
+ auto-compaction trigger) could run over 100k tokens behind the real billed
82
+ context on reasoning-heavy sessions. Flash's plain-text reasoning is now retained
83
+ in history and resent each turn — the same shape Codex replays, deduped by the
84
+ server so billing is unchanged — which keeps the gauge on the real number and
85
+ preserves chain-of-thought continuity across session restores. The retained
86
+ reasoning text also now appears in `ask --json` message payloads (parity with
87
+ Anthropic thinking text); encrypted-only reasoning from OpenAI/ChatGPT stays
88
+ stripped as before.
89
+
90
+ ### Security
91
+
92
+ - Dependency bumps for advisories published 2026-08-03/04: `cryptography`
93
+ 48.0.1 → 50.0.0 (PKCS#7 Bleichenbacher oracle CVE-2026-69247, a name-constraint
94
+ wildcard bypass CVE-2026-69248, and a path-building DoS CVE-2026-69249) and
95
+ `aiohttp` 3.14.1 → 3.14.3 (three parser advisories, including an out-of-bounds
96
+ heap read in the C response parser). Exception: Intel Macs stay on
97
+ `cryptography` 48.0.1 — every fixed release dropped Intel-mac wheels, and
98
+ upgrading would break the curl installer there with a Rust+OpenSSL source
99
+ build — so those three advisories are knowingly accepted on that legacy
100
+ platform only.
101
+
102
+ ## 0.26.9 - 2026-08-03
103
+
104
+ ### Added
105
+
106
+ - Settings → Model & Account gains a **Model Slots** section for pinning the fast
107
+ and thinking models, each with its own provider. Previously these slots were
108
+ reachable only through CLI flags and environment variables, so in the TUI they
109
+ silently inherited the active model — every `web_fetch` answering call ran on
110
+ the main coding model. Slots still inherit by default, and each row now shows
111
+ which model it currently resolves to.
112
+ - The README now includes a direct invitation to the Kolega Code Discord
113
+ community.
114
+
115
+ ### Changed
116
+
117
+ - Settings gains a **Providers** category, first in the rail, holding every model
118
+ provider's API key and the ChatGPT sign-in, each row labelled with its live
119
+ credential status. **Model & Account** is renamed **Models** and keeps only what
120
+ runs. Keys now stage per provider, so credentials for a provider you are not
121
+ currently using — needed by a fast/thinking slot or an agent-role override — can be
122
+ entered without switching your main model and switching back. **Test Connection**
123
+ moves with them and probes the selected provider rather than the active model, so a
124
+ credential can be checked without running on that provider.
125
+ - **Breaking:** provider and model are now always specified together. `--provider`
126
+ without `--model` (and the per-role/per-slot equivalents such as
127
+ `KOLEGA_CODE_FAST_PROVIDER`) is an error instead of silently selecting that
128
+ provider's default model, and a model named without a provider is rejected rather
129
+ than assumed to be Anthropic's. Scripts passing only one of the pair need updating;
130
+ the error names the missing flag. Saved settings are unaffected — the Settings UI
131
+ always writes both — and a saved model that later leaves the catalog still degrades
132
+ to the provider's default rather than blocking startup.
133
+
134
+ ### Fixed
135
+
136
+ - `deepseek-v4-flash` no longer has its reasoning truncated mid-derivation. The
137
+ 64000-token output cap added in 0.26.8 was measured on the chat API for
138
+ `deepseek-v4-pro` and applied to flash by assumption; flash actually runs to
139
+ at least 112990 output tokens in a single Responses call. Hard tasks that
140
+ reason for a long time before acting were cut off at the cap and produced no
141
+ tool call at all. flash now uses its full published output budget, while pro
142
+ and the fireworks/openrouter DeepSeek routes keep the 64000 cap where their
143
+ measured ceilings apply.
144
+
145
+ ### Removed
146
+
147
+ - The unreachable `DEFAULT_LONG_MODEL`, `DEFAULT_FAST_MODEL`, `DEFAULT_THINKING_MODEL`
148
+ and their provider constants. No model was ever resolved through them — an unset
149
+ slot inherits the active model — but they were documented as defaults, which is
150
+ where "what is my fast model?" became unanswerable.
151
+
9
152
  ## 0.26.8 - 2026-08-03
10
153
 
11
154
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.26.8
3
+ Version: 0.26.10
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/
@@ -231,6 +231,7 @@ Requires-Python: >=3.11
231
231
  Requires-Dist: anthropic==0.101.0
232
232
  Requires-Dist: beautifulsoup4==4.14.3
233
233
  Requires-Dist: cryptography==48.0.1; sys_platform == 'darwin' and platform_machine == 'x86_64'
234
+ Requires-Dist: cryptography==50.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'
234
235
  Requires-Dist: ddgs==9.14.4
235
236
  Requires-Dist: fastapi==0.139.2
236
237
  Requires-Dist: filelock==3.20.3
@@ -494,6 +495,7 @@ Full documentation lives at **[kolega-ai.github.io/kolega-code](https://kolega-a
494
495
  - [Contributing](CONTRIBUTING.md)
495
496
  - [Security policy](SECURITY.md)
496
497
  - [Issue tracker](https://github.com/kolega-ai/kolega-code/issues)
498
+ - [Discord community](https://discord.gg/kaS8PKKp4)
497
499
 
498
500
  ## Contributing
499
501
 
@@ -504,3 +506,13 @@ privately per [SECURITY.md](SECURITY.md).
504
506
  ## License
505
507
 
506
508
  Released under the [Apache License 2.0](LICENSE).
509
+
510
+ ## Join the community
511
+
512
+ Building something with Kolega Code, hit a rough edge, or want to shape where
513
+ Gigacode goes next? Come talk to us.
514
+
515
+ [![Join our Discord](https://img.shields.io/badge/Discord-join%20the%20community-5865F2?logo=discord&logoColor=white)](https://discord.gg/kaS8PKKp4)
516
+
517
+ **→ [Join the Kolega Code Discord](https://discord.gg/kaS8PKKp4)** — share workflows,
518
+ get help, and hear about releases first.
@@ -215,6 +215,7 @@ Full documentation lives at **[kolega-ai.github.io/kolega-code](https://kolega-a
215
215
  - [Contributing](CONTRIBUTING.md)
216
216
  - [Security policy](SECURITY.md)
217
217
  - [Issue tracker](https://github.com/kolega-ai/kolega-code/issues)
218
+ - [Discord community](https://discord.gg/kaS8PKKp4)
218
219
 
219
220
  ## Contributing
220
221
 
@@ -225,3 +226,13 @@ privately per [SECURITY.md](SECURITY.md).
225
226
  ## License
226
227
 
227
228
  Released under the [Apache License 2.0](LICENSE).
229
+
230
+ ## Join the community
231
+
232
+ Building something with Kolega Code, hit a rough edge, or want to shape where
233
+ Gigacode goes next? Come talk to us.
234
+
235
+ [![Join our Discord](https://img.shields.io/badge/Discord-join%20the%20community-5865F2?logo=discord&logoColor=white)](https://discord.gg/kaS8PKKp4)
236
+
237
+ **→ [Join the Kolega Code Discord](https://discord.gg/kaS8PKKp4)** — share workflows,
238
+ get help, and hear about releases first.
@@ -151,4 +151,4 @@ __all__ = [
151
151
  "parse_git_status_output",
152
152
  ]
153
153
 
154
- __version__ = "0.26.8"
154
+ __version__ = "0.26.10"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.26.8"
54
+ __version__ = "0.26.10"
@@ -43,7 +43,15 @@ from kolega_code.llm.exceptions import (
43
43
  )
44
44
  from kolega_code.llm.instrumented_client import get_output_tokens
45
45
  from kolega_code.llm.ledger import HISTORY_ORIGIN, LlmCallOrigin, helper_origin, llm_call_origin
46
- from kolega_code.llm.models import ImageBlock, Message, MessageHistory, TextBlock, ToolCall, ToolResult
46
+ from kolega_code.llm.models import (
47
+ ImageBlock,
48
+ Message,
49
+ MessageHistory,
50
+ TextBlock,
51
+ ToolCall,
52
+ ToolResult,
53
+ WebSearchCallBlock,
54
+ )
47
55
  from kolega_code.llm.providers.models import TokenCount
48
56
  from kolega_code.llm.specs import (
49
57
  deepseek_output_token_cap,
@@ -461,6 +469,15 @@ class BaseAgent(LogMixin):
461
469
  # tool) and used by _unsupported_attachment_message to reject image
462
470
  # attachments for non-vision models with a clear message.
463
471
  self.supports_vision = bool(model_specs.get("supports_vision", False))
472
+ # Web tool mode: whether the provider's hosted (server-side) web_search
473
+ # tool is requested and whether the client-side web_search/web_fetch
474
+ # tools are registered. Resolved from config.web_search_mode plus the
475
+ # model's supports_hosted_web_search catalog flag; the ToolCollection
476
+ # gate reads client_web_tools_enabled, the stream call reads
477
+ # hosted_web_search_active.
478
+ self.supports_hosted_web_search = bool(model_specs.get("supports_hosted_web_search", False))
479
+ self.web_search_mode = getattr(self.config, "web_search_mode", "auto") or "auto"
480
+ self._apply_web_search_state()
464
481
 
465
482
  self.llm = context.create_llm_client(agent_name=self.agent_name)
466
483
 
@@ -487,6 +504,15 @@ class BaseAgent(LogMixin):
487
504
  self._workflow_accounting: Optional["WorkflowRunAccounting"] = None
488
505
  self._accounting_reservation: Optional["AgentReservation"] = None
489
506
  self.total_tokens_used: int = 0
507
+ # Hosted web-search accounting side-channel. Searched/fetched content is
508
+ # injected into the model's context SERVER-side (restored on replay of
509
+ # web_search_call items, billed as input) and never reaches the client,
510
+ # so tiktoken-over-history can't see it. The residual — billed input
511
+ # minus the client-side count of the request actually sent — measures it
512
+ # and is added to the gauge in count_current_context. Updated by
513
+ # _update_hosted_search_residual; zeroed by compress_history.
514
+ self._hosted_injected_tokens: int = 0
515
+ self._last_raw_context_count: Optional[int] = None
490
516
  # Set by a blocking PostToolUse hook to end the turn after the current tool batch.
491
517
  self._hook_end_turn = False
492
518
  self.queued_input_provider: Optional[Callable[[], Awaitable[List[QueuedUserInput]]]] = None
@@ -652,6 +678,74 @@ class BaseAgent(LogMixin):
652
678
  if callable(initialize):
653
679
  initialize()
654
680
 
681
+ def _apply_web_search_state(self) -> None:
682
+ """Resolve web_search_mode + model capability into the two live gates.
683
+
684
+ ``hosted_web_search_active`` — request the provider's server-side
685
+ web_search tool on main-loop stream calls. ``client_web_tools_enabled``
686
+ — register the client-side web_search/web_fetch tools (read by the
687
+ ToolCollection gate). Hosted active always excludes the client tools:
688
+ two search paths confuse the model and waste schema tokens.
689
+ """
690
+ mode = (self.web_search_mode or "auto").lower()
691
+ supported = self.supports_hosted_web_search
692
+ if mode == "off":
693
+ hosted, client = False, False
694
+ elif mode == "client":
695
+ hosted, client = False, True
696
+ elif mode == "hosted":
697
+ if not supported:
698
+ provider = self.primary_model_config.provider
699
+ logger.warning(
700
+ "web_search_mode=hosted, but %s/%s has no hosted web search; falling back to the client tools",
701
+ getattr(provider, "value", provider),
702
+ self.primary_model_config.model,
703
+ )
704
+ hosted, client = supported, not supported
705
+ else: # auto
706
+ hosted, client = supported, not supported
707
+ self.hosted_web_search_active = hosted
708
+ self.client_web_tools_enabled = client
709
+
710
+ def apply_web_search_mode(self, mode: str) -> None:
711
+ """Change the web tool mode mid-session (TUI ``/web-search``).
712
+
713
+ Mirrors :meth:`apply_gigacode`: the tool registry rebuilds per call and
714
+ the next stream call reads the hosted gate, so no cache invalidation is
715
+ needed. No prompt work — the tools carry their own affordances.
716
+ """
717
+ self.web_search_mode = (mode or "auto").lower()
718
+ self._apply_web_search_state()
719
+
720
+ async def _emit_hosted_tool_call(self, delta: Dict[str, Any]) -> None:
721
+ """Render a completed hosted web_search call as a tool_call/tool_result pair.
722
+
723
+ The call executed on the provider's servers; there is no local tool
724
+ invocation and the searched content never reaches the client (it is
725
+ injected into the model's context server-side). The shared item id
726
+ correlates the pair in every transcript consumer.
727
+ """
728
+ block = WebSearchCallBlock(
729
+ item_id=delta.get("id") or None,
730
+ status=delta.get("status"),
731
+ action=delta.get("action") or {},
732
+ )
733
+ tool_call_id = block.item_id or str(uuid.uuid4())
734
+ await self.send_chat_message(
735
+ message_type="tool_call",
736
+ content=f"Calling {WebSearchCallBlock.TOOL_LABEL}: {block.label()}",
737
+ is_streaming=False,
738
+ tool_description=WebSearchCallBlock.TOOL_LABEL,
739
+ tool_call_id=tool_call_id,
740
+ )
741
+ await self.send_chat_message(
742
+ message_type="tool_result",
743
+ content=block.result_summary(),
744
+ is_streaming=False,
745
+ tool_description=WebSearchCallBlock.TOOL_LABEL,
746
+ tool_call_id=tool_call_id,
747
+ )
748
+
655
749
  def apply_goal(self, condition: Optional[str], prompt_extension: Optional["PromptExtension"] = None) -> None:
656
750
  """Set, replace, or clear the active autonomous goal for this session.
657
751
 
@@ -944,12 +1038,61 @@ class BaseAgent(LogMixin):
944
1038
  model=self.primary_model_config.model,
945
1039
  tools=self.tool_collection.get_tool_list(),
946
1040
  )
1041
+ # Hosted web-search content lives only in the server's copy of the
1042
+ # context (restored on replay of the web_search_call items, billed as
1043
+ # input) — the client history has nothing to count for it. Add the
1044
+ # residual measured from billed usage so the gauge AND the compaction
1045
+ # check both see the true context size. Nonzero only while un-compacted
1046
+ # web_search_call blocks exist (see _update_hosted_search_residual).
1047
+ self._last_raw_context_count = token_count.input_tokens
1048
+ if self._hosted_injected_tokens > 0:
1049
+ token_count.input_tokens += self._hosted_injected_tokens
947
1050
 
948
1051
  # Send context update event
949
1052
  await self._send_context_update(token_count)
950
1053
 
951
1054
  return token_count
952
1055
 
1056
+ # Provisional residual bump per hosted web-search call, applied while the
1057
+ # search-bearing response's own billing is telescoped (a response that
1058
+ # searched is several internal invocations billed cumulatively, so its
1059
+ # billed−counted residual overstates the persistent injected size). The next
1060
+ # clean response replaces the estimate with the measured residual. Probe
1061
+ # calibration 2026-08-04 (findings/probes/hosted_web_search_probe.py):
1062
+ # one-call persistent overhead ≈850 (deepseek) / ≈5000 (openai) tokens —
1063
+ # 6000 overestimates safely, and overestimating only compacts early.
1064
+ HOSTED_SEARCH_PROVISIONAL_TOKENS = 6000
1065
+
1066
+ def _update_hosted_search_residual(self, assistant_message: Message) -> None:
1067
+ """Track server-injected hosted-search content from billed usage.
1068
+
1069
+ Search-bearing responses bump the estimate by a provisional per-call
1070
+ constant (their own billing telescopes internal rounds, so the direct
1071
+ residual would overshoot and could trip compaction spuriously). Clean
1072
+ responses — single invocation, so ``billed − counted`` is exact —
1073
+ replace it with the measurement. No-ops for sessions that never
1074
+ searched, keeping the known ±tokenizer-drift band out of the gauge.
1075
+ """
1076
+ content = assistant_message.content if isinstance(assistant_message.content, list) else []
1077
+ new_calls = sum(1 for block in content if isinstance(block, WebSearchCallBlock))
1078
+ if new_calls:
1079
+ self._hosted_injected_tokens += self.HOSTED_SEARCH_PROVISIONAL_TOKENS * new_calls
1080
+ return
1081
+ if self._hosted_injected_tokens <= 0 and not self._history_contains_hosted_search():
1082
+ return
1083
+ billed = (assistant_message.usage_metadata or {}).get("prompt_tokens")
1084
+ counted = self._last_raw_context_count
1085
+ if not isinstance(billed, int) or counted is None:
1086
+ return
1087
+ self._hosted_injected_tokens = max(0, billed - counted)
1088
+
1089
+ def _history_contains_hosted_search(self) -> bool:
1090
+ for message in self.history:
1091
+ content = getattr(message, "content", None)
1092
+ if isinstance(content, list) and any(isinstance(block, WebSearchCallBlock) for block in content):
1093
+ return True
1094
+ return False
1095
+
953
1096
  async def _send_context_update(self, token_count: TokenCount) -> None:
954
1097
  """Send an event to update the UI about current context usage."""
955
1098
  usage_percentage = (token_count.input_tokens / self.model_context_length) * 100
@@ -977,6 +1120,11 @@ class BaseAgent(LogMixin):
977
1120
  show progress, then recounts + emits a context_update so the gauge
978
1121
  refreshes. Returns the structured outcome.
979
1122
  """
1123
+ # Compacted-away web_search_call blocks stop being replayed, so the
1124
+ # server stops restoring their content. Reset the hosted-search residual
1125
+ # rather than carrying a stale figure; if search blocks survive in the
1126
+ # verbatim tail, the next clean response re-measures it.
1127
+ self._hosted_injected_tokens = 0
980
1128
 
981
1129
  async def on_info(message: str) -> None:
982
1130
  await self.log_info(message, sender=self.agent_name)
@@ -2093,6 +2241,7 @@ class BaseAgent(LogMixin):
2093
2241
  model=self.primary_model_config.model,
2094
2242
  tools=self.tool_collection.get_tool_list(),
2095
2243
  thinking=self.primary_model_config.thinking_effort,
2244
+ hosted_web_search=self.hosted_web_search_active,
2096
2245
  ),
2097
2246
  )
2098
2247
  async with stream_cm as stream:
@@ -2135,8 +2284,46 @@ class BaseAgent(LogMixin):
2135
2284
 
2136
2285
  await self.on_tool_use_start(event.tool_call_delta)
2137
2286
 
2287
+ elif event.type == "hosted_tool_call" and event.tool_call_delta:
2288
+ # A server-side web_search call completed on the
2289
+ # provider's infrastructure — no local execution.
2290
+ # Surface it as a normal tool_call/tool_result pair
2291
+ # so every transcript view renders it.
2292
+ #
2293
+ # Close the current thinking/response segment first
2294
+ # and rotate both uuids: transcript consumers key
2295
+ # streamed entries by uuid, so without rotation the
2296
+ # post-search reasoning folds into the bubble above
2297
+ # these rows instead of opening a new one below
2298
+ # them. Guards mirror the end-of-stream flushes: an
2299
+ # unopened thinking segment yields nothing, while
2300
+ # the response flush is unconditional (an empty
2301
+ # complete response chunk is a documented no-op for
2302
+ # every consumer) so a partially streamed response
2303
+ # entry is never stranded incomplete by rotation.
2304
+ if thinking_started or current_thinking:
2305
+ yield {
2306
+ "type": "thinking",
2307
+ "content": current_thinking,
2308
+ "complete": True,
2309
+ "uuid": thinking_uuid,
2310
+ }
2311
+ current_thinking = ""
2312
+ thinking_started = False
2313
+ thinking_uuid = str(uuid.uuid4())
2314
+ yield {
2315
+ "type": "response",
2316
+ "content": current_response,
2317
+ "complete": True,
2318
+ "uuid": response_uuid,
2319
+ }
2320
+ current_response = ""
2321
+ response_uuid = str(uuid.uuid4())
2322
+ await self._emit_hosted_tool_call(event.tool_call_delta)
2323
+
2138
2324
  assistant_message = await stream.get_final_message()
2139
2325
  self._normalize_freeform_tool_calls(assistant_message)
2326
+ self._update_hosted_search_residual(assistant_message)
2140
2327
  assistant_message.usage_metadata["edit_protocol"] = self.edit_protocol.value
2141
2328
  response_output_tokens = get_output_tokens(
2142
2329
  assistant_message.usage_metadata,
@@ -22,6 +22,7 @@ from kolega_code.llm.models import (
22
22
  ThinkingBlock,
23
23
  ToolCall,
24
24
  ToolResult,
25
+ WebSearchCallBlock,
25
26
  )
26
27
  from kolega_code.llm.specs import prior_reasoning_is_replayable
27
28
  from kolega_code.utils import images as image_utils
@@ -336,7 +337,7 @@ def _adapt_content_blocks_for_provider(
336
337
  )
337
338
  adapted.append(adapted_block)
338
339
  changed = changed or image_changed
339
- elif isinstance(block, (ThinkingBlock, RedactedThinkingBlock, ResponsesReasoningBlock)):
340
+ elif isinstance(block, (ThinkingBlock, RedactedThinkingBlock, ResponsesReasoningBlock, WebSearchCallBlock)):
340
341
  if _preserve_reasoning_block(
341
342
  block,
342
343
  source_provider=source_provider,
@@ -414,20 +414,36 @@ class EvalKernelManager:
414
414
  thread_id: str,
415
415
  project_path: Path,
416
416
  config: object,
417
+ scratchpad_dir: Optional[Path] = None,
417
418
  ) -> "EvalKernelManager":
418
419
  """Shared manager for an agent session; sub-agents join the same one."""
419
420
  key = (workspace_id, thread_id)
420
421
  manager = cls._registry.get(key)
421
422
  if manager is None or manager._shutdown:
422
- manager = cls(workspace_id=workspace_id, thread_id=thread_id, project_path=project_path, config=config)
423
+ manager = cls(
424
+ workspace_id=workspace_id,
425
+ thread_id=thread_id,
426
+ project_path=project_path,
427
+ config=config,
428
+ scratchpad_dir=scratchpad_dir,
429
+ )
423
430
  cls._registry[key] = manager
424
431
  return manager
425
432
 
426
- def __init__(self, *, workspace_id: str, thread_id: str, project_path: Path, config: object) -> None:
433
+ def __init__(
434
+ self,
435
+ *,
436
+ workspace_id: str,
437
+ thread_id: str,
438
+ project_path: Path,
439
+ config: object,
440
+ scratchpad_dir: Optional[Path] = None,
441
+ ) -> None:
427
442
  self.workspace_id = workspace_id
428
443
  self.thread_id = thread_id
429
444
  self.project_path = Path(project_path)
430
445
  self.config = config
446
+ self.scratchpad_dir = Path(scratchpad_dir) if scratchpad_dir else None
431
447
  self.session_id = uuid.uuid4().hex
432
448
  self._kernels: Dict[str, BaseKernel] = {}
433
449
  self._locks: Dict[str, asyncio.Lock] = {}
@@ -437,6 +453,17 @@ class EvalKernelManager:
437
453
 
438
454
  # -- kernels ------------------------------------------------------------
439
455
 
456
+ def _kernel_child_env(self) -> Dict[str, str]:
457
+ """Base env for kernel subprocesses, shared by the py and js kernels.
458
+
459
+ KOLEGA_SCRATCHPAD matches the variable injected into terminal sessions,
460
+ so eval cells and shell commands share one durable session location.
461
+ """
462
+ env = build_child_env()
463
+ if self.scratchpad_dir is not None:
464
+ env["KOLEGA_SCRATCHPAD"] = str(self.scratchpad_dir)
465
+ return env
466
+
440
467
  def _env_manager_for_thread(self) -> EvalEnvironmentManager:
441
468
  if self._env_manager is None:
442
469
  env_path_raw = _cfg_str(self.config, "eval_env_path")
@@ -464,7 +491,7 @@ class EvalKernelManager:
464
491
 
465
492
  env_info = await self._ensure_env()
466
493
  bridge = await ToolBridge.ensure()
467
- kernel_env = build_child_env()
494
+ kernel_env = self._kernel_child_env()
468
495
  kernel_env.update(
469
496
  {
470
497
  "KOLEGA_TOOL_BRIDGE_URL": bridge.url,
@@ -502,7 +529,7 @@ class EvalKernelManager:
502
529
  package_json = js_home / "package.json"
503
530
  if not package_json.exists():
504
531
  package_json.write_text("{}\n", encoding="utf-8")
505
- kernel_env = build_child_env()
532
+ kernel_env = self._kernel_child_env()
506
533
  npm_cmd = runtime.npm_install_cmd(js_home)
507
534
  kernel_env.update(
508
535
  {
@@ -2,6 +2,8 @@ You have a private scratchpad working directory for this session at:
2
2
 
3
3
  `{{ scratchpad_path }}`
4
4
 
5
+ This path is also exported as the environment variable `KOLEGA_SCRATCHPAD` in every shell command and eval kernel this session runs (login shells included), so in commands and scripts refer to it as `$KOLEGA_SCRATCHPAD` instead of re-declaring or retyping the literal path.
6
+
5
7
  Use it for throwaway work that must not touch the user's working tree: one-off scripts, ad-hoc virtual environments, downloaded files, extracted archives, generated intermediates, and log captures. This is the only location outside the working directory where you may create files without asking.
6
8
 
7
9
  Rules: