kolega-code 0.26.10__tar.gz → 0.27.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 (375) hide show
  1. {kolega_code-0.26.10 → kolega_code-0.27.0}/CHANGELOG.md +162 -0
  2. {kolega_code-0.26.10 → kolega_code-0.27.0}/PKG-INFO +1 -1
  3. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/baseagent.py +2 -4
  6. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/coder.py +5 -6
  7. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/conversation.py +2 -2
  8. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +1 -1
  9. kolega_code-0.27.0/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +6 -0
  10. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +1 -1
  11. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +1 -9
  12. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +1 -1
  13. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +3 -3
  14. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +3 -1
  15. kolega_code-0.27.0/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +11 -0
  16. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +1 -1
  17. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompts.py +0 -1
  18. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/edit_tool.py +22 -24
  19. kolega_code-0.27.0/kolega_code/agent/tool_backend/read_file_tool.py +155 -0
  20. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/terminal_tool.py +5 -4
  21. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tools.py +254 -619
  22. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/config.py +1 -19
  23. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/file_index.py +67 -3
  24. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/main.py +1 -6
  25. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/provider_registry.py +0 -1
  26. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/settings.py +9 -4
  27. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/skills.py +58 -171
  28. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/agent_runtime.py +1 -1
  29. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/config.py +0 -9
  30. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/ledger.py +1 -1
  31. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/usage.py +14 -0
  32. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/permissions.py +1 -0
  33. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/tools/__init__.py +2 -0
  34. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/tools/core.py +15 -1
  35. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/tools/definitions.py +54 -1
  36. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/tools/param_aliases.py +52 -12
  37. {kolega_code-0.26.10 → kolega_code-0.27.0}/pyproject.toml +1 -1
  38. kolega_code-0.26.10/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -13
  39. kolega_code-0.26.10/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -7
  40. kolega_code-0.26.10/kolega_code/agent/tool_backend/glob_tool.py +0 -533
  41. kolega_code-0.26.10/kolega_code/agent/tool_backend/list_directory_tool.py +0 -304
  42. kolega_code-0.26.10/kolega_code/agent/tool_backend/read_file_tool.py +0 -160
  43. kolega_code-0.26.10/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -870
  44. kolega_code-0.26.10/kolega_code/agent/tool_backend/think_hard_tool.py +0 -220
  45. {kolega_code-0.26.10 → kolega_code-0.27.0}/.gitignore +0 -0
  46. {kolega_code-0.26.10 → kolega_code-0.27.0}/CONTRIBUTING.md +0 -0
  47. {kolega_code-0.26.10 → kolega_code-0.27.0}/LICENSE +0 -0
  48. {kolega_code-0.26.10 → kolega_code-0.27.0}/MIGRATION.md +0 -0
  49. {kolega_code-0.26.10 → kolega_code-0.27.0}/README.md +0 -0
  50. {kolega_code-0.26.10 → kolega_code-0.27.0}/RELEASING.md +0 -0
  51. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  52. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  53. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  54. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  55. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  56. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  57. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  58. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  59. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  60. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  61. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  62. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  63. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  64. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  65. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  66. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  67. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  68. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  69. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  70. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  71. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  72. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  73. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  74. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  75. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  76. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  77. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  78. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  79. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  80. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  81. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  82. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  83. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  84. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  85. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  86. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  87. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  88. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  89. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  90. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  91. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  92. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  93. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  94. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  95. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  96. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  97. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  98. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  99. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  100. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  101. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  102. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  103. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/browseragent.py +0 -0
  104. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/common.py +0 -0
  105. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/compression.py +0 -0
  106. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/context.py +0 -0
  107. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/custom_agents.py +0 -0
  108. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/edit_protocols.py +0 -0
  109. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/errors.py +0 -0
  110. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/__init__.py +0 -0
  111. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/bridge.py +0 -0
  112. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  113. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  114. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/env.py +0 -0
  115. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  116. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/kernel.py +0 -0
  117. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/prelude.js +0 -0
  118. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/prelude.py +0 -0
  119. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/protocol.py +0 -0
  120. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  121. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/runner.js +0 -0
  122. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/eval/runner.py +0 -0
  123. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/generalagent.py +0 -0
  124. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/goal.py +0 -0
  125. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/investigationagent.py +0 -0
  126. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/model_routing.py +0 -0
  127. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  128. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  129. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/budget.py +0 -0
  130. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/context.py +0 -0
  131. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/errors.py +0 -0
  132. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/executor.py +0 -0
  133. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/guide.py +0 -0
  134. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/journal.py +0 -0
  135. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  136. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/orchestration/types.py +0 -0
  137. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/planningagent.py +0 -0
  138. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_dump.py +0 -0
  139. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_overrides.py +0 -0
  140. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_provider.py +0 -0
  141. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  142. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  143. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  144. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  145. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  146. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  147. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  148. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  149. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  150. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  151. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  152. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  153. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  154. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  155. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  156. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  157. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  158. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  159. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  160. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  161. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  162. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  163. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  164. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  165. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  166. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  167. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  168. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  169. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  170. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  171. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  172. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  173. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  174. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  175. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  176. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  177. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  178. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  179. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  180. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  181. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  182. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  183. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  184. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  185. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  186. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  187. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  188. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  189. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  190. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  191. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  192. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  193. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  194. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  195. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  196. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  197. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/utils/commands.py +0 -0
  198. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/agent/volatile_context.py +0 -0
  199. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/auth/__init__.py +0 -0
  200. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/auth/_jwt.py +0 -0
  201. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  202. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/auth/constants.py +0 -0
  203. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/auth/tokens.py +0 -0
  204. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/__init__.py +0 -0
  205. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/framing.py +0 -0
  206. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/installer.py +0 -0
  207. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/manager.py +0 -0
  208. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/multiplex.py +0 -0
  209. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/native_host.py +0 -0
  210. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/protocol.py +0 -0
  211. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/registry.py +0 -0
  212. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/browser_extension/runtime.py +0 -0
  213. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/__init__.py +0 -0
  214. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/app.py +0 -0
  215. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/ask_output.py +0 -0
  216. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/browser_backend.py +0 -0
  217. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/clipboard_image.py +0 -0
  218. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/connection.py +0 -0
  219. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/cron.py +0 -0
  220. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/diagnostics.py +0 -0
  221. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/goal.py +0 -0
  222. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/loop.py +0 -0
  223. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/mentions.py +0 -0
  224. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/messages.py +0 -0
  225. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/model_catalog.py +0 -0
  226. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/model_connection.py +0 -0
  227. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/plan_artifacts.py +0 -0
  228. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/session_event_store.py +0 -0
  229. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/session_journal.py +0 -0
  230. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/session_store.py +0 -0
  231. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/session_usage.py +0 -0
  232. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/slash_commands.py +0 -0
  233. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/theme.py +0 -0
  234. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/__init__.py +0 -0
  235. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/app_base.py +0 -0
  236. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  237. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  238. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/constants.py +0 -0
  239. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/custom_model.py +0 -0
  240. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  241. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  242. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  243. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  244. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/session_diff.py +0 -0
  245. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/settings_panel.py +0 -0
  246. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/settings_screen.py +0 -0
  247. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/state.py +0 -0
  248. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  249. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/styles.tcss +0 -0
  250. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  251. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  252. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/transcript.py +0 -0
  253. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/tui/widgets.py +0 -0
  254. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/cli/updater.py +0 -0
  255. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/events.py +0 -0
  256. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/git_env.py +0 -0
  257. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/__init__.py +0 -0
  258. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/backends.py +0 -0
  259. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/config.py +0 -0
  260. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/dispatcher.py +0 -0
  261. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/events.py +0 -0
  262. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/matcher.py +0 -0
  263. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/hooks/outcome.py +0 -0
  264. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/client.py +0 -0
  265. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/exceptions.py +0 -0
  266. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/instrumented_client.py +0 -0
  267. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/models.py +0 -0
  268. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/__init__.py +0 -0
  269. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  270. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/anthropic.py +0 -0
  271. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/base.py +0 -0
  272. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  273. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  274. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/google.py +0 -0
  275. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/models.py +0 -0
  276. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/openai.py +0 -0
  277. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  278. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/providers/responses_common.py +0 -0
  279. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/ratelimit.py +0 -0
  280. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/__init__.py +0 -0
  281. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/accessors.py +0 -0
  282. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  283. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  284. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  285. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  286. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  287. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  288. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  289. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  290. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  291. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  292. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  293. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  294. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  295. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  296. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  297. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  298. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/thinking.py +0 -0
  299. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/specs/types.py +0 -0
  300. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/timeouts.py +0 -0
  301. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  302. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/local_state.py +0 -0
  303. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/__init__.py +0 -0
  304. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/config.py +0 -0
  305. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/oauth.py +0 -0
  306. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/service.py +0 -0
  307. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/state.py +0 -0
  308. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/tools.py +0 -0
  309. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/mcp/transport.py +0 -0
  310. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/__init__.py +0 -0
  311. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/identity.py +0 -0
  312. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/manager.py +0 -0
  313. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/manifest.py +0 -0
  314. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/markdown.py +0 -0
  315. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/models.py +0 -0
  316. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/protocol.py +0 -0
  317. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/memory/registry.py +0 -0
  318. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/models/__init__.py +0 -0
  319. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  320. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/runtime.py +0 -0
  321. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/README.md +0 -0
  322. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/__init__.py +0 -0
  323. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  324. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/base.py +0 -0
  325. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/browser.py +0 -0
  326. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/event_loop.py +0 -0
  327. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/filesystem.py +0 -0
  328. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/local.py +0 -0
  329. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/serializer.py +0 -0
  330. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/terminal.py +0 -0
  331. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/sandbox/utils.py +0 -0
  332. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/scratchpad.py +0 -0
  333. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/security/__init__.py +0 -0
  334. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/security/secrets.py +0 -0
  335. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/base.py +0 -0
  336. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/browser.py +0 -0
  337. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/file_system.py +0 -0
  338. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/html.py +0 -0
  339. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/__init__.py +0 -0
  340. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/client.py +0 -0
  341. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/config.py +0 -0
  342. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/detector.py +0 -0
  343. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  344. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/edits.py +0 -0
  345. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/manager.py +0 -0
  346. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/registry.py +0 -0
  347. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/lsp/registry.yaml +0 -0
  348. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/snapshots.py +0 -0
  349. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/terminal.py +0 -0
  350. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/terminal_buffer.py +0 -0
  351. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/services/workspace_scan.py +0 -0
  352. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/__init__.py +0 -0
  353. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/control.py +0 -0
  354. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/inmemory.py +0 -0
  355. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/projection.py +0 -0
  356. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/recording.py +0 -0
  357. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/runtime.py +0 -0
  358. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/session/store.py +0 -0
  359. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/testing/__init__.py +0 -0
  360. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/testing/store_conformance.py +0 -0
  361. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/tools/registry.py +0 -0
  362. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/utils/__init__.py +0 -0
  363. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/utils/images.py +0 -0
  364. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/__init__.py +0 -0
  365. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/assets/fold.js +0 -0
  366. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/assets/player.css +0 -0
  367. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/assets/player.html +0 -0
  368. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/assets/player.js +0 -0
  369. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/bundle.py +0 -0
  370. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/hosting.py +0 -0
  371. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/redaction.py +0 -0
  372. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/server.py +0 -0
  373. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/singlefile.py +0 -0
  374. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/web/theme_css.py +0 -0
  375. {kolega_code-0.26.10 → kolega_code-0.27.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,168 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.27.0 - 2026-08-06
10
+
11
+ ### Changed
12
+
13
+ - The `eval`, `exec_command`, and `lsp` tool descriptions shipped to model
14
+ providers are slimmer (about 450 cl100k tokens less across the three,
15
+ roughly 8% of the whole tool payload): prose now states decision rules and
16
+ contracts instead of restating parameter schema text, `eval`'s JavaScript
17
+ prelude folds to "same helpers as Python, camelCase" with only the
18
+ JS-specific pitfalls spelled out, `lsp`'s operation list groups the seven
19
+ operations that share the `(path, line, symbol)` arguments onto one line,
20
+ and `exec_command`'s `timeout`-alias note is gone (the alias layer absorbs
21
+ it silently). No parameter names, types, or presence change, and no
22
+ behavior changes ride along.
23
+
24
+ - Tool definitions sent to model providers no longer duplicate parameter
25
+ documentation. Every tool docstring's `Args:` section is still parsed into
26
+ per-parameter schema descriptions, but the wire description no longer also
27
+ carries the whole section verbatim (and the schema descriptions no longer
28
+ include the raw docstring continuation-line indentation). Tools whose
29
+ parameters are not fully documented in their schema — freeform tools and
30
+ tools with enum-only schema properties such as the browser tools' `button`,
31
+ `action`, `level`, `part`, `image_type`, and `scale` — keep their `Args:`
32
+ block, since it is the only place those parameters are documented.
33
+
34
+ - The per-type agent dispatch tools (`dispatch_general_agent`,
35
+ `dispatch_investigation_agent`, `dispatch_browser_agent`,
36
+ `dispatch_coding_agent`, and `dispatch_custom_agent`) are consolidated into a
37
+ single `dispatch_agent(agent_type, task, model_override?, browser_target?)`
38
+ tool. `agent_type` is an enum computed per session from the same conditions
39
+ that previously gated the individual tools: `general` and `investigation`
40
+ whenever dispatch is available, `browser` only when the browser-agent model
41
+ supports vision, `coding` where the coding dispatch was previously offered
42
+ (never for the coder itself), and custom agent names when definitions are
43
+ discovered. The description documents the shared dispatch mechanics once plus
44
+ one line per available agent type, and an unavailable `agent_type` returns an
45
+ error listing the valid values. Old sessions that used the removed tool names
46
+ still restore and display normally.
47
+
48
+ - All terminal-capable agents (coder, planning, investigation, general) now
49
+ share a terminal-tools prompt section with codex-style guidance: prefer
50
+ `rg` / `rg --files` over `grep`/`find` when searching for text or files (it is
51
+ much faster; use alternatives if `rg` is not found), and do not use Python
52
+ scripts (or `eval`) to print chunks of a file — use the file-reading tools
53
+ instead.
54
+ - The `resolve` tool — which applies or discards a pending `lsp_edit(apply: false)`
55
+ preview — is now gated like the other LSP tools. With LSP disabled (via
56
+ settings, `KOLEGA_CODE_LSP`, or `--lsp off`) it is removed from the model's
57
+ toolset entirely, since pending actions can only be created while LSP is on.
58
+ Applying a pending action with `resolve` now also goes through the same
59
+ edit-permission prompt as `edit`, `lsp_edit`, and `write`.
60
+ - The two file-read tools are merged into one `read(file_path, offset?, limit?)`
61
+ tool. `offset` is the 1-indexed first line (default 1) and `limit` bounds the
62
+ number of lines; omitted parameters read from the top. Output is truncated to
63
+ 2000 lines or 50KB — whichever binds first — snapped to line boundaries, with
64
+ actionable notices such as "[Showing lines a-b of N (50KB limit). Use
65
+ offset=b+1 to continue.]" instead of the old line-only warning and
66
+ 100,000-character backstop. A single line larger than the 50KB budget gets an
67
+ explicit message suggesting `rg` / `exec_command` for targeted extraction.
68
+ `path` is accepted at the dispatch boundary as an alias for the canonical
69
+ `file_path`.
70
+
71
+ - `write(path=…)` now also succeeds under the claude_code edit protocol, where
72
+ `write` binds to `claude_write(file_path, content)`: `path` is accepted at
73
+ the dispatch boundary as an alias for `file_path`, matching every other file
74
+ tool. Under the search/replace protocol `path` stays the canonical
75
+ parameter and passes through untouched — alias resolution is signature-aware
76
+ and never rewrites an argument name the bound tool itself accepts.
77
+
78
+ - A successful whole-file `write` (including `hashline_write` and `apply_patch`'s
79
+ Add File) now records the just-written contents as read, so the read-before-edit
80
+ guard accepts a subsequent edit without a fresh read — exactly as it would
81
+ right after a read. Staleness tracking is unchanged: a file modified after the
82
+ write still requires a fresh read before editing.
83
+ - The three skill host tools (`list_skills`, `activate_skill`, and
84
+ `read_skill_resource`) are consolidated into a single `skill` tool with the
85
+ same contract as the old `activate_skill`: it takes the skill name (without a
86
+ leading slash) and returns the activation envelope with the skill's
87
+ instructions, its absolute directory, and the resource file list. Activating
88
+ an already-active skill short-circuits as before, and an unknown name now
89
+ lists close matches (prefix first, then fuzzy) from the catalog so a
90
+ mistyped activation self-corrects in one turn. The in-prompt skill roster
91
+ always lists every skill by name: description text is shed first when the
92
+ metadata budget binds, and skills are never omitted wholesale.
93
+
94
+ ### Removed
95
+
96
+ - The `read_entire_file` and `read_file_section` tools are gone, replaced by the
97
+ merged `read` tool above. Deleted: the `ReadFileTool.read_entire_file` /
98
+ `read_file_section` methods and their `read_only_tools` registrations, the
99
+ truncation notices that named `read_file_section`, and the stale
100
+ `dispatch_investigation_agent` docstring tool list. Existing session
101
+ histories keep the old tool names as recorded data and render as-is (restore
102
+ is name-agnostic).
103
+
104
+ - The file-discovery tools are gone from the agent toolset: `glob` (which had
105
+ replaced `list_directory` and `find_files_by_pattern`), and `search_codebase`.
106
+ File and text discovery is now done through the terminal with `rg` /
107
+ `rg --files` (falling back to `find`/`grep`). Deleted: the `GlobTool` and
108
+ `SearchCodebaseTool` backends (the underlying `workspace_scan` service stays),
109
+ the `ToolCollection.glob` / `ToolCollection.search_codebase` methods and their
110
+ `read_only_tools` registrations, the stale `dispatch_investigation_agent`
111
+ docstring tool list (now naming the real surface, including terminal access),
112
+ and the `search_codebase` name from hashline history adaptation.
113
+ `@`-mention autocomplete (`cli/file_index.py`) keeps its exclusions by
114
+ inlining the constants it borrowed. Permission rules and custom-agent
115
+ allowlists naming the removed tools must be updated to the terminal tools
116
+ (`exec_command`, `write_stdin`, `kill_command`, `list_sessions`). Existing
117
+ session histories keep the old tool names as recorded data and render as-is.
118
+
119
+ - The `sleep` tool is gone from the agent toolset: its blind wall-clock wait is
120
+ strictly dominated by `write_stdin`'s empty-input poll, which waits for more
121
+ output or process exit and returns early when the process finishes. The
122
+ `yield_time_ms` clamp semantics (250–30000 ms when writing, 5000–300000 ms
123
+ when polling) moved from the `write_stdin` docstring body into its parameter
124
+ description so the poll path stays discoverable. Existing session histories
125
+ keep the old tool name as recorded data and render as-is.
126
+
127
+ - The `think_hard` tool is gone from the agent toolset, along with the thinking
128
+ model slot that powered it. Deleted: the `ThinkHardTool` backend and its
129
+ `auxiliary/tools/think_hard.system.md` prompt template, the
130
+ `ToolCollection.think_hard` method and its `read_only_tools` registration, the
131
+ `THINK_HARD_PROMPT` constant, and the `thinking_config` model slot itself.
132
+ `prompt` hooks now select only `"fast"` or `"long"`; the
133
+ `--thinking-provider`/`--thinking-model` flags, the
134
+ `KOLEGA_CODE_THINKING_PROVIDER`/`KOLEGA_CODE_THINKING_MODEL` env vars, and the
135
+ Settings Thinking slot row were removed, and a saved `thinking` slot entry in
136
+ `settings.json` is ignored on load. The active model's own thinking effort
137
+ (`--thinking-effort`, `KOLEGA_CODE_THINKING_EFFORT`) is unaffected.
138
+
139
+ - The `get_host` tool is gone from the local toolset. It needs a sandbox host
140
+ provider, so it is now offered only when a terminal manager carrying a
141
+ `sandbox` attribute is injected (cloud sandbox deployments), and the
142
+ localhost fallback branch in the handler is deleted — a registered
143
+ `get_host` always has a sandbox. The gate duck-types on the attribute rather
144
+ than `isinstance`, so kolega-code-e2b's injected `SandboxTerminalManager`
145
+ (possibly subclassed from a pinned older version) keeps qualifying. Existing
146
+ session histories that recorded `get_host` calls keep them as data and
147
+ render as-is (restore is name-agnostic).
148
+
149
+ - The `list_skills`, `activate_skill`, and `read_skill_resource` host tools are
150
+ gone, replaced by the single `skill` tool above. Deleted:
151
+ `SkillCatalog.read_resource` and its truncation cap and traversal guard
152
+ (skill resources are read with the ordinary `read` tool, whose `file_path`
153
+ is relative to the absolute skill directory in the activation output), the
154
+ model-facing list query surface (`format_model_catalog`), and the
155
+ omitted-skills budget pathway in the prompt roster. Existing session
156
+ histories keep the old tool names as recorded data and render as-is
157
+ (restore is name-agnostic).
158
+
159
+ ### Fixed
160
+
161
+ - Kimi-family usage is no longer dropped when a request is served entirely from
162
+ the provider's prompt cache. `kimi-for-coding` / `moonshot` report
163
+ `input_tokens: -1` as a sentinel for "no uncached input tokens" on a full
164
+ cache hit; the strict usage validator previously classified that as malformed
165
+ and nulled the whole record, silently removing both input and output tokens
166
+ from session accounting for those turns. The sentinel is now interpreted as
167
+ zero, and the inclusive input total is reconstructed from the cache fields
168
+ (verified live: `-1` + 33 cached = 33 total, matching the same prompt's
169
+ partial-cache report of 27 uncached + 6 cached).
170
+
9
171
  ## 0.26.10 - 2026-08-05
10
172
 
11
173
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.26.10
3
+ Version: 0.27.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/
@@ -151,4 +151,4 @@ __all__ = [
151
151
  "parse_git_status_output",
152
152
  ]
153
153
 
154
- __version__ = "0.26.10"
154
+ __version__ = "0.27.0"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.26.10"
54
+ __version__ = "0.27.0"
@@ -1603,15 +1603,13 @@ class BaseAgent(LogMixin):
1603
1603
  async def _run_hook_prompt(self, prompt_text: str, model_hint: Optional[str]) -> str:
1604
1604
  """Run a `prompt` hook: a single completion on a chosen model slot.
1605
1605
 
1606
- ``model_hint`` selects a configured slot ("fast" (default), "long", or
1607
- "thinking"); arbitrary model ids are not used here to keep provider/API-key
1606
+ ``model_hint`` selects a configured slot ("fast" (default) or "long");
1607
+ arbitrary model ids are not used here to keep provider/API-key
1608
1608
  pairing correct across kolega's multi-provider setup.
1609
1609
  """
1610
1610
  slot = (model_hint or "fast").lower()
1611
1611
  if slot in ("long", "main", "long_context"):
1612
1612
  model_config = self.config.long_context_config
1613
- elif slot == "thinking":
1614
- model_config = self.config.thinking_config
1615
1613
  else:
1616
1614
  model_config = self.config.fast_config
1617
1615
 
@@ -123,27 +123,26 @@ class CoderAgent(BaseAgent, LogMixin):
123
123
  memory_enabled=memory_enabled,
124
124
  )
125
125
 
126
- # Configure tool collection with custom coder agent tools
126
+ # Configure tool collection with custom coder agent tools. The
127
+ # coder_agent_tools dispatch group already omits the "coding"
128
+ # agent_type, so the coder never dispatches itself.
127
129
  tool_exclusions = [
128
130
  "execute_terminal_command",
129
131
  "get_tool_list",
130
132
  "log_error",
131
133
  "log_info",
132
- # Exclude task-specific dispatch tools since coder shouldn't call itself or other agents
133
- "dispatch_coding_agent",
134
134
  ]
135
135
  mode_value = self.agent_mode.value if isinstance(self.agent_mode, AgentMode) else self.agent_mode
136
136
  if mode_value in (AgentMode.CLI.value, AgentMode.ASK.value):
137
137
  tool_exclusions.extend(["build_backend", "build_frontend"])
138
- if sub_agent:
139
- # A dispatched coder must not fan out into further sub-agents
140
- tool_exclusions.append("dispatch_general_agent")
141
138
 
142
139
  tool_config = ToolCollectionConfig(
143
140
  custom_tool_groups=["coder_agent_tools"],
144
141
  tool_exclusions=tool_exclusions,
145
142
  include_memory_tools=True,
146
143
  memory_write_access=True,
144
+ # A dispatched coder must not fan out into further general sub-agents
145
+ excluded_agent_types=["general"] if sub_agent else None,
147
146
  )
