kolega-code 0.33.0__tar.gz → 0.34.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 (486) hide show
  1. {kolega_code-0.33.0 → kolega_code-0.34.0}/CHANGELOG.md +47 -0
  2. {kolega_code-0.33.0 → kolega_code-0.34.0}/PKG-INFO +2 -1
  3. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/compression.py +4 -4
  6. kolega_code-0.34.0/kolega_code/agent/handoff.py +167 -0
  7. kolega_code-0.34.0/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +37 -0
  8. kolega_code-0.34.0/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +11 -0
  9. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompts.py +9 -0
  10. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/app.py +140 -0
  11. kolega_code-0.34.0/kolega_code/cli/gateway.py +371 -0
  12. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/main.py +11 -0
  13. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/messages.py +9 -0
  14. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/provider_registry.py +9 -0
  15. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/session_store.py +11 -1
  16. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/settings.py +78 -0
  17. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/slash_commands.py +5 -0
  18. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/agent_runtime.py +5 -0
  19. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/app_base.py +4 -0
  20. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/command_handlers.py +60 -0
  21. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/settings_panel.py +200 -0
  22. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/settings_screen.py +76 -0
  23. kolega_code-0.34.0/kolega_code/gateway/__init__.py +50 -0
  24. kolega_code-0.34.0/kolega_code/gateway/access.py +194 -0
  25. kolega_code-0.34.0/kolega_code/gateway/adapters/__init__.py +72 -0
  26. kolega_code-0.34.0/kolega_code/gateway/adapters/base.py +186 -0
  27. kolega_code-0.34.0/kolega_code/gateway/adapters/echo.py +128 -0
  28. kolega_code-0.34.0/kolega_code/gateway/adapters/telegram/__init__.py +6 -0
  29. kolega_code-0.34.0/kolega_code/gateway/adapters/telegram/adapter.py +467 -0
  30. kolega_code-0.34.0/kolega_code/gateway/adapters/telegram/formatting.py +151 -0
  31. kolega_code-0.34.0/kolega_code/gateway/bridge.py +225 -0
  32. kolega_code-0.34.0/kolega_code/gateway/commands.py +54 -0
  33. kolega_code-0.34.0/kolega_code/gateway/config.py +190 -0
  34. kolega_code-0.34.0/kolega_code/gateway/control_relay.py +204 -0
  35. kolega_code-0.34.0/kolega_code/gateway/daemon.py +263 -0
  36. kolega_code-0.34.0/kolega_code/gateway/event_router.py +55 -0
  37. kolega_code-0.34.0/kolega_code/gateway/questions.py +65 -0
  38. kolega_code-0.34.0/kolega_code/gateway/redaction.py +35 -0
  39. kolega_code-0.34.0/kolega_code/gateway/router.py +104 -0
  40. kolega_code-0.34.0/kolega_code/gateway/service.py +137 -0
  41. kolega_code-0.34.0/kolega_code/gateway/sessions.py +741 -0
  42. kolega_code-0.34.0/kolega_code/gateway/stt.py +187 -0
  43. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/__init__.py +2 -0
  44. kolega_code-0.34.0/kolega_code/llm/specs/catalog/groq.py +54 -0
  45. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +18 -18
  46. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/openrouter.py +1044 -1043
  47. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +16 -2
  48. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/tinker.py +10 -2
  49. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/zai.py +14 -0
  50. {kolega_code-0.33.0 → kolega_code-0.34.0}/pyproject.toml +3 -1
  51. {kolega_code-0.33.0 → kolega_code-0.34.0}/.gitignore +0 -0
  52. {kolega_code-0.33.0 → kolega_code-0.34.0}/CONTRIBUTING.md +0 -0
  53. {kolega_code-0.33.0 → kolega_code-0.34.0}/LICENSE +0 -0
  54. {kolega_code-0.33.0 → kolega_code-0.34.0}/MIGRATION.md +0 -0
  55. {kolega_code-0.33.0 → kolega_code-0.34.0}/README.md +0 -0
  56. {kolega_code-0.33.0 → kolega_code-0.34.0}/RELEASING.md +0 -0
  57. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  58. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  59. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  60. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  61. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  62. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  63. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  64. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  65. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  66. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  67. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  68. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  69. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  70. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  71. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  72. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  73. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  74. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  75. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  76. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  77. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  78. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  79. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  80. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  81. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  82. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  83. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  84. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  85. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  86. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  87. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  88. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  89. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  90. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  91. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  92. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  93. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  94. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  95. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  96. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  97. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  98. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  99. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  100. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  101. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  102. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  103. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  104. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  105. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  106. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  107. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  108. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  109. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/__init__.py +0 -0
  110. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/agent_factory.py +0 -0
  111. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/bridge.py +0 -0
  112. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/diffs.py +0 -0
  113. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/permissions.py +0 -0
  114. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/plans.py +0 -0
  115. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/questions.py +0 -0
  116. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/server.py +0 -0
  117. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/session.py +0 -0
  118. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/acp/usage.py +0 -0
  119. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/baseagent.py +0 -0
  120. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/browseragent.py +0 -0
  121. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/coder.py +0 -0
  122. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/common.py +0 -0
  123. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/context.py +0 -0
  124. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/conversation.py +0 -0
  125. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/custom_agents.py +0 -0
  126. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/edit_protocols.py +0 -0
  127. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/errors.py +0 -0
  128. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/__init__.py +0 -0
  129. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/bridge.py +0 -0
  130. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  131. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  132. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/env.py +0 -0
  133. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  134. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/kernel.py +0 -0
  135. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/prelude.js +0 -0
  136. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/prelude.py +0 -0
  137. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/protocol.py +0 -0
  138. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  139. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/runner.js +0 -0
  140. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/eval/runner.py +0 -0
  141. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/generalagent.py +0 -0
  142. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/goal.py +0 -0
  143. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/investigationagent.py +0 -0
  144. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/model_routing.py +0 -0
  145. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  146. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  147. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/budget.py +0 -0
  148. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/context.py +0 -0
  149. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/errors.py +0 -0
  150. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/executor.py +0 -0
  151. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/guide.py +0 -0
  152. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/journal.py +0 -0
  153. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  154. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/orchestration/types.py +0 -0
  155. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/planningagent.py +0 -0
  156. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_dump.py +0 -0
  157. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_overrides.py +0 -0
  158. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_provider.py +0 -0
  159. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  160. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  161. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  162. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  163. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  164. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  165. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  166. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  167. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  168. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  169. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  170. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  171. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  172. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  173. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  174. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  175. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  176. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  177. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  178. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  179. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  180. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  181. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  182. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  183. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  184. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  185. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  186. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  187. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  188. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  189. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  190. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  191. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  192. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  193. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  194. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  195. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  196. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  197. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  198. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  199. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  200. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  201. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  202. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  203. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  204. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  205. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  206. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  207. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  208. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  209. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  210. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  211. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  212. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  213. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  214. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  215. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  216. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  217. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  218. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  219. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  220. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  221. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  222. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  223. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  224. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  225. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  226. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  227. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  228. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  229. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  230. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  231. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
  232. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  233. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  234. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  235. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  236. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  237. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  238. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  239. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  240. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  241. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  242. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
  243. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  244. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  245. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  246. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  247. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  248. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  249. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  250. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  251. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  252. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  253. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  254. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  255. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  256. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  257. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  258. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  259. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  260. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  261. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  262. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  263. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  264. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  265. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  266. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  267. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  268. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  269. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  270. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  271. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  272. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  273. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  274. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  275. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  276. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  277. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  278. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  279. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  280. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  281. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  282. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  283. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  284. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  285. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  286. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  287. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  288. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  289. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tool_definitions.py +0 -0
  290. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/tools.py +0 -0
  291. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/utils/commands.py +0 -0
  292. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/agent/volatile_context.py +0 -0
  293. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/auth/__init__.py +0 -0
  294. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/auth/_jwt.py +0 -0
  295. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  296. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/auth/constants.py +0 -0
  297. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/auth/tokens.py +0 -0
  298. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/__init__.py +0 -0
  299. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/framing.py +0 -0
  300. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/installer.py +0 -0
  301. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/manager.py +0 -0
  302. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/multiplex.py +0 -0
  303. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/native_host.py +0 -0
  304. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/protocol.py +0 -0
  305. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/registry.py +0 -0
  306. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/browser_extension/runtime.py +0 -0
  307. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/__init__.py +0 -0
  308. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/acp.py +0 -0
  309. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/ask_output.py +0 -0
  310. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/atif_export.py +0 -0
  311. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/browser_backend.py +0 -0
  312. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/clipboard_image.py +0 -0
  313. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/config.py +0 -0
  314. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/connection.py +0 -0
  315. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/cron.py +0 -0
  316. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/diagnostics.py +0 -0
  317. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/file_index.py +0 -0
  318. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/goal.py +0 -0
  319. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/loop.py +0 -0
  320. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/mentions.py +0 -0
  321. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/model_catalog.py +0 -0
  322. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/model_connection.py +0 -0
  323. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/peer_messaging.py +0 -0
  324. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/plan_artifacts.py +0 -0
  325. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/prompt_history.py +0 -0
  326. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/session_event_protocol.py +0 -0
  327. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/session_event_store.py +0 -0
  328. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/session_journal.py +0 -0
  329. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/session_usage.py +0 -0
  330. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/skills.py +0 -0
  331. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/theme.py +0 -0
  332. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/__init__.py +0 -0
  333. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  334. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/constants.py +0 -0
  335. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/custom_model.py +0 -0
  336. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  337. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  338. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  339. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/pacing.py +0 -0
  340. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  341. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/session_diff.py +0 -0
  342. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/state.py +0 -0
  343. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  344. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/styles.tcss +0 -0
  345. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  346. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  347. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/transcript.py +0 -0
  348. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/tui/widgets.py +0 -0
  349. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/cli/updater.py +0 -0
  350. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/config.py +0 -0
  351. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/events.py +0 -0
  352. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/extensions.py +0 -0
  353. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/git_env.py +0 -0
  354. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/__init__.py +0 -0
  355. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/backends.py +0 -0
  356. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/config.py +0 -0
  357. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/dispatcher.py +0 -0
  358. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/events.py +0 -0
  359. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/matcher.py +0 -0
  360. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/hooks/outcome.py +0 -0
  361. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/client.py +0 -0
  362. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/exceptions.py +0 -0
  363. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/instrumented_client.py +0 -0
  364. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/ledger.py +0 -0
  365. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/models.py +0 -0
  366. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/__init__.py +0 -0
  367. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  368. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/anthropic.py +0 -0
  369. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/base.py +0 -0
  370. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  371. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  372. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/google.py +0 -0
  373. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/models.py +0 -0
  374. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/openai.py +0 -0
  375. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  376. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
  377. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/responses_common.py +0 -0
  378. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/tinker.py +0 -0
  379. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  380. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/ratelimit.py +0 -0
  381. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/__init__.py +0 -0
  382. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/accessors.py +0 -0
  383. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  384. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  385. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  386. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  387. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  388. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  389. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  390. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  391. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  392. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  393. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  394. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  395. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  396. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  397. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  398. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
  399. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/thinking.py +0 -0
  400. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  401. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/types.py +0 -0
  402. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/specs/validation.py +0 -0
  403. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/timeouts.py +0 -0
  404. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  405. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/llm/usage.py +0 -0
  406. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/local_state.py +0 -0
  407. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/__init__.py +0 -0
  408. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/config.py +0 -0
  409. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/oauth.py +0 -0
  410. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/service.py +0 -0
  411. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/state.py +0 -0
  412. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/tools.py +0 -0
  413. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/mcp/transport.py +0 -0
  414. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/__init__.py +0 -0
  415. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/identity.py +0 -0
  416. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/manager.py +0 -0
  417. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/manifest.py +0 -0
  418. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/markdown.py +0 -0
  419. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/models.py +0 -0
  420. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/protocol.py +0 -0
  421. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/memory/registry.py +0 -0
  422. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/models/__init__.py +0 -0
  423. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  424. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/permissions.py +0 -0
  425. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/runtime.py +0 -0
  426. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/README.md +0 -0
  427. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/__init__.py +0 -0
  428. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  429. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/base.py +0 -0
  430. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/browser.py +0 -0
  431. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/event_loop.py +0 -0
  432. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/filesystem.py +0 -0
  433. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/local.py +0 -0
  434. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/serializer.py +0 -0
  435. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/terminal.py +0 -0
  436. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/sandbox/utils.py +0 -0
  437. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/scratchpad.py +0 -0
  438. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/security/__init__.py +0 -0
  439. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/security/secrets.py +0 -0
  440. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/base.py +0 -0
  441. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/browser.py +0 -0
  442. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/file_system.py +0 -0
  443. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/html.py +0 -0
  444. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/__init__.py +0 -0
  445. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/client.py +0 -0
  446. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/config.py +0 -0
  447. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/detector.py +0 -0
  448. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  449. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/edits.py +0 -0
  450. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/manager.py +0 -0
  451. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/registry.py +0 -0
  452. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/lsp/registry.yaml +0 -0
  453. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/snapshots.py +0 -0
  454. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/terminal.py +0 -0
  455. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/terminal_buffer.py +0 -0
  456. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/services/workspace_scan.py +0 -0
  457. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/__init__.py +0 -0
  458. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/control.py +0 -0
  459. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/inbox.py +0 -0
  460. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/inmemory.py +0 -0
  461. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/projection.py +0 -0
  462. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/recording.py +0 -0
  463. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/runtime.py +0 -0
  464. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/session/store.py +0 -0
  465. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/testing/__init__.py +0 -0
  466. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/testing/store_conformance.py +0 -0
  467. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/tools/__init__.py +0 -0
  468. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/tools/ask_user.py +0 -0
  469. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/tools/core.py +0 -0
  470. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/tools/definitions.py +0 -0
  471. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/tools/param_aliases.py +0 -0
  472. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/tools/registry.py +0 -0
  473. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/utils/__init__.py +0 -0
  474. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/utils/images.py +0 -0
  475. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/__init__.py +0 -0
  476. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/assets/fold.js +0 -0
  477. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/assets/player.css +0 -0
  478. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/assets/player.html +0 -0
  479. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/assets/player.js +0 -0
  480. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/bundle.py +0 -0
  481. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/hosting.py +0 -0
  482. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/redaction.py +0 -0
  483. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/server.py +0 -0
  484. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/singlefile.py +0 -0
  485. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/web/theme_css.py +0 -0
  486. {kolega_code-0.33.0 → kolega_code-0.34.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,53 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.34.0 - 2026-09-02
10
+
11
+ ### Added
12
+
13
+ - **Telegram gateway.** The new `kolega-code gateway` daemon drives Kolega Code
14
+ agents from Telegram: each chat maps to a durable session, and agent turns
15
+ stream back as edit-in-place chat messages. `kolega-code gateway telegram
16
+ setup --verify` saves your @BotFather token, `kolega-code gateway run
17
+ --adapter telegram` starts the daemon (an LLM-free `echo` adapter is
18
+ included for transport testing), and `gateway install` registers it as a
19
+ systemd user service or launchd agent — a new Gateway page in Settings
20
+ covers configuration. Access is by sender allowlist with pairing-code
21
+ onboarding (`gateway pairing`), group chats stay silent unless the bot is
22
+ @mentioned or replied to, and each chat gets slash commands (`/model`,
23
+ `/permissions`, `/status`) as ordinary messages. Permission prompts and
24
+ agent questions arrive as tappable inline buttons. Voice notes are
25
+ transcribed, photos attach as vision input, documents are saved where the
26
+ agent's tools can reach them, sessions survive gateway restarts, and the
27
+ working directory defaults to `~/kolega-code-workspace` — never the daemon's
28
+ own. Outbound messages are redacted for known secrets, including the bot
29
+ token.
30
+ - **`/handoff`.** `/handoff [focus instructions]` summarizes the current
31
+ session with a one-shot LLM call and switches to a brand-new session whose
32
+ entire context is that structured document (Goal, Constraints &
33
+ Preferences, Progress, Key Decisions, Critical Context, Next Steps). The
34
+ old session stays intact and resumable, recorded as the new session's
35
+ parent; Esc during generation cancels cooperatively and leaves the session
36
+ untouched.
37
+ - **Groq as a first-party provider, plus remote voice transcription.** Groq is
38
+ now a catalogued provider — `openai/gpt-oss-120b`, `openai/gpt-oss-20b`,
39
+ `qwen/qwen3-32b`, `qwen/qwen3.6-27b`, and the Llama 4 Scout/Maverick pair,
40
+ all 131K context — with its own entry on the Providers page and the `groq`
41
+ API key. Gateway voice notes transcribe through Groq's hosted
42
+ `whisper-large-v3-turbo` (Settings → Tools → Voice transcription), reusing
43
+ that same key; transcription is remote-only.
44
+ - **GLM-5.3-Flash on Z.AI.** The GLM Coding Plan catalog adds `glm-5.3-flash`
45
+ — 1M-token context, 128K max output, `high`/`max` reasoning effort
46
+ (default `max`), and the first GLM-5 model with native vision input.
47
+
48
+ ### Changed
49
+
50
+ - Provider catalogs refreshed from live endpoints (2026-09-02 snapshots):
51
+ OpenRouter (274 tool-capable models, 20 featured), Tinker (27 models,
52
+ +`zai-org/GLM-5.3`), Ollama Cloud (19 models, +`glm-5.3`/`glm-5.3-flash`,
53
+ deepseek `:preview` tags dropped), and Perplexity Agent (46 models,
54
+ +`anthropic/claude-fable-5-1`).
55
+
9
56
  ## 0.33.0 - 2026-08-26
10
57
 
11
58
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.33.0
3
+ Version: 0.34.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/
@@ -27,6 +27,7 @@ Classifier: Topic :: Software Development
27
27
  Classifier: Topic :: Utilities
28
28
  Requires-Python: >=3.11
29
29
  Requires-Dist: agent-client-protocol==0.12.0
30
+ Requires-Dist: aiogram==3.30.0
30
31
  Requires-Dist: anthropic==0.101.0
31
32
  Requires-Dist: atif==1.7.0
32
33
  Requires-Dist: beautifulsoup4==4.14.3
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.33.0"
177
+ __version__ = "0.34.0"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.33.0"
54
+ __version__ = "0.34.0"
@@ -33,7 +33,7 @@ class CompactionResult:
33
33
  message: str = ""
34
34
 
35
35
 
36
- def _render_transcript(messages: List[Message]) -> str:
36
+ def render_transcript(messages: List[Message]) -> str:
37
37
  """Role-tagged plain text: JSON only for tool arguments, tool results raw.
38
38
 
39
39
  JSON-escaping newline-heavy tool output costs ~30% more tokens than
@@ -250,13 +250,13 @@ class HistoryCompressor:
250
250
  omitted = tail_start - head_end
251
251
  if omitted:
252
252
  parts = [
253
- _render_transcript(prefix[:head_end]),
253
+ render_transcript(prefix[:head_end]),
254
254
  _omission_notice(omitted),
255
- _render_transcript(prefix[tail_start:]),
255
+ render_transcript(prefix[tail_start:]),
256
256
  ]
257
257
  transcript = "\n\n".join(part for part in parts if part)
258
258
  else:
259
- transcript = _render_transcript(prefix)
259
+ transcript = render_transcript(prefix)
260
260
  prompt = build_compression_summary_user_prompt(transcript, previous_summary=previous_summary)
261
261
  return MessageHistory([Message(role="user", content=[TextBlock(text=prompt)])])
262
262
 
@@ -0,0 +1,167 @@
1
+ """Handoff: summarize a session into a document that seeds a fresh session.
2
+
3
+ Mirrors the helper-request pattern of ``compression.py``: a one-shot streamed
4
+ LLM call that renders the session as a role-tagged transcript and asks for a
5
+ structured handoff document. The result is injected as the sole context of a
6
+ brand-new session, so the summary must stand alone.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import asyncio
12
+ import logging
13
+ from dataclasses import dataclass
14
+ from typing import Any, List, Optional, Union
15
+
16
+ from kolega_code.llm.ledger import helper_origin, llm_call_origin
17
+ from kolega_code.llm.models import Message, MessageHistory, TextBlock
18
+
19
+ from .compression import render_transcript
20
+ from .conversation import replace_image_blocks_with_placeholders
21
+ from .prompts import HANDOFF_SYSTEM_PROMPT, build_handoff_user_prompt
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class HandoffCancelledError(Exception):
27
+ """Raised when the user cancels handoff document generation."""
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class HandoffResult:
32
+ """Outcome of a handoff document generation attempt.
33
+
34
+ ``reason`` is a machine tag: "ok" | "too_few" | "empty_summary" | "llm_error".
35
+ Cancellation is not a result — it raises :class:`HandoffCancelledError`.
36
+ """
37
+
38
+ ok: bool
39
+ reason: str
40
+ document: str = ""
41
+ message: str = ""
42
+
43
+
44
+ # Don't summarize a session that has no real exchange to summarize.
45
+ HANDOFF_MIN_MESSAGES = 2
46
+ # Generous ceiling matching the compaction helper: reasoning models can consume
47
+ # most of the budget on chain-of-thought before emitting the document.
48
+ HANDOFF_MAX_TOKENS = 8192
49
+ # Completed-but-empty documents (reasoning-only, whitespace, no text) are
50
+ # retried on the same request before the attempt is reported unusable.
51
+ HANDOFF_EMPTY_ATTEMPTS = 3
52
+
53
+
54
+ def build_handoff_context_text(document: str) -> str:
55
+ """Wrap a handoff document for injection as a new session's opening context."""
56
+ return (
57
+ "<handoff-context>\n"
58
+ f"{document}\n"
59
+ "</handoff-context>\n\n"
60
+ "The above is a handoff document from a previous session. "
61
+ "Use this context to continue the work seamlessly."
62
+ )
63
+
64
+
65
+ async def _stream_document(
66
+ llm: Any,
67
+ messages: MessageHistory,
68
+ system: Message,
69
+ temperature: float,
70
+ model: str,
71
+ thinking: Optional[Union[int, str]],
72
+ cancel_event: asyncio.Event,
73
+ ) -> Message:
74
+ """Issue the handoff helper request and return the completed message.
75
+
76
+ Stream and consume events rather than calling ``generate()``: the Anthropic
77
+ SDK rejects non-streaming requests whose max_tokens is large enough to risk
78
+ a >10-minute response. Cancellation is cooperative — the stream is closed
79
+ and :class:`HandoffCancelledError` raised when the event fires.
80
+ """
81
+ if cancel_event.is_set():
82
+ raise HandoffCancelledError()
83
+ with llm_call_origin(helper_origin("handoff")):
84
+ stream_cm = await llm.stream(
85
+ messages=messages,
86
+ system=system,
87
+ temperature=temperature,
88
+ model=model,
89
+ max_completion_tokens=HANDOFF_MAX_TOKENS,
90
+ thinking=thinking,
91
+ )
92
+ async with stream_cm as stream:
93
+ async for _event in stream:
94
+ if cancel_event.is_set():
95
+ break
96
+ if cancel_event.is_set():
97
+ raise HandoffCancelledError()
98
+ return await stream.get_final_message()
99
+
100
+
101
+ async def generate_handoff_document(
102
+ messages: List[Message],
103
+ *,
104
+ llm: Any,
105
+ model: str,
106
+ temperature: float,
107
+ thinking: Optional[Union[int, str]],
108
+ focus: Optional[str] = None,
109
+ cancel_event: Optional[asyncio.Event] = None,
110
+ ) -> HandoffResult:
111
+ """Summarize ``messages`` into a handoff document via a one-shot LLM call.
112
+
113
+ Images are replaced with placeholders (base64 must stay out of the
114
+ transcript); tool calls render as JSON arguments and tool results raw,
115
+ exactly like compaction's transcript. Raises :class:`HandoffCancelledError`
116
+ when ``cancel_event`` fires before a document is produced; otherwise never
117
+ raises — failures come back as ``HandoffResult(ok=False, ...)``.
118
+ """
119
+ if len(messages) < HANDOFF_MIN_MESSAGES:
120
+ return HandoffResult(
121
+ ok=False,
122
+ reason="too_few",
123
+ message=(f"Nothing to hand off ({len(messages)} message(s); need at least {HANDOFF_MIN_MESSAGES})."),
124
+ )
125
+
126
+ if cancel_event is None:
127
+ cancel_event = asyncio.Event()
128
+
129
+ try:
130
+ stripped = replace_image_blocks_with_placeholders(list(messages), model)
131
+ prompt = build_handoff_user_prompt(render_transcript(stripped), focus=focus)
132
+ request_messages = MessageHistory([Message(role="user", content=[TextBlock(text=prompt)])])
133
+ system_message = Message(role="system", content=[TextBlock(text=HANDOFF_SYSTEM_PROMPT)])
134
+
135
+ response = await _stream_document(
136
+ llm, request_messages, system_message, temperature, model, thinking, cancel_event
137
+ )
138
+ for attempt in range(1, HANDOFF_EMPTY_ATTEMPTS + 1):
139
+ document = response.get_text_content()
140
+ if document and document.strip():
141
+ return HandoffResult(ok=True, reason="ok", document=document.strip())
142
+ stop = getattr(response, "stop_reason", None)
143
+ stop_note = f" (stop_reason={stop})" if stop else ""
144
+ if attempt >= HANDOFF_EMPTY_ATTEMPTS:
145
+ break
146
+ logger.info(
147
+ "Handoff generation produced an empty document%s; retrying (%d/%d).",
148
+ stop_note,
149
+ attempt + 1,
150
+ HANDOFF_EMPTY_ATTEMPTS,
151
+ )
152
+ response = await _stream_document(
153
+ llm, request_messages, system_message, temperature, model, thinking, cancel_event
154
+ )
155
+
156
+ message = "Handoff generation produced an empty document; session left unchanged."
157
+ logger.error(message)
158
+ return HandoffResult(ok=False, reason="empty_summary", message=message)
159
+ except HandoffCancelledError:
160
+ raise
161
+ except Exception as exc:
162
+ logger.exception("Failed to generate handoff document")
163
+ return HandoffResult(
164
+ ok=False,
165
+ reason="llm_error",
166
+ message=f"Failed to generate handoff document: {type(exc).__name__}: {exc}",
167
+ )
@@ -0,0 +1,37 @@
1
+ You are handing off an in-progress coding session to a fresh session that has NO access to this conversation. Write a handoff document that lets the new session continue seamlessly.
2
+
3
+ Hard rules:
4
+ - Output ONLY the handoff document. No preamble, no commentary, no wrapper text.
5
+ - Capture exact technical state, not abstractions: file paths, symbol names, commands run, test results, observed failures, decisions made, and partial work affecting the next step.
6
+ - Quote identifiers EXACTLY: file paths, function/class names, variable names, error strings, commands, and config keys. Do not paraphrase code or paths.
7
+ - Do not invent facts. If something is unknown or unfinished, say so briefly.
8
+ - Preserve any `<skill_content name="...">` instructions referenced earlier — note them by name so they are not lost.
9
+ - Be thorough: completeness matters more than brevity here, because the new session cannot look anything up in this conversation.
10
+
11
+ Use exactly this structure:
12
+
13
+ ## Goal
14
+ What the user is trying to accomplish
15
+
16
+ ## Constraints & Preferences
17
+ - Any constraints, preferences, or requirements mentioned
18
+
19
+ ## Progress
20
+ ### Done
21
+ - [x] Completed tasks with specifics
22
+
23
+ ### In Progress
24
+ - [ ] Current work, if any
25
+
26
+ ### Pending
27
+ - [ ] Tasks mentioned but not started
28
+
29
+ ## Key Decisions
30
+ - **Decision**: rationale
31
+
32
+ ## Critical Context
33
+ - Code snippets, file paths, function/type names, error messages, and data essential to continue
34
+ - Repository state if relevant
35
+
36
+ ## Next Steps
37
+ 1. What should happen next
@@ -0,0 +1,11 @@
1
+ Write a handoff document for the following coding session so the work can continue seamlessly in a new session that has no access to this conversation.
2
+
3
+ <conversation_history>
4
+ {{ transcript }}
5
+ </conversation_history>
6
+
7
+ Each transcript entry is tagged with its role; tool calls show their JSON arguments and tool results follow raw.
8
+ {% if focus %}
9
+ Additional focus: {{ focus }}
10
+ {% endif %}
11
+ Produce the handoff document exactly as specified in your instructions. Handoff document only — do not call tools.
@@ -38,6 +38,7 @@ def render_prompt_template(template_name: str, **variables: Any) -> str:
38
38
 
39
39
 
40
40
  COMPRESSION_SUMMARY_SYSTEM_PROMPT = render_prompt_template("auxiliary/compression/summary.system.md")
41
+ HANDOFF_SYSTEM_PROMPT = render_prompt_template("auxiliary/handoff/document.system.md")
41
42
  SHELL_SAFETY_SYSTEM_PROMPT = render_prompt_template("auxiliary/terminal/safety.system.md")
42
43
  SHELL_COMPRESSION_SYSTEM_PROMPT = render_prompt_template("auxiliary/terminal/output_summary.system.md")
43
44
  SHARED_TASK_LIST_PROMPT = render_prompt_template("extensions/cli/shared_task_list.md")
@@ -71,6 +72,14 @@ def build_compression_summary_user_prompt(history: str, previous_summary: Option
71
72
  )
72
73
 
73
74
 
75
+ def build_handoff_user_prompt(transcript: str, focus: Optional[str] = None) -> str:
76
+ return render_prompt_template(
77
+ "auxiliary/handoff/document.user.md.j2",
78
+ transcript=transcript,
79
+ focus=focus,
80
+ )
81
+
82
+
74
83
  def build_silent_turn_nudge(attempt: int) -> str:
75
84
  """Escalating reminder injected when the model ends a turn with no tool call and no visible text."""
76
85
  return render_prompt_template("auxiliary/agent_loop/silent_turn_nudge.user.md.j2", attempt=attempt)
@@ -61,6 +61,7 @@ from kolega_code.agent.prompts import (
61
61
  build_implement_plan_prompt,
62
62
  build_mode_switch_notice,
63
63
  )
64
+ from kolega_code.agent.handoff import build_handoff_context_text
64
65
  from kolega_code.hooks import HookDispatcher, HookEvent
65
66
  from kolega_code.llm.models import Message, MessageHistory, TextBlock
66
67
  from kolega_code.memory import ProjectMemoryManager
@@ -309,6 +310,10 @@ class KolegaCodeApp(
309
310
  self._session_diff_timer: Optional[Timer] = None
310
311
  self._session_diff_baseline_id: Optional[int] = None
311
312
  self._rewind_running = False
313
+ # /handoff state: the guard flag plus the cancel event the Esc path sets
314
+ # while the handoff document is generating.
315
+ self._handoff_in_progress = False
316
+ self._handoff_cancel_event: Optional[asyncio.Event] = None
312
317
  self._workflow_activities: dict[str, tui_state.WorkflowActivity] = {}
313
318
  self._render_pending = False
314
319
  self._conversation_anchor_pending = False
@@ -966,6 +971,7 @@ class KolegaCodeApp(
966
971
  loop=dict(record.loop),
967
972
  usage=dict(record.usage),
968
973
  active_project_path=record.active_project_path,
974
+ parent_session_id=record.parent_session_id,
969
975
  )
970
976
 
971
977
  async def _save_session_async(self) -> None:
@@ -2827,6 +2833,140 @@ class KolegaCodeApp(
2827
2833
  tui_state.ConversationEntry(kind="progress", content=messages.THREAD_RESET_MESSAGE, complete=True)
2828
2834
  )
2829
2835
 
2836
+ async def _handoff_session(self, document: str) -> None:
2837
+ """Switch to a fresh session whose entire context is ``document``.
2838
+
2839
+ The caller has already generated the document and holds no running
2840
+ turn or worker. The old session is flushed and left intact (resumable);
2841
+ the new session records it as ``parent_session_id`` and restores the
2842
+ document as its opening conversation.
2843
+ """
2844
+ # 1) Final durable flush of the old session while its agent/recorder are
2845
+ # still live and bound to the old session id.
2846
+ await self._save_session_history_async()
2847
+ await self._save_session_async()
2848
+
2849
+ # 2) Create the new session record first so the lineage notice can name it.
2850
+ new_record = self.store.create(
2851
+ self.project_path,
2852
+ self.mode,
2853
+ dict(self.session.config),
2854
+ parent_session_id=self.session.session_id,
2855
+ )
2856
+
2857
+ # 3) Lineage in the old journal: a trailing context message, then an epoch
2858
+ # boundary so the old session's replay shows where the work moved.
2859
+ self._session_recorder.record_context_message(
2860
+ Message(
2861
+ role="user",
2862
+ content=[TextBlock(text=messages.HANDOFF_OLD_SESSION_NOTICE.format(title=new_record.title))],
2863
+ ),
2864
+ actor="system",
2865
+ )
2866
+ await asyncio.to_thread(self._session_recorder.start_epoch, "handoff")
2867
+
2868
+ # 4) Tear down the old agent generation before any session object rebinds,
2869
+ # so nothing keeps writing into the old journal through it.
2870
+ await self._cleanup_agent_generation()
2871
+
2872
+ # 5) Stop services bound to the old session.
2873
+ if self._share_server is not None:
2874
+ await self._stop_share_server()
2875
+ if self._usage_sink is not None:
2876
+ await self._usage_sink.aclose()
2877
+ self._usage_sink = None
2878
+ self._unregister_from_inbox()
2879
+ await self._stop_inbox_socket()
2880
+
2881
+ # 6) Rebind the session-bound surface to the new id.
2882
+ self.session = new_record
2883
+ self._session_recorder = self.store.recorder(new_record.session_id)
2884
+ journal = self.store.journal(new_record.session_id)
2885
+ self.recording_connection_manager = RecordingConnectionManager(
2886
+ self.connection_manager,
2887
+ FileSessionEventStore(journal),
2888
+ session_id=new_record.session_id,
2889
+ artifact_store=FileArtifactStore(journal),
2890
+ )
2891
+ self._recording_primed = False
2892
+ self.control_channel = control_channel_for(
2893
+ new_record.session_id,
2894
+ self.recording_connection_manager.broadcast_event,
2895
+ workspace_id=new_record.workspace_id,
2896
+ thread_id=new_record.thread_id,
2897
+ )
2898
+ self.control_channel.acquire(tui_constants.TUI_CLIENT_ID)
2899
+ self.session_runtime = SessionRuntime(
2900
+ session_id=new_record.session_id,
2901
+ project_path=self.project_path,
2902
+ control=self.control_channel,
2903
+ permission_mode=self.permission_mode,
2904
+ on_notice=lambda text: self._notify_user(text, severity="warning"),
2905
+ )
2906
+ self._register_with_inbox()
2907
+ await self._start_inbox_socket()
2908
+
2909
+ # 7) Reset per-thread state (mirrors _reset_current_thread). The agent is
2910
+ # already torn down, so agent-side resets come from the fresh build.
2911
+ self._close_sub_agent_inspector()
2912
+ self.session.history = []
2913
+ self.session.compaction = {}
2914
+ self.session.task_list_markdown = ""
2915
+ self._session_file_changes = []
2916
+ self._session_diff_dirty = True
2917
+ self._clear_queued_messages()
2918
+ self._latest_plan = None
2919
+ self._plan_pending = False
2920
+ self._plan_reofferable = False
2921
+ self._plan_decision_active = False
2922
+ self._goal = None
2923
+ self.session.goal = {}
2924
+ self._goal_usage_mark = self._usage_ledger.snapshot()
2925
+ self._scheduled_loop = None
2926
+ self.session.loop = {}
2927
+ self._loop_iteration_active = False
2928
+ self._clear_runtime_output()
2929
+ self._set_plan_actions_visible(False)
2930
+ self._cancel_pending_approval()
2931
+
2932
+ # 8) Seed the new session with the handoff document as its only context,
2933
+ # both in the journal and in the in-memory projection.
2934
+ handoff_message = Message(
2935
+ role="user",
2936
+ content=[TextBlock(text=build_handoff_context_text(document))],
2937
+ )
2938
+ self.session.history = [handoff_message.to_dict()]
2939
+ self._session_recorder.record_context_message(handoff_message, actor="agent")
2940
+
2941
+ # 9) Fresh agent generation bound to the new session: the restore makes
2942
+ # the handoff document the agent's entire conversation.
2943
+ config = self.config
2944
+ assert config is not None # an agent existed, so a config was built
2945
+ self._session_started = False
2946
+ await self._build_agent(config, rebuild=True, restore_transcript=True)
2947
+
2948
+ # 10) Usage persistence on the new journal.
2949
+ usage_sink = SessionUsageSink(
2950
+ self.store.journal(new_record.session_id),
2951
+ self._session_recorder,
2952
+ self._usage_ledger,
2953
+ mode="tui",
2954
+ )
2955
+ self._usage_sink = usage_sink
2956
+ self._usage_ledger.observer = usage_sink
2957
+ await usage_sink.start()
2958
+
2959
+ # 11) Persist the new session and announce the switch.
2960
+ await self._save_session_async()
2961
+ self._refresh_status_dashboard()
2962
+ self._add_conversation_entry(
2963
+ tui_state.ConversationEntry(
2964
+ kind="system",
2965
+ content=messages.HANDOFF_SUCCESS.format(title=new_record.title),
2966
+ )
2967
+ )
2968
+ self._log_status(messages.HANDOFF_SUCCESS.format(title=new_record.title), "ok")
2969
+
2830
2970
  def _add_conversation_entry(self, entry: tui_state.ConversationEntry) -> None:
2831
2971
  self.conversation_entries.append(entry)
2832
2972
  if entry.uuid: