kolega-code 0.43.0__tar.gz → 0.45.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 (506) hide show
  1. {kolega_code-0.43.0 → kolega_code-0.45.0}/CHANGELOG.md +93 -0
  2. {kolega_code-0.43.0 → kolega_code-0.45.0}/CONTRIBUTING.md +12 -0
  3. {kolega_code-0.43.0 → kolega_code-0.45.0}/PKG-INFO +17 -9
  4. {kolega_code-0.43.0 → kolega_code-0.45.0}/README.md +14 -6
  5. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/__init__.py +1 -1
  6. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/agent_factory.py +45 -8
  7. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/bridge.py +6 -0
  8. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/server.py +156 -25
  9. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/session.py +10 -9
  10. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/__init__.py +1 -1
  11. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/baseagent.py +576 -41
  12. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/bundle-requirements.in +1 -1
  13. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/bundle-requirements.txt +8 -8
  14. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +1 -1
  15. kolega_code-0.45.0/kolega_code/agent/prompt_templates/tools/agent_job.md +8 -0
  16. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +10 -1
  17. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/agent_tool.py +306 -95
  18. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_definitions.py +28 -0
  19. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tools.py +30 -9
  20. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/acp.py +9 -1
  21. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/app.py +350 -45
  22. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/config.py +2 -0
  23. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/main.py +183 -25
  24. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/messages.py +9 -0
  25. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/model_catalog.py +43 -2
  26. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/provider_registry.py +19 -2
  27. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_event_store.py +85 -3
  28. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_journal.py +523 -90
  29. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_store.py +40 -10
  30. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_usage.py +52 -6
  31. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/agent_runtime.py +625 -55
  32. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/app_base.py +51 -3
  33. kolega_code-0.45.0/kolega_code/cli/tui/background_status.py +116 -0
  34. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/command_handlers.py +45 -14
  35. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/constants.py +12 -0
  36. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/loop_runtime.py +12 -4
  37. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/settings_panel.py +23 -9
  38. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/shortcut_bar.py +2 -1
  39. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/startup.py +1 -1
  40. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/state.py +1 -0
  41. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/status_dashboard.py +111 -1
  42. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/sub_agent_screen.py +36 -0
  43. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/transcript.py +85 -15
  44. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/turn_status.py +29 -0
  45. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/widgets.py +17 -6
  46. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/config.py +3 -0
  47. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/events.py +8 -3
  48. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/router.py +9 -3
  49. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/sessions.py +166 -18
  50. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/client.py +7 -1
  51. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/exceptions.py +33 -0
  52. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/instrumented_client.py +2 -2
  53. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/responses_common.py +7 -5
  54. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/__init__.py +2 -0
  55. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/google.py +15 -0
  56. kolega_code-0.45.0/kolega_code/llm/specs/catalog/minimax.py +87 -0
  57. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/mistral.py +36 -13
  58. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/xai.py +16 -0
  59. kolega_code-0.45.0/kolega_code/llm/specs/mistral_catalog.py +248 -0
  60. kolega_code-0.45.0/kolega_code/llm/timeouts.py +76 -0
  61. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/usage.py +3 -1
  62. kolega_code-0.45.0/kolega_code/session/background.py +455 -0
  63. {kolega_code-0.43.0 → kolega_code-0.45.0}/pyproject.toml +12 -3
  64. kolega_code-0.43.0/kolega_code/llm/timeouts.py +0 -37
  65. {kolega_code-0.43.0 → kolega_code-0.45.0}/.gitignore +0 -0
  66. {kolega_code-0.43.0 → kolega_code-0.45.0}/LICENSE +0 -0
  67. {kolega_code-0.43.0 → kolega_code-0.45.0}/MIGRATION.md +0 -0
  68. {kolega_code-0.43.0 → kolega_code-0.45.0}/RELEASING.md +0 -0
  69. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  70. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  71. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  72. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  73. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  74. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  75. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  76. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  77. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  78. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  79. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  80. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  81. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  82. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  83. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  84. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  85. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  86. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  87. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  88. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  89. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  90. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  91. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  92. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  93. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  94. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  95. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  96. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  97. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  98. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  99. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  100. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  101. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  102. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  103. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  104. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  105. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  106. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  107. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  108. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  109. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  110. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  111. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  112. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  113. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  114. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  115. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  116. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  117. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  118. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  119. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  120. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  121. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/__init__.py +0 -0
  122. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/diffs.py +0 -0
  123. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/permissions.py +0 -0
  124. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/plans.py +0 -0
  125. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/questions.py +0 -0
  126. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/usage.py +0 -0
  127. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/browseragent.py +0 -0
  128. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/coder.py +0 -0
  129. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/common.py +0 -0
  130. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/compression.py +0 -0
  131. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/context.py +0 -0
  132. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/conversation.py +0 -0
  133. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/custom_agents.py +0 -0
  134. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/edit_protocols.py +0 -0
  135. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/errors.py +0 -0
  136. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/__init__.py +0 -0
  137. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/bridge.py +0 -0
  138. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/env.py +0 -0
  139. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  140. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/kernel.py +0 -0
  141. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/prelude.js +0 -0
  142. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/prelude.py +0 -0
  143. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/protocol.py +0 -0
  144. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  145. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/runner.js +0 -0
  146. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/runner.py +0 -0
  147. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/generalagent.py +0 -0
  148. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/goal.py +0 -0
  149. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/handoff.py +0 -0
  150. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/investigationagent.py +0 -0
  151. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/model_routing.py +0 -0
  152. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  153. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  154. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/budget.py +0 -0
  155. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/context.py +0 -0
  156. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/errors.py +0 -0
  157. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/executor.py +0 -0
  158. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/guide.py +0 -0
  159. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/journal.py +0 -0
  160. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  161. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/types.py +0 -0
  162. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/planningagent.py +0 -0
  163. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_dump.py +0 -0
  164. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_overrides.py +0 -0
  165. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_provider.py +0 -0
  166. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  167. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  168. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  169. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  170. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  171. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +0 -0
  172. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +0 -0
  173. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  174. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  175. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  176. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  177. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  178. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  179. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  180. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  181. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  182. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  183. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  184. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  185. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  186. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  187. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  188. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  189. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  190. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  191. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  192. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  193. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  194. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  195. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  196. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  197. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  198. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  199. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  200. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  201. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  202. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  203. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  204. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  205. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  206. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  207. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  208. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  209. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  210. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  211. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  212. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  213. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  214. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  215. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  216. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  217. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  218. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  219. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  220. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  221. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  222. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  223. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  224. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  225. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  226. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  227. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  228. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  229. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  230. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  231. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  232. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  233. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  234. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  235. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  236. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  237. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  238. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
  239. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  240. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  241. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  242. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  243. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  244. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  245. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  246. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  247. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  248. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  249. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
  250. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  251. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  252. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  253. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  254. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  255. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  256. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  257. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  258. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  259. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  260. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  261. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  262. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompts.py +0 -0
  263. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/session_metadata.py +0 -0
  264. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  265. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  266. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  267. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  268. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  269. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  270. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  271. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  272. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  273. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  274. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  275. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  276. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  277. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  278. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  279. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  280. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  281. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  282. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  283. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  284. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  285. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  286. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  287. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  288. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  289. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  290. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  291. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  292. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  293. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  294. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  295. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  296. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  297. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/utils/commands.py +0 -0
  298. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/volatile_context.py +0 -0
  299. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/__init__.py +0 -0
  300. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/_jwt.py +0 -0
  301. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  302. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/constants.py +0 -0
  303. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/tokens.py +0 -0
  304. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/__init__.py +0 -0
  305. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/framing.py +0 -0
  306. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/installer.py +0 -0
  307. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/manager.py +0 -0
  308. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/multiplex.py +0 -0
  309. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/native_host.py +0 -0
  310. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/protocol.py +0 -0
  311. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/registry.py +0 -0
  312. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/runtime.py +0 -0
  313. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/__init__.py +0 -0
  314. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/ask_output.py +0 -0
  315. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/atif_export.py +0 -0
  316. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/browser_backend.py +0 -0
  317. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/clipboard_image.py +0 -0
  318. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/connection.py +0 -0
  319. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/cron.py +0 -0
  320. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/diagnostics.py +0 -0
  321. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/file_index.py +0 -0
  322. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/gateway.py +0 -0
  323. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/goal.py +0 -0
  324. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/loop.py +0 -0
  325. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/mentions.py +0 -0
  326. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/model_connection.py +0 -0
  327. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/peer_messaging.py +0 -0
  328. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/plan_artifacts.py +0 -0
  329. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/prompt_history.py +0 -0
  330. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_event_protocol.py +0 -0
  331. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/settings.py +0 -0
  332. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/skills.py +0 -0
  333. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/slash_commands.py +0 -0
  334. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/theme.py +0 -0
  335. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/__init__.py +0 -0
  336. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/boot_splash.py +0 -0
  337. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  338. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/custom_model.py +0 -0
  339. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/discovery.py +0 -0
  340. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  341. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/metadata.py +0 -0
  342. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  343. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/pacing.py +0 -0
  344. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  345. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/session_diff.py +0 -0
  346. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/settings_screen.py +0 -0
  347. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/settings_widgets.py +0 -0
  348. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/styles.tcss +0 -0
  349. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/task_list.py +0 -0
  350. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  351. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/tool_presentation.py +0 -0
  352. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/updater.py +0 -0
  353. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/extensions.py +0 -0
  354. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/__init__.py +0 -0
  355. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/access.py +0 -0
  356. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/access_settings.py +0 -0
  357. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/__init__.py +0 -0
  358. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/base.py +0 -0
  359. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/echo.py +0 -0
  360. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/telegram/__init__.py +0 -0
  361. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/telegram/adapter.py +0 -0
  362. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/telegram/formatting.py +0 -0
  363. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/bridge.py +0 -0
  364. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/commands.py +0 -0
  365. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/config.py +0 -0
  366. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/control_relay.py +0 -0
  367. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/daemon.py +0 -0
  368. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/event_router.py +0 -0
  369. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/questions.py +0 -0
  370. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/redaction.py +0 -0
  371. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/service.py +0 -0
  372. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/stt.py +0 -0
  373. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/git_env.py +0 -0
  374. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/__init__.py +0 -0
  375. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/backends.py +0 -0
  376. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/config.py +0 -0
  377. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/dispatcher.py +0 -0
  378. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/events.py +0 -0
  379. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/matcher.py +0 -0
  380. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/outcome.py +0 -0
  381. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/ledger.py +0 -0
  382. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/models.py +0 -0
  383. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/__init__.py +0 -0
  384. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  385. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/anthropic.py +0 -0
  386. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/base.py +0 -0
  387. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  388. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  389. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/google.py +0 -0
  390. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/mistral.py +0 -0
  391. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/models.py +0 -0
  392. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/openai.py +0 -0
  393. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  394. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
  395. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/tinker.py +0 -0
  396. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  397. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/ratelimit.py +0 -0
  398. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/__init__.py +0 -0
  399. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/accessors.py +0 -0
  400. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  401. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  402. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  403. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  404. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/groq.py +0 -0
  405. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  406. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  407. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  408. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  409. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  410. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  411. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
  412. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  413. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  414. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  415. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  416. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  417. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  418. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  419. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
  420. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/thinking.py +0 -0
  421. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  422. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/types.py +0 -0
  423. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/validation.py +0 -0
  424. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  425. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/local_state.py +0 -0
  426. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/__init__.py +0 -0
  427. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/config.py +0 -0
  428. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/oauth.py +0 -0
  429. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/service.py +0 -0
  430. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/state.py +0 -0
  431. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/tools.py +0 -0
  432. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/transport.py +0 -0
  433. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/__init__.py +0 -0
  434. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/identity.py +0 -0
  435. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/manager.py +0 -0
  436. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/manifest.py +0 -0
  437. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/markdown.py +0 -0
  438. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/models.py +0 -0
  439. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/protocol.py +0 -0
  440. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/registry.py +0 -0
  441. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/models/__init__.py +0 -0
  442. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  443. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/permissions.py +0 -0
  444. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/runtime.py +0 -0
  445. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/README.md +0 -0
  446. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/__init__.py +0 -0
  447. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  448. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/base.py +0 -0
  449. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/browser.py +0 -0
  450. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/event_loop.py +0 -0
  451. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/filesystem.py +0 -0
  452. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/local.py +0 -0
  453. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/serializer.py +0 -0
  454. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/terminal.py +0 -0
  455. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/utils.py +0 -0
  456. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/scratchpad.py +0 -0
  457. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/security/__init__.py +0 -0
  458. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/security/secrets.py +0 -0
  459. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/base.py +0 -0
  460. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/browser.py +0 -0
  461. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/file_system.py +0 -0
  462. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/html.py +0 -0
  463. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/__init__.py +0 -0
  464. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/client.py +0 -0
  465. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/config.py +0 -0
  466. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/detector.py +0 -0
  467. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  468. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/edits.py +0 -0
  469. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/manager.py +0 -0
  470. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/registry.py +0 -0
  471. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/registry.yaml +0 -0
  472. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/snapshots.py +0 -0
  473. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/terminal.py +0 -0
  474. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/terminal_buffer.py +0 -0
  475. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/workspace_scan.py +0 -0
  476. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/__init__.py +0 -0
  477. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/control.py +0 -0
  478. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/inbox.py +0 -0
  479. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/inmemory.py +0 -0
  480. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/projection.py +0 -0
  481. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/recording.py +0 -0
  482. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/runtime.py +0 -0
  483. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/store.py +0 -0
  484. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/testing/__init__.py +0 -0
  485. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/testing/store_conformance.py +0 -0
  486. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tool_subjects.py +0 -0
  487. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/__init__.py +0 -0
  488. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/ask_user.py +0 -0
  489. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/core.py +0 -0
  490. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/definitions.py +0 -0
  491. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/param_aliases.py +0 -0
  492. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/registry.py +0 -0
  493. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/utils/__init__.py +0 -0
  494. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/utils/images.py +0 -0
  495. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/__init__.py +0 -0
  496. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/fold.js +0 -0
  497. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/player.css +0 -0
  498. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/player.html +0 -0
  499. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/player.js +0 -0
  500. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/bundle.py +0 -0
  501. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/hosting.py +0 -0
  502. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/redaction.py +0 -0
  503. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/server.py +0 -0
  504. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/singlefile.py +0 -0
  505. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/theme_css.py +0 -0
  506. {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,99 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.45.0 - 2026-10-22
10
+
11
+ ### Added
12
+
13
+ - **First-party MiniMax support.** Select `minimax` with `MINIMAX_API_KEY`
14
+ or a key saved in Settings. Includes MiniMax M3.1 Flash (the default), M3,
15
+ and the M2 family, with streaming, tool calling, usage reporting, image
16
+ input on M3 models, and adjustable adaptive thinking on M3.1 Flash.
17
+ - **Mistral model refresh.** `kolega-code models refresh --provider mistral`
18
+ caches Mistral's live, account-visible model list so models published after a
19
+ release resolve without upgrading. The endpoint is authenticated, so the
20
+ command uses `MISTRAL_API_KEY` or a key saved in Settings. A refresh only adds
21
+ models Kolega does not already know and never overrides a bundled spec.
22
+
23
+ ### Changed
24
+
25
+ - Reduced session-recording overhead during long turns by avoiding redundant
26
+ journal reads while the process exclusively owns the session.
27
+ - Updated the documentation site's image-processing dependency, sharp, to 0.35.5.
28
+
29
+ ### Fixed
30
+
31
+ - **Completed turns no longer leave the TUI stuck as busy on Python 3.12+.**
32
+ Ordinary turns, background-agent continuations, and scheduled loops now
33
+ release their timer and active-turn state correctly.
34
+ - **Stop no longer remains indefinitely on "Stopping…".** A second Stop or
35
+ five-second grace period restores the UI while unfinished cleanup remains
36
+ isolated. New turns and session, model, or settings changes wait for that
37
+ cleanup; late output cannot overwrite the current UI.
38
+ - **Silent model requests are bounded.** Separate first-response and idle
39
+ deadlines, bounded retries, and bounded stream cleanup prevent long,
40
+ unexplained waits. Compact connection-status notices keep the next action
41
+ visible even in narrow terminals; detailed errors remain in diagnostics.
42
+ - Slow session writes no longer indefinitely hide finished plans or prevent
43
+ turn finalization. Writes continue in the background with warnings and
44
+ diagnostics, and older delayed saves cannot overwrite newer state.
45
+ - Worktree switches committed before cancellation are completed or recovered
46
+ safely before queued work resumes.
47
+ - Quit now uses bounded waits and a final process-exit watchdog for stuck
48
+ cleanup or worker threads. The watchdog is disarmed when shutdown returns
49
+ normally.
50
+ - **Mistral catalog drift.** Large 4's context window is 1,048,576 tokens (was
51
+ 524,288), Mistral Large 3 (`mistral-large-2512`) and its `latest` alias are now
52
+ catalogued, and `mistral-code-latest` resolves to Codestral. Large 4 is no
53
+ longer labelled a preview.
54
+ - **ACP model picker honours exported credentials.** Editor sessions now list
55
+ providers whose API key comes from the environment, matching the CLI, instead
56
+ of only providers saved through onboarding.
57
+
58
+ ### Security
59
+
60
+ - Updated aiohttp to 3.14.5 for three parser/timeout advisories, with its
61
+ required yarl update to 1.25.1.
62
+ - Updated Pillow to 13.0.0 in the application and standalone eval bundle for
63
+ eight security advisories.
64
+ - Updated certifi to 2026.10.19, removing compromised emSign roots.
65
+
66
+ ## 0.44.0 - 2026-10-19
67
+
68
+ ### Added
69
+
70
+ - **Background sub-agents.** The agent can delegate with
71
+ `dispatch_agent(..., background=True)` and keep working while the child runs;
72
+ foreground dispatch remains the default. Jobs belong to the session in the
73
+ TUI, `ask`, `--loop`, goal runs, editor (ACP) sessions, and gateway chats.
74
+ Completion reports arrive automatically and normally start a continuation
75
+ instead of becoming extra prompts. The new `agent_job` tool lists, inspects,
76
+ or cancels jobs, with reports retained after completion, failure, or
77
+ cancellation. Persisted outcomes can be recovered when a session resumes, and
78
+ reported background usage is attributed to the session. Jobs survive turns,
79
+ not process exit; cancelling a main turn does not discard child results.
80
+ - The TUI shows a persistent background-agent indicator above the composer,
81
+ distinguishing running, queued, undelivered, and failed work, and lists
82
+ retained jobs in the `Ctrl+G` sub-agent inspector. Delivered reports appear as
83
+ collapsed rows that expand on click or `Enter`, including after a session is
84
+ restored.
85
+ - Added native Google Gemini 4 Argon (`gemini-4-argon`) and xAI Grok 4.7
86
+ (`grok-4.7`) support, including model selectors, image input, streaming, tool
87
+ calling, and named reasoning efforts. Argon uses a shared 1,048,576-token
88
+ input/thinking/output window; Grok 4.7 uses 500,000 tokens and supports `xhigh`
89
+ effort. Existing provider defaults remain unchanged.
90
+
91
+ ### Fixed
92
+
93
+ - Late transcript updates during screen teardown no longer raise while the
94
+ conversation is being pruned, so exiting or switching sessions can no longer
95
+ fail on a stale render.
96
+
97
+ ### Security
98
+
99
+ - Updated mcp to 1.30.0, closing CVE-2026-59951 (GHSA-84m7-p3x7-pcfv), a
100
+ streamable-HTTP session exhaustion issue in the MCP client.
101
+
9
102
  ## 0.43.0 - 2026-10-13