148
147
 
149
148
  self.tool_collection = ToolCollection(
@@ -397,7 +397,7 @@ def _adapt_content_blocks_for_provider(
397
397
  call_protocol = (tool_call_protocols or {}).get(
398
398
  block.tool_use_id, _source_edit_protocol(block, source_usage_metadata)
399
399
  )
400
- is_hashline_read = block.name in {"read_entire_file", "read_file_section", "search_codebase"}
400
+ is_hashline_read = block.name == "read"
401
401
  if (
402
402
  is_hashline_read
403
403
  and call_protocol == "hashline_v2"
@@ -407,7 +407,7 @@ def _adapt_content_blocks_for_provider(
407
407
  adapted.append(
408
408
  _tool_result_with_content(
409
409
  block,
410
- strip_hashline_read_output(block.content, search=block.name == "search_codebase"),
410
+ strip_hashline_read_output(block.content, search=False),
411
411
  )
412
412
  )
413
413
  changed = True
@@ -2,6 +2,6 @@ The current approved implementation plan is persisted as a private Markdown arti
2
2
 
3
3
  `{{ plan_artifact_path }}`
4
4
 
5
- If the conversation has been compacted, context seems incomplete, or you need exact acceptance criteria, read the artifact with `read_entire_file` (or `read_file_section` if the file is large) before continuing.
5
+ If the conversation has been compacted, context seems incomplete, or you need exact acceptance criteria, read the artifact with `read` (using offset/limit if the file is large) before continuing.
6
6
 
7
7
  Treat this artifact as read-only. Do not edit or overwrite it.
@@ -0,0 +1,6 @@
1
+ The CLI provides Agent Skills discovered from the project and user skill directories.
2
+ Activate with the `skill` tool before applying a skill's workflow; users can also invoke skills with `/skill-name`.
3
+
4
+ Available skills:
5
+
6
+ {{ catalog }}
@@ -104,7 +104,7 @@ URLs refer to services running on your own machine:
104
104
 
105
105
  1. ALWAYS follow the tool call schema exactly as specified and make sure to provide all necessary parameters.
106
106
  2. If the USER asks you to disclose your tools, ALWAYS respond with the helpful description provided.
107
- 3. **NEVER refer to tool names when speaking to the USER.** For example, instead of saying 'I need to use the read_file_section tool to inspect your file', just say 'I will inspect your file'.
107
+ 3. **NEVER refer to tool names when speaking to the USER.** For example, instead of saying 'I need to use the read tool to inspect your file', just say 'I will inspect your file'.
108
108
  4. Before calling tools, first explain to the USER why you are calling them.
109
109
  5. WHENEVER YOU OPEN A BROWSER OR TERMINAL, ALWAYS CLOSE IT WHEN DONE.
110
110
 
@@ -65,15 +65,7 @@ Treat completion as unproven until you have checked it against every requirement
65
65
 
66
66
  Deliver the complete, working result. NEVER ship stubs, placeholders, mocks, no-ops, `TODO: implement`, or partial scaffolding as if finished. NEVER relabel unfinished work as "MVP", "v1", or "foundation" to imply completion — if it is not done, say so, do not pretend. NEVER silently shrink scope or substitute a narrower, easier, or merely-compatible task than the one you were given. If the task specifies a file at a particular path, produce exactly that file at exactly that path.
67
67
 
68
- ## Running Commands
69
-
70
- Prefer one-shot commands that terminate; run long-lived processes like dev servers and watchers in the background. When starting a development server, use a free port.
71
-
72
- {% if interactive %}
73
- Do not run destructive commands automatically. Treat commands that delete files, rewrite history, reset worktrees, install system dependencies, or make external state changes as requiring explicit user approval.
74
- {% else %}
75
- There is no user present to approve actions, so exercise judgment: do not run destructive commands — deleting files you did not create, rewriting git history, resetting the worktree, or making external state changes — unless the task explicitly requires them.
76
- {% endif %}
68
+ {% include 'system/includes/terminal_tools.md' %}
77
69
 
78
70
  ## Reuse Results
79
71
 
@@ -52,7 +52,7 @@ main agent - it will not see your intermediate steps. End with a complete, self-
52
52
  3. Any commands or checks you ran and their outcomes.
53
53
  4. Anything that failed, was skipped, or needs follow-up.
54
54
 
55
- ## **Running Commands**
55
+ {% include 'system/includes/terminal_tools.md' %}
56
56
 
57
57
  When requesting a command to be run, you will be asked to judge if it is appropriate to run without the USER's permission. A command is unsafe if it may have some destructive side-effects. Example unsafe side-effects include: deleting files, mutating state, installing system dependencies, making external requests, etc. You must NEVER NEVER run a command automatically if it could be unsafe. You cannot allow the USER to override your judgement on this. If a command is unsafe, do not run it automatically, even if the USER wants you to.
58
58
 
@@ -44,9 +44,9 @@ Do your best to complete the task you are given. If you need more information, u
44
44
  You must complete the task independently. Once your turn ends your last message will be returned to Kolega Code
45
45
  to take further action, so your last message should contain the task result.
46
46
 
47
- ## **Running Commands**
47
+ {% include 'system/includes/terminal_tools.md' %}
48
48
 
49
- You may run shell commands (e.g. `git log`, `grep`, build/lint/test commands) to investigate the codebase. Never use commands to modify the project — no editing files, installing dependencies, committing, pushing, or other side effects. Prefer read-only tools when they suffice. Commands are subject to the active permission mode and may require approval.
49
+ You may run shell commands (e.g. `git log`, `rg`, build/lint/test commands) to investigate the codebase, but never use them to modify the project — no editing files, installing dependencies, committing, pushing, or other side effects. Prefer read-only tools when they suffice. Commands are subject to the active permission mode and may require approval.
50
50
 
51
51
  ## **Communication Guidelines**
52
52
 
@@ -62,7 +62,7 @@ You may run shell commands (e.g. `git log`, `grep`, build/lint/test commands) to
62
62
 
63
63
  1. ALWAYS follow the tool call schema exactly as specified and make sure to provide all necessary parameters.
64
64
  2. If the USER asks you to disclose your tools, ALWAYS respond with the helpful description provided.
65
- 3. **NEVER refer to tool names when speaking to the USER.** For example, instead of saying 'I need to use the read_file_section tool to inspect your file', just say 'I will inspect your file'.
65
+ 3. **NEVER refer to tool names when speaking to the USER.** For example, instead of saying 'I need to use the read tool to inspect your file', just say 'I will inspect your file'.
66
66
  4. Before calling tools, first explain to the USER why you are calling them.
67
67
  5. You must ONLY use the tools in the scope of the "Working directory". NEVER expose Kolega Code's implementation.
68
68
 
@@ -14,9 +14,11 @@ Here is useful information about the environment:
14
14
  ## Operating Mode
15
15
 
16
16
  You are in planning mode. Do not implement code changes, create files, edit files, start servers, or perform other mutating actions.
17
- You may run shell commands (e.g. `git log`, `grep`, build/lint/test commands) to investigate the codebase and reduce ambiguity, but never use them to modify the project — no editing files, installing dependencies, committing, pushing, or other side effects. Prefer read-only tools when they suffice, and use `exec_command` only to inspect or validate.
17
+ You may run shell commands (e.g. `git log`, `rg`, build/lint/test commands) to investigate the codebase and reduce ambiguity, but never use them to modify the project — no editing files, installing dependencies, committing, pushing, or other side effects. Prefer read-only tools when they suffice, and use `exec_command` only to inspect or validate.
18
18
  Use read-only tools and investigative commands to inspect the repository and reduce ambiguity.
19
19
 
20
+ {% include 'system/includes/terminal_tools.md' %}
21
+
20
22
  When the plan is decision complete, call `write_plan` with the final markdown plan. Do not call `write_plan` while major product or implementation choices are still unresolved.
21
23
  If a planning turn ends with a complete new or revised implementation plan, submit it through `write_plan`; do not only print the plan in a normal assistant response.
22
24
  When user answers, constraints, or follow-up discussion change the plan, the next `write_plan` payload must be a complete replacement plan that incorporates those decisions and can be implemented without reading earlier discussion.
@@ -0,0 +1,11 @@
1
+ ## Running Commands
2
+
3
+ Prefer one-shot commands that terminate; run long-lived processes like dev servers and watchers in the background. When starting a development server, use a free port.
4
+
5
+ Do not run destructive commands automatically — deleting files, rewriting history, resetting worktrees, installing system dependencies, or making external state changes — unless a user has explicitly approved them or the task explicitly requires them.
6
+
7
+ ## Searching and Reading Files
8
+
9
+ When searching for text or files, prefer `rg` / `rg --files` over grep/find — it is much faster. If `rg` is not found, use alternatives.
10
+
11
+ Do not use python scripts (or `eval`) to print chunks of a file — use the file-reading tools instead.
@@ -1,7 +1,7 @@
1
1
  Implement the approved plan below. Follow it as the source of truth, but still inspect the code before editing and run appropriate checks.
2
2
  {% if plan_artifact_path %}
3
3
 
4
- The approved plan is also persisted at `{{ plan_artifact_path }}`. If the conversation is compacted or you need the exact plan again later, read that file with `read_entire_file` (or `read_file_section` if needed). Treat it as read-only.
4
+ The approved plan is also persisted at `{{ plan_artifact_path }}`. If the conversation is compacted or you need the exact plan again later, read that file with `read` (using offset/limit if needed). Treat it as read-only.
5
5
  {% endif %}
6
6
  {% if gigacode_enabled %}
7
7
 
@@ -37,7 +37,6 @@ def render_prompt_template(template_name: str, **variables: Any) -> str:
37
37
  return _prompt_template(template_name).render(**variables).strip()
38
38
 
39
39
 
40
- THINK_HARD_PROMPT = render_prompt_template("auxiliary/tools/think_hard.system.md")
41
40
  COMPRESSION_SUMMARY_SYSTEM_PROMPT = render_prompt_template("auxiliary/compression/summary.system.md")
42
41
  SHELL_SAFETY_SYSTEM_PROMPT = render_prompt_template("auxiliary/terminal/safety.system.md")
43
42
  SHELL_COMPRESSION_SYSTEM_PROMPT = render_prompt_template("auxiliary/terminal/output_summary.system.md")
@@ -67,6 +67,22 @@ class EditTool(BaseTool):
67
67
  if self.filesystem.exists(normalized) and self.filesystem.is_file(normalized):
68
68
  self._read_versions[normalized] = self._content_digest(self.filesystem.read_text(normalized))
69
69
 
70
+ def _write_file(self, path: str, content: str) -> None:
71
+ """Write ``content`` to ``path`` (creating parents) and record it as read-equivalent.
72
+
73
+ A successful whole-file write leaves the file's current contents known,
74
+ so the result is recorded through the same mechanism a model-facing
75
+ read uses (``observe_read``): the edit guard then accepts the file
76
+ exactly as it would accept a freshly read one, and still rejects it
77
+ once the file changes on disk. This is the single write path for every
78
+ edit protocol's write handler.
79
+ """
80
+ parent = self.filesystem.get_parent(path)
81
+ if parent and parent != "." and not self.filesystem.exists(parent):
82
+ self.filesystem.create_directory(parent)
83
+ self.filesystem.write_text(path, content)
84
+ self.observe_read(path)
85
+
70
86
  async def claude_edit(
71
87
  self,
72
88
  file_path: str,
@@ -119,10 +135,7 @@ class EditTool(BaseTool):
119
135
  return blocked_msg
120
136
 
121
137
  def _write() -> None:
122
- parent = self.filesystem.get_parent(path)
123
- if parent and parent != "." and not self.filesystem.exists(parent):
124
- self.filesystem.create_directory(parent)
125
- self.filesystem.write_text(path, updated_content)
138
+ self._write_file(path, updated_content)
126
139
 
127
140
  self._mutate_with_optional_snapshot(
128
141
  tool_name="edit",
@@ -140,7 +153,6 @@ class EditTool(BaseTool):
140
153
  tool_call_id=getattr(self.caller, "current_tool_execution_id", None),
141
154
  tool_name="edit",
142
155
  )
143
- self._read_versions[path] = self._content_digest(self.filesystem.read_text(path))
144
156
  result = f"Edited {path}" if exists else f"Created {path}"
145
157
  diagnostics = await self._maybe_append_lsp_diagnostics(path)
146
158
  return result + diagnostics
@@ -169,10 +181,7 @@ class EditTool(BaseTool):
169
181
  return blocked_msg
170
182
 
171
183
  def _write() -> None:
172
- parent = self.filesystem.get_parent(path)
173
- if parent and parent != "." and not self.filesystem.exists(parent):
174
- self.filesystem.create_directory(parent)
175
- self.filesystem.write_text(path, content)
184
+ self._write_file(path, content)
176
185
 
177
186
  self._mutate_with_optional_snapshot(
178
187
  tool_name="write",
@@ -190,7 +199,6 @@ class EditTool(BaseTool):
190
199
  tool_call_id=getattr(self.caller, "current_tool_execution_id", None),
191
200
  tool_name="write",
192
201
  )
193
- self._read_versions[path] = self._content_digest(self.filesystem.read_text(path))
194
202
  result = f"Wrote {path}"
195
203
  diagnostics = await self._maybe_append_lsp_diagnostics(path)
196
204
  return result + diagnostics
@@ -262,8 +270,6 @@ class EditTool(BaseTool):
262
270
  except Exception:
263
271
  old_content = None
264
272
 
265
- parent_dir = self.filesystem.get_parent(path)
266
-
267
273
  # Preserve the file's dominant line ending on overwrite; new files
268
274
  # keep the line endings the caller provided (typically LF).
269
275
  if exists and old_content is not None:
@@ -271,9 +277,7 @@ class EditTool(BaseTool):
271
277
  content = self._normalize_line_endings(content, line_ending)
272
278
 
273
279
  def _write() -> None:
274
- if parent_dir and parent_dir != "." and not self.filesystem.exists(parent_dir):
275
- self.filesystem.create_directory(parent_dir)
276
- self.filesystem.write_text(path, content)
280
+ self._write_file(path, content)
277
281
 
278
282
  self._mutate_with_optional_snapshot(
279
283
  tool_name="write",
@@ -404,10 +408,7 @@ class EditTool(BaseTool):
404
408
  snapshot_paths = list(dict.fromkeys(snapshot_paths))
405
409
 
406
410
  def _write() -> None:
407
- parent = self.filesystem.get_parent(target)
408
- if parent and parent != "." and not self.filesystem.exists(parent):
409
- self.filesystem.create_directory(parent)
410
- self.filesystem.write_text(target, updated)
411
+ self._write_file(target, updated)
411
412
  if destination is not None and self.filesystem.exists(source):
412
413
  self.filesystem.remove(source, missing_ok=True)
413
414
 
@@ -540,10 +541,7 @@ class EditTool(BaseTool):
540
541
  for path in sorted(
541
542
  (item for item in changed if working[item] is not None), key=lambda item: len(Path(item).parts)
542
543
  ):
543
- parent = self.filesystem.get_parent(path)
544
- if parent and parent != "." and not self.filesystem.exists(parent):
545
- self.filesystem.create_directory(parent)
546
- self.filesystem.write_text(path, working[path] or "")
544
+ self._write_file(path, working[path] or "")
547
545
 
548
546
  self._mutate_with_optional_snapshot(
549
547
  tool_name="apply_patch",
@@ -661,7 +659,7 @@ class EditTool(BaseTool):
661
659
  tool_name=tool_name,
662
660
  reason=f"{tool_name} {path}",
663
661
  paths=[path],
664
- mutate=lambda: self.filesystem.write_text(path, normalized_updated),
662
+ mutate=lambda: self._write_file(path, normalized_updated),
665
663
  )
666
664
 
667
665
  await self.send_edit_preview(