10
103
 
11
104
  ### Added
@@ -120,6 +120,18 @@ You can pass additional pytest arguments through the wrapper:
120
120
  ./run_tests.sh tests/test_git_env.py -ra
121
121
  ```
122
122
 
123
+ ## Comments
124
+
125
+ Comments are rare here. Write one only where the code cannot say it: a non-obvious
126
+ constraint, a failure mode, or a probed vendor behaviour.
127
+
128
+ - Don't restate a self-explanatory constant or boolean in prose above it.
129
+ - Don't write a docstring that rewords the signature, or one longer than the body it
130
+ documents.
131
+ - Don't transcribe research (probe logs, vendor quirks) into a source-file banner —
132
+ that belongs in `docs/`, `CHANGELOG.md`, or the test that pins the behaviour.
133
+ - Explain a subtle decision once, at the place it is made, not at every call site.
134
+
123
135
  ## Updating bundled skills
124
136
 
125
137
  Kolega Code vendors a reviewed, tagged snapshot from
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.43.0
3
+ Version: 0.45.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/
@@ -45,14 +45,14 @@ Requires-Dist: langfuse==3.14.5
45
45
  Requires-Dist: lxml-html-clean==0.4.5
46
46
  Requires-Dist: markdownify==1.2.3
47
47
  Requires-Dist: markitdown[docx,pdf,pptx,xls,xlsx]==0.1.6
48
- Requires-Dist: mcp==1.28.1
48
+ Requires-Dist: mcp==1.30.0
49
49
  Requires-Dist: nest-asyncio==1.6.0
50
50
  Requires-Dist: onnxruntime==1.19.2; sys_platform == 'darwin' and platform_machine == 'x86_64' and python_version < '3.13'
51
51
  Requires-Dist: onnxruntime==1.27.0; python_version >= '3.14' and sys_platform != 'win32'
52
52
  Requires-Dist: openai==2.46.0
53
53
  Requires-Dist: packaging==25.0
54
54
  Requires-Dist: pathspec==1.1.1
55
- Requires-Dist: pillow==12.3.0
55
+ Requires-Dist: pillow==13.0.0
56
56
  Requires-Dist: playwright==1.59.0
57
57
  Requires-Dist: psutil==7.2.2
58
58
  Requires-Dist: pydantic==2.13.4
@@ -271,6 +271,7 @@ Supported model providers:
271
271
  - DashScope / Qwen
272
272
  - OpenRouter (gateway to 250+ tool-capable models)
273
273
  - Moonshot / Kimi
274
+ - MiniMax
274
275
  - DeepSeek
275
276
  - Z.AI / GLM Coding Plan
276
277
  - Kimi Coding Plan
@@ -314,20 +315,27 @@ kolega-code . --provider mistral --model mistral-medium-3-5
314
315
  ```
315
316
 
316
317
  The picker defaults to Mistral Medium 3.5 and includes Mistral Small 4
317
- (`mistral-small-2603`), Mistral Large 4 **preview** (`mistral-large-4`),
318
- Ministral 3 (3B/8B/14B), Codestral, and eligible native aliases. Large 4 access
319
- depends on the account/subscription; a catalog entry does not guarantee access.
320
- Aliases, especially `latest`, can change their target and capabilities.
318
+ (`mistral-small-2603`), Mistral Large 4 (`mistral-large-4`), Mistral Large 3
319
+ (`mistral-large-2512`), Ministral 3 (3B/8B/14B), Codestral, and eligible native
320
+ aliases. Windows and capabilities mirror Mistral's authenticated model list; a
321
+ catalog entry does not guarantee access, because subscription tiers and
322
+ organization policies still apply. Aliases, especially `latest`, can change
323
+ their target and capabilities.
321
324
 
322
325
  Medium 3.5, Small 4, Large 4, and Ministral 3 support image input; Codestral is
323
- text-only. Medium/Small/Large expose `none` (default) or `high` thinking, with
324
- same-provider reasoning replayed in Mistral's native format. Token counting is
326
+ text-only. Medium 3.5, Small 4 and Large 4 expose `none` (default) or `high`
327
+ thinking, with same-provider reasoning replayed in Mistral's native format;
328
+ Large 3, Ministral 3 and Codestral expose no thinking control. Token counting is
325
329
  a conservative local estimate with a safety margin, not an exact Mistral
326
330
  tokenizer. The catalog's 32,768-token output reservation is Kolega's budgeting
327
331
  policy, not a verified native maximum-output ceiling. Kolega Code runs the local
328
332
  function-tool loop; Mistral-hosted server tools are not enabled. Native Mistral
329
333
  keys and model IDs are separate from gateway credentials and routes.
330
334
 
335
+ Mistral publishes models between releases; `kolega-code models refresh --provider mistral`
336
+ caches the live list locally. It adds only models Kolega does not already ship
337
+ and never overrides a bundled spec.
338
+
331
339
  ## Requirements
332
340
 
333
341
  - **Python 3.11+**
@@ -180,6 +180,7 @@ Supported model providers:
180
180
  - DashScope / Qwen
181
181
  - OpenRouter (gateway to 250+ tool-capable models)
182
182
  - Moonshot / Kimi
183
+ - MiniMax
183
184
  - DeepSeek
184
185
  - Z.AI / GLM Coding Plan
185
186
  - Kimi Coding Plan
@@ -223,20 +224,27 @@ kolega-code . --provider mistral --model mistral-medium-3-5
223
224
  ```
224
225
 
225
226
  The picker defaults to Mistral Medium 3.5 and includes Mistral Small 4
226
- (`mistral-small-2603`), Mistral Large 4 **preview** (`mistral-large-4`),
227
- Ministral 3 (3B/8B/14B), Codestral, and eligible native aliases. Large 4 access
228
- depends on the account/subscription; a catalog entry does not guarantee access.
229
- Aliases, especially `latest`, can change their target and capabilities.
227
+ (`mistral-small-2603`), Mistral Large 4 (`mistral-large-4`), Mistral Large 3
228
+ (`mistral-large-2512`), Ministral 3 (3B/8B/14B), Codestral, and eligible native
229
+ aliases. Windows and capabilities mirror Mistral's authenticated model list; a
230
+ catalog entry does not guarantee access, because subscription tiers and
231
+ organization policies still apply. Aliases, especially `latest`, can change
232
+ their target and capabilities.
230
233
 
231
234
  Medium 3.5, Small 4, Large 4, and Ministral 3 support image input; Codestral is
232
- text-only. Medium/Small/Large expose `none` (default) or `high` thinking, with
233
- same-provider reasoning replayed in Mistral's native format. Token counting is
235
+ text-only. Medium 3.5, Small 4 and Large 4 expose `none` (default) or `high`
236
+ thinking, with same-provider reasoning replayed in Mistral's native format;
237
+ Large 3, Ministral 3 and Codestral expose no thinking control. Token counting is
234
238
  a conservative local estimate with a safety margin, not an exact Mistral
235
239
  tokenizer. The catalog's 32,768-token output reservation is Kolega's budgeting
236
240
  policy, not a verified native maximum-output ceiling. Kolega Code runs the local
237
241
  function-tool loop; Mistral-hosted server tools are not enabled. Native Mistral
238
242
  keys and model IDs are separate from gateway credentials and routes.
239
243
 
244
+ Mistral publishes models between releases; `kolega-code models refresh --provider mistral`
245
+ caches the live list locally. It adds only models Kolega does not already ship
246
+ and never overrides a bundled spec.
247
+
240
248
  ## Requirements
241
249
 
242
250
  - **Python 3.11+**
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.43.0"
177
+ __version__ = "0.45.0"
@@ -18,6 +18,7 @@ the process keeps serving.
18
18
  from __future__ import annotations
19
19
 
20
20
  import logging
21
+ import os
21
22
  from pathlib import Path
22
23
  from typing import Any, Awaitable, Callable, cast
23
24
 
@@ -38,7 +39,7 @@ from kolega_code.agent.prompt_provider import AgentMode
38
39
  from kolega_code.agent.prompts import BUILD_QUESTION_PROMPT, PLANNING_QUESTION_PROMPT
39
40
  from kolega_code.agent.tool_definitions import tool_description_asset
40
41
  from kolega_code.agent.volatile_context import VolatileSection
41
- from kolega_code.cli.config import CliConfigOverrides, build_agent_config, config_summary
42
+ from kolega_code.cli.config import API_KEY_ENV, CliConfigOverrides, build_agent_config, config_summary
42
43
  from kolega_code.cli.connection import CliConnectionManager
43
44
  from kolega_code.cli.provider_registry import PROVIDER_LABELS, ui_model_options
44
45
  from kolega_code.cli.session_event_store import FileArtifactStore, FileSessionEventStore
@@ -139,6 +140,15 @@ class AgentFactory:
139
140
  return
140
141
  self.persist(session)
141
142
  try:
143
+ jobs = getattr(session.agent, "background_jobs", None)
144
+ if jobs is not None:
145
+ jobs.set_callbacks(on_ready=None, on_delivered=None)
146
+ await jobs.close()
147
+ await jobs.deliver(session.agent)
148
+ self.persist(session)
149
+ for old in session.retired_agents:
150
+ await old.cleanup()
151
+ session.retired_agents.clear()
142
152
  await session.agent.cleanup()
143
153
  except Exception: # noqa: BLE001 — closing must not mask the primary outcome
144
154
  logger.exception("acp session close: agent cleanup failed (session=%s)", session_id)
@@ -238,12 +248,24 @@ class AgentFactory:
238
248
  settings_store=self._settings_store,
239
249
  )
240
250
 
241
- def _model_option(self, session: AcpSession) -> SessionConfigOptionSelect:
251
+ def _configured_providers(self) -> list[str]:
252
+ """Providers the editor can offer: saved keys plus exported credentials.
253
+
254
+ ACP spawns as a child of the editor, which inherits the shell
255
+ environment. The CLI already treats an exported ``*_API_KEY`` as
256
+ sufficient, so an env-only provider must not be invisible here just
257
+ because it was never saved through onboarding.
258
+ """
242
259
  assert self._settings is not None
260
+ providers = {provider for provider, key in self._settings.api_keys.items() if key}
261
+ providers.update(
262
+ provider.value for provider, env_name in API_KEY_ENV.items() if (os.environ.get(env_name) or "").strip()
263
+ )
264
+ return sorted(providers)
265
+
266
+ def _model_option(self, session: AcpSession) -> SessionConfigOptionSelect:
243
267
  groups: list[SessionConfigSelectGroup] = []
244
- for provider, key in sorted(self._settings.api_keys.items()):
245
- if not key:
246
- continue
268
+ for provider in self._configured_providers():
247
269
  options = [
248
270
  SessionConfigSelectOption(value=f"{provider}/{model}", name=label)
249
271
  for label, model in ui_model_options(provider)
@@ -315,10 +337,24 @@ class AgentFactory:
315
337
  permission_mode=old.permission_mode,
316
338
  question_state=session.question_state,
317
339
  )
340
+ # New generations must keep publishing into the session-lifetime event
341
+ # consumer, including children still using the previous generation.
342
+ if manager is not session.manager:
343
+ raise RuntimeError("ACP rebuild must preserve the session connection manager")
318
344
  session.agent = agent
319
- session.manager = manager
345
+ jobs = getattr(old, "background_jobs", None)
346
+ if jobs is not None and agent is not old:
347
+ agent.background_jobs = jobs
348
+ agent.background_needs_turn = getattr(old, "background_needs_turn", False)
349
+ old.background_jobs = None
350
+ if jobs is not None and jobs.active_count and agent is not old:
351
+ # Children borrow this generation's terminal/browser/extensions.
352
+ # Keep it alive until the supervisor has joined them.
353
+ session.retired_agents.append(old)
354
+ return
320
355
  try:
321
- await old.cleanup()
356
+ if agent is not old:
357
+ await old.cleanup()
322
358
  except Exception: # noqa: BLE001
323
359
  logger.exception("acp model switch: old agent cleanup failed (session=%s)", session.session_id)
324
360
 
@@ -369,7 +405,8 @@ class AgentFactory:
369
405
  ) -> tuple[CoderAgent, CliConnectionManager]:
370
406
  journal = self._store.journal(record.session_id)
371
407
  recorder = self._store.recorder(record.session_id)
372
- manager = CliConnectionManager()
408
+ existing = self._acp_sessions.get(record.session_id)
409
+ manager = existing.manager if existing is not None else CliConnectionManager()
373
410
  recording = RecordingConnectionManager(
374
411
  manager,
375
412
  FileSessionEventStore(journal),
@@ -111,6 +111,12 @@ class AcpBridge:
111
111
  #: label the dispatching card's title.
112
112
  self._dispatch_labels: dict[str, str] = {}
113
113
 
114
+ def begin_turn(self, agent: Any, diff_provider: AcpDiffProvider) -> None:
115
+ """Reset turn-only projections, retaining session-lifetime tool maps."""
116
+ self._agent = agent
117
+ self._diffs = diff_provider
118
+ self._turn_response_parts.clear()
119
+
114
120
  async def send(self, session_id: str, update: Any) -> None:
115
121
  if logger.isEnabledFor(logging.DEBUG):
116
122
  logger.debug(
@@ -188,6 +188,7 @@ class AcpAgent(Agent):
188
188
  return await self._load_sub_session(session_id)
189
189
  if session_id in self._sessions:
190
190
  existing = self._sessions[session_id]
191
+ self._start_session_tasks(existing)
191
192
  return LoadSessionResponse(config_options=self._factory.config_options_for(existing))
192
193
  try:
193
194
  session = await self._factory.load_session(
@@ -204,6 +205,7 @@ class AcpAgent(Agent):
204
205
  await self._emit_initial_usage(session)
205
206
  await self._send_available_commands(session)
206
207
  await self._replay_transcript(session)
208
+ self._start_session_tasks(session)
207
209
  return LoadSessionResponse(config_options=self._factory.config_options_for(session))
208
210
 
209
211
  async def _load_sub_session(self, session_id: str) -> LoadSessionResponse:
@@ -254,11 +256,33 @@ class AcpAgent(Agent):
254
256
 
255
257
  async def close_session(self, session_id: str, **kwargs: Any) -> None:
256
258
  logger.info("acp session/close (session=%s)", session_id)
257
- self._sessions.pop(session_id, None)
259
+ session = self._sessions.pop(session_id, None)
260
+ if session is not None:
261
+ session.closed = True
262
+ session.auto_continue_paused = True
263
+ if session.turn_task is not None:
264
+ session.turn_task.cancel()
265
+ await asyncio.gather(session.turn_task, return_exceptions=True)
266
+ if session.background_task is not None:
267
+ session.background_task.cancel()
268
+ await asyncio.gather(session.background_task, return_exceptions=True)
258
269
  self._brokers.pop(session_id, None)
259
- await self._factory.close_session(session_id)
270
+ if session is not None:
271
+ async with session.execution_lock:
272
+ await self._factory.close_session(session_id)
273
+ else:
274
+ await self._factory.close_session(session_id)
275
+ if session is not None and session.event_task is not None:
276
+ session.event_task.cancel()
277
+ await asyncio.gather(session.event_task, return_exceptions=True)
278
+ await self._drain_residual(session, session.bridge)
260
279
  return None
261
280
 
281
+ async def shutdown(self) -> None:
282
+ """Join session work before the ACP transport and shared services close."""
283
+ for session_id in list(self._sessions):
284
+ await self.close_session(session_id)
285
+
262
286
  # -- turns ------------------------------------------------------------
263
287
 
264
288
  async def prompt(self, session_id: str, prompt: list[_PromptBlock], **kwargs: Any) -> PromptResponse:
@@ -270,13 +294,19 @@ class AcpAgent(Agent):
270
294
  text = self._extract_text(prompt)
271
295
  if not text:
272
296
  raise RequestError.invalid_request({"message": "prompt contains no text"})
273
- stop_reason = await self._run_turn(session, text)
274
- self._factory.persist(session)
297
+ self._start_session_tasks(session)
298
+ async with session.execution_lock:
299
+ session.auto_continue_paused = False
300
+ stop_reason = await self._run_turn(session, text)
301
+ self._factory.persist(session)
275
302
  return PromptResponse(stop_reason=stop_reason)
276
303
 
277
304
  async def cancel(self, session_id: str, **kwargs: Any) -> None:
278
305
  session = self._sessions.get(session_id)
279
- if session is None or session.turn_task is None:
306
+ if session is None:
307
+ return
308
+ session.auto_continue_paused = True
309
+ if session.turn_task is None:
280
310
  logger.debug("acp session/cancel: nothing to cancel (session=%s)", session_id)
281
311
  return
282
312
  logger.info("acp session/cancel (session=%s)", session_id)
@@ -314,7 +344,8 @@ class AcpAgent(Agent):
314
344
  raise RequestError.invalid_params({"message": f"unknown mode {mode_id!r}; available: build, plan"})
315
345
  if not session.idle():
316
346
  raise RequestError.invalid_request({"message": "modes apply between turns only"})
317
- await self._factory.set_interaction_mode(session, mode_id)
347
+ async with session.execution_lock:
348
+ await self._factory.set_interaction_mode(session, mode_id)
318
349
  logger.info("acp session mode -> %s (session=%s)", mode_id, session_id)
319
350
  await self._emit_current_mode(session)
320
351
  return SetSessionModeResponse()
@@ -342,14 +373,16 @@ class AcpAgent(Agent):
342
373
  raise RequestError.invalid_params({"message": "model option expects 'provider/model'"})
343
374
  provider, model = value.split("/", 1)
344
375
  try:
345
- await self._factory.apply_model(session, provider, model)
376
+ async with session.execution_lock:
377
+ await self._factory.apply_model(session, provider, model)
346
378
  except _HANDLED_CONFIG_ERRORS as exc:
347
379
  raise AgentFactory.protocol_error(exc) from exc
348
380
  logger.info("acp session config: model -> %s/%s (session=%s)", provider, model, session_id)
349
381
  elif config_id == CONFIG_MODE:
350
382
  if value not in INTERACTION_MODES:
351
383
  raise RequestError.invalid_params({"message": f"unknown mode {value!r}; available: build, plan"})
352
- await self._factory.set_interaction_mode(session, str(value))
384
+ async with session.execution_lock:
385
+ await self._factory.set_interaction_mode(session, str(value))
353
386
  logger.info("acp session config: mode -> %s (session=%s)", value, session_id)
354
387
  await self._emit_current_mode(session)
355
388
  else:
@@ -438,6 +471,7 @@ class AcpAgent(Agent):
438
471
  return
439
472
  await self._emit_initial_usage(session)
440
473
  await self._send_available_commands(session)
474
+ self._start_session_tasks(session)
441
475
 
442
476
  async def _send_available_commands(self, session: AcpSession) -> None:
443
477
  """Advertise the agent's slash commands for the client's command UI.
@@ -525,29 +559,107 @@ class AcpAgent(Agent):
525
559
 
526
560
  # -- turn machinery ----------------------------------------------------
527
561
 
528
- async def _run_turn(self, session: AcpSession, text: str) -> StopReason:
562
+ def _start_session_tasks(self, session: AcpSession) -> None:
563
+ if session.closed:
564
+ return
565
+ if session.event_task is None:
566
+ session.bridge = AcpBridge(
567
+ self._conn, diff_provider=AcpDiffProvider.for_session(session), agent=session.agent
568
+ )
569
+ session.event_task = asyncio.create_task(
570
+ self._pump_events(session, session.bridge), name=f"acp-events-{session.session_id}"
571
+ )
572
+ # Explicit session activity rearms retained presentation work, including
573
+ # after a transport failure. The worker must not retry itself on failure.
574
+ if session.completions:
575
+ session.background_wake.set()
576
+ if session.background_task is not None and not session.background_task.done():
577
+ return
578
+ get_jobs = getattr(session.agent, "get_background_jobs", None)
579
+ if callable(get_jobs):
580
+ jobs: Any = get_jobs()
581
+
582
+ def delivered(completion: dict[str, Any]) -> None:
583
+ session.completions.append(completion)
584
+ session.background_wake.set()
585
+
586
+ jobs.set_callbacks(on_ready=session.background_wake.set, on_delivered=delivered)
587
+ session.background_task = asyncio.create_task(
588
+ self._background_worker(session, jobs), name=f"acp-background-{session.session_id}"
589
+ )
590
+
591
+ async def _background_worker(self, session: AcpSession, jobs: Any) -> None:
592
+ await jobs.recover()
593
+ if jobs.pending_count:
594
+ session.background_wake.set()
595
+ while not session.closed:
596
+ await session.background_wake.wait()
597
+ session.background_wake.clear()
598
+ async with session.execution_lock:
599
+ if session.closed:
600
+ return
601
+ try:
602
+ await jobs.deliver(session.agent)
603
+ # Delivery callbacks also wake the worker for reports
604
+ # inserted by the running agent. Consume those wakeups now,
605
+ # not after sending: a failed send must wait for new activity,
606
+ # while readiness arriving during presentation must survive.
607
+ session.background_wake.clear()
608
+ if jobs.pending_count:
609
+ session.background_wake.set()
610
+ completions = bool(session.completions)
611
+ try:
612
+ while session.completions:
613
+ completion = session.completions[0]
614
+ await session.bridge.send(
615
+ session.session_id, update_agent_thought_text(str(completion["text"]))
616
+ )
617
+ # History insertion is already durable. Acknowledge
618
+ # presentation separately, only after this send
619
+ # succeeds; failure/cancellation retains the suffix.
620
+ session.completions.pop(0)
621
+ except Exception:
622
+ logger.exception("acp background presentation failed (session=%s)", session.session_id)
623
+ continue
624
+ if (
625
+ completions
626
+ and not session.auto_continue_paused
627
+ and getattr(session.agent, "background_needs_turn", True)
628
+ ):
629
+ await self._run_turn(session, None)
630
+ self._factory.persist(session)
631
+ if jobs is not getattr(session.agent, "background_jobs", None):
632
+ return # a context reset installed another epoch's owner
633
+ if not jobs.active_count:
634
+ for old in session.retired_agents:
635
+ await old.cleanup()
636
+ session.retired_agents.clear()
637
+ except asyncio.CancelledError:
638
+ raise
639
+ except Exception:
640
+ # A failed automatic turn must not spin or silently kill
641
+ # the prompt owner. Explicit input can resume it.
642
+ session.auto_continue_paused = True
643
+ logger.exception("acp background delivery failed (session=%s)", session.session_id)
644
+
645
+ async def _run_turn(self, session: AcpSession, text: str | None) -> StopReason:
529
646
  """Drive one agent turn, mapping its output to ACP updates.
530
647
 
531
- Returns the ACP stop reason. The event pump runs until the turn task
532
- completes, then any residual queued events are drained so late tool
533
- results still render.
648
+ The event pump belongs to the session, not this request. It keeps
649
+ rendering child activity after a prompt's response has been returned.
534
650
  """
535
- session.drain_events()
536
- bridge = AcpBridge(self._conn, diff_provider=AcpDiffProvider.for_session(session), agent=session.agent)
651
+ self._start_session_tasks(session)
652
+ bridge = session.bridge
653
+ bridge.begin_turn(session.agent, AcpDiffProvider.for_session(session))
537
654
  session.turn_task = asyncio.create_task(self._drive_turn(session, bridge, text))
538
- pump = asyncio.create_task(self._pump_events(session, bridge))
655
+ reason: StopReason = "cancelled"
539
656
  try:
540
- return await session.turn_task
657
+ reason = await session.turn_task
658
+ return reason
541
659
  finally:
542
- pump.cancel()
543
- try:
544
- await pump
545
- except asyncio.CancelledError:
546
- pass
547
- await self._drain_residual(session, bridge)
548
660
  session.turn_task = None
549
661
  await bridge.emit_usage(session.session_id)
550
- plan = self._consume_plan(session, bridge)
662
+ plan = self._consume_plan(session, bridge) if reason != "cancelled" and not session.closed else None
551
663
  if plan:
552
664
  session.record.latest_plan_markdown = plan
553
665
  session.record.plan_pending = True
@@ -606,6 +718,20 @@ class AcpAgent(Agent):
606
718
  session.record.plan_pending = False
607
719
  session.record.plan_reofferable = False
608
720
  if option_id == "implement_plan_clear":
721
+ jobs = getattr(session.agent, "background_jobs", None)
722
+ if jobs is not None:
723
+ # The reset starts another epoch. Settle old-context work
724
+ # before clearing its history and creating a new owner.
725
+ jobs.set_callbacks(on_ready=None, on_delivered=None)
726
+ await jobs.close()
727
+ await jobs.deliver(session.agent)
728
+ session.agent.background_jobs = None
729
+ if session.background_task is not None and session.background_task is not asyncio.current_task():
730
+ session.background_task.cancel()
731
+ await asyncio.gather(session.background_task, return_exceptions=True)
732
+ session.background_task = None
733
+ session.completions.clear()
734
+ session.background_wake.clear()
609
735
  self._clear_agent_context(session)
610
736
  await self._factory.set_interaction_mode(session, MODE_BUILD)
611
737
  await self._emit_current_mode(session)
@@ -630,9 +756,14 @@ class AcpAgent(Agent):
630
756
  session.record.history = []
631
757
  session.record.compaction = {}
632
758
 
633
- async def _drive_turn(self, session: AcpSession, bridge: AcpBridge, text: str) -> str:
759
+ async def _drive_turn(self, session: AcpSession, bridge: AcpBridge, text: str | None) -> StopReason:
634
760
  try:
635
- async for chunk in session.agent.process_message_stream(text):
761
+ stream = (
762
+ session.agent.process_message_stream(text)
763
+ if text is not None
764
+ else session.agent.continue_from_history_stream()
765
+ )
766
+ async for chunk in stream:
636
767
  await bridge.emit_chunk(session.session_id, chunk)
637
768
  return "end_turn"
638
769
  except asyncio.CancelledError:
@@ -33,14 +33,15 @@ class AcpSession:
33
33
  question_state: dict[str, Any] = field(default_factory=dict)
34
34
  #: In-flight turn task; None when the session is idle. Set and cleared by the server.
35
35
  turn_task: asyncio.Task | None = field(default=None, repr=False)
36
+ execution_lock: asyncio.Lock = field(default_factory=asyncio.Lock, repr=False)
37
+ event_task: asyncio.Task[None] | None = field(default=None, repr=False)
38
+ background_task: asyncio.Task[None] | None = field(default=None, repr=False)
39
+ bridge: Any = field(default=None, repr=False)
40
+ background_wake: asyncio.Event = field(default_factory=asyncio.Event, repr=False)
41
+ completions: list[dict[str, Any]] = field(default_factory=list)
42
+ auto_continue_paused: bool = False
43
+ closed: bool = False
44
+ retired_agents: list[Any] = field(default_factory=list, repr=False)
36
45
 
37
46
  def idle(self) -> bool:
38
- return self.turn_task is None or self.turn_task.done()
39
-
40
- def drain_events(self) -> None:
41
- """Drop any events left over from a previous turn (stale mapping inputs)."""
42
- while not self.manager.events.empty():
43
- try:
44
- self.manager.events.get_nowait()
45
- except asyncio.QueueEmpty:
46
- break
47
+ return not self.execution_lock.locked() and (self.turn_task is None or self.turn_task.done())
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.43.0"
54
+ __version__ = "0.45.0"