kolega-code 0.42.0__tar.gz → 0.44.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 (503) hide show
  1. {kolega_code-0.42.0 → kolega_code-0.44.0}/CHANGELOG.md +58 -0
  2. {kolega_code-0.42.0 → kolega_code-0.44.0}/PKG-INFO +2 -2
  3. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/agent_factory.py +27 -3
  5. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/bridge.py +6 -0
  6. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/server.py +156 -25
  7. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/session.py +10 -9
  8. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/__init__.py +1 -1
  9. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/baseagent.py +246 -17
  10. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +1 -1
  11. kolega_code-0.44.0/kolega_code/agent/prompt_templates/tools/agent_job.md +8 -0
  12. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +10 -1
  13. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/agent_tool.py +306 -95
  14. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_definitions.py +28 -0
  15. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tools.py +30 -9
  16. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/acp.py +9 -1
  17. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/app.py +113 -8
  18. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/main.py +133 -24
  19. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/provider_registry.py +2 -0
  20. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/session_journal.py +509 -89
  21. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/session_store.py +8 -0
  22. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/session_usage.py +52 -6
  23. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/agent_runtime.py +395 -42
  24. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/app_base.py +30 -3
  25. kolega_code-0.44.0/kolega_code/cli/tui/background_status.py +116 -0
  26. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/shortcut_bar.py +2 -1
  27. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/startup.py +1 -1
  28. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/state.py +1 -0
  29. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/status_dashboard.py +111 -1
  30. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/sub_agent_screen.py +36 -0
  31. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/transcript.py +85 -15
  32. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/turn_status.py +29 -0
  33. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/widgets.py +17 -6
  34. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/router.py +9 -3
  35. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/sessions.py +166 -18
  36. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/models.py +12 -1
  37. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/deepseek_responses.py +5 -4
  38. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/responses_common.py +9 -8
  39. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/google.py +15 -0
  40. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/xai.py +16 -0
  41. kolega_code-0.44.0/kolega_code/session/background.py +455 -0
  42. {kolega_code-0.42.0 → kolega_code-0.44.0}/pyproject.toml +3 -2
  43. {kolega_code-0.42.0 → kolega_code-0.44.0}/.gitignore +0 -0
  44. {kolega_code-0.42.0 → kolega_code-0.44.0}/CONTRIBUTING.md +0 -0
  45. {kolega_code-0.42.0 → kolega_code-0.44.0}/LICENSE +0 -0
  46. {kolega_code-0.42.0 → kolega_code-0.44.0}/MIGRATION.md +0 -0
  47. {kolega_code-0.42.0 → kolega_code-0.44.0}/README.md +0 -0
  48. {kolega_code-0.42.0 → kolega_code-0.44.0}/RELEASING.md +0 -0
  49. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  50. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  51. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  52. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  53. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  54. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  55. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  56. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  57. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  58. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  59. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  60. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  61. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  62. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  63. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  64. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  65. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  66. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  67. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  68. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  69. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  70. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  71. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  72. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  73. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  74. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  75. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  76. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  77. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  78. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  79. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  80. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  81. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  82. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  83. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  84. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  85. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  86. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  87. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  88. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  89. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  90. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  91. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  92. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  93. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  94. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  95. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  96. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  97. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  98. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  99. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  100. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  101. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/__init__.py +0 -0
  102. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/diffs.py +0 -0
  103. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/permissions.py +0 -0
  104. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/plans.py +0 -0
  105. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/questions.py +0 -0
  106. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/acp/usage.py +0 -0
  107. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/browseragent.py +0 -0
  108. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/coder.py +0 -0
  109. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/common.py +0 -0
  110. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/compression.py +0 -0
  111. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/context.py +0 -0
  112. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/conversation.py +0 -0
  113. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/custom_agents.py +0 -0
  114. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/edit_protocols.py +0 -0
  115. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/errors.py +0 -0
  116. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/__init__.py +0 -0
  117. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/bridge.py +0 -0
  118. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  119. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  120. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/env.py +0 -0
  121. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  122. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/kernel.py +0 -0
  123. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/prelude.js +0 -0
  124. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/prelude.py +0 -0
  125. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/protocol.py +0 -0
  126. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  127. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/runner.js +0 -0
  128. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/eval/runner.py +0 -0
  129. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/generalagent.py +0 -0
  130. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/goal.py +0 -0
  131. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/handoff.py +0 -0
  132. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/investigationagent.py +0 -0
  133. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/model_routing.py +0 -0
  134. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  135. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  136. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/budget.py +0 -0
  137. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/context.py +0 -0
  138. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/errors.py +0 -0
  139. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/executor.py +0 -0
  140. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/guide.py +0 -0
  141. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/journal.py +0 -0
  142. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  143. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/orchestration/types.py +0 -0
  144. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/planningagent.py +0 -0
  145. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_dump.py +0 -0
  146. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_overrides.py +0 -0
  147. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_provider.py +0 -0
  148. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  149. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  150. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  151. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  152. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  153. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +0 -0
  154. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +0 -0
  155. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  156. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  157. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  158. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  159. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  160. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  161. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  162. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  163. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  164. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  165. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  166. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  167. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  168. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  169. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  170. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  171. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  172. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  173. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  174. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  175. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  176. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  177. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  178. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  179. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  180. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  181. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  182. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  183. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  184. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  185. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  186. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  187. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  188. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  189. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  190. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  191. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  192. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  193. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  194. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  195. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  196. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  197. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  198. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  199. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  200. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  201. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  202. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  203. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  204. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  205. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  206. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  207. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  208. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  209. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  210. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  211. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  212. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  213. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  214. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  215. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  216. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  217. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  218. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  219. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  220. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
  221. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  222. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  223. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  224. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  225. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  226. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  227. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  228. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  229. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  230. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  231. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
  232. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  233. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  234. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  235. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  236. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  237. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  238. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  239. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  240. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  241. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  242. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  243. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  244. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/prompts.py +0 -0
  245. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/session_metadata.py +0 -0
  246. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  247. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  248. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  249. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  250. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  251. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  252. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  253. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  254. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  255. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  256. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  257. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  258. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  259. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  260. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  261. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  262. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  263. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  264. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  265. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  266. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  267. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  268. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  269. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  270. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  271. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  272. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  273. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  274. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  275. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  276. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  277. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  278. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  279. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/utils/commands.py +0 -0
  280. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/agent/volatile_context.py +0 -0
  281. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/auth/__init__.py +0 -0
  282. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/auth/_jwt.py +0 -0
  283. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  284. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/auth/constants.py +0 -0
  285. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/auth/tokens.py +0 -0
  286. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/__init__.py +0 -0
  287. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/framing.py +0 -0
  288. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/installer.py +0 -0
  289. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/manager.py +0 -0
  290. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/multiplex.py +0 -0
  291. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/native_host.py +0 -0
  292. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/protocol.py +0 -0
  293. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/registry.py +0 -0
  294. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/browser_extension/runtime.py +0 -0
  295. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/__init__.py +0 -0
  296. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/ask_output.py +0 -0
  297. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/atif_export.py +0 -0
  298. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/browser_backend.py +0 -0
  299. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/clipboard_image.py +0 -0
  300. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/config.py +0 -0
  301. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/connection.py +0 -0
  302. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/cron.py +0 -0
  303. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/diagnostics.py +0 -0
  304. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/file_index.py +0 -0
  305. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/gateway.py +0 -0
  306. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/goal.py +0 -0
  307. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/loop.py +0 -0
  308. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/mentions.py +0 -0
  309. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/messages.py +0 -0
  310. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/model_catalog.py +0 -0
  311. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/model_connection.py +0 -0
  312. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/peer_messaging.py +0 -0
  313. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/plan_artifacts.py +0 -0
  314. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/prompt_history.py +0 -0
  315. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/session_event_protocol.py +0 -0
  316. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/session_event_store.py +0 -0
  317. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/settings.py +0 -0
  318. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/skills.py +0 -0
  319. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/slash_commands.py +0 -0
  320. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/theme.py +0 -0
  321. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/__init__.py +0 -0
  322. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/boot_splash.py +0 -0
  323. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  324. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  325. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/constants.py +0 -0
  326. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/custom_model.py +0 -0
  327. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/discovery.py +0 -0
  328. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  329. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  330. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/metadata.py +0 -0
  331. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  332. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/pacing.py +0 -0
  333. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  334. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/session_diff.py +0 -0
  335. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/settings_panel.py +0 -0
  336. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/settings_screen.py +0 -0
  337. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/settings_widgets.py +0 -0
  338. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/styles.tcss +0 -0
  339. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/task_list.py +0 -0
  340. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  341. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/tui/tool_presentation.py +0 -0
  342. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/cli/updater.py +0 -0
  343. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/config.py +0 -0
  344. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/events.py +0 -0
  345. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/extensions.py +0 -0
  346. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/__init__.py +0 -0
  347. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/access.py +0 -0
  348. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/access_settings.py +0 -0
  349. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/adapters/__init__.py +0 -0
  350. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/adapters/base.py +0 -0
  351. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/adapters/echo.py +0 -0
  352. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/adapters/telegram/__init__.py +0 -0
  353. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/adapters/telegram/adapter.py +0 -0
  354. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/adapters/telegram/formatting.py +0 -0
  355. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/bridge.py +0 -0
  356. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/commands.py +0 -0
  357. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/config.py +0 -0
  358. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/control_relay.py +0 -0
  359. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/daemon.py +0 -0
  360. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/event_router.py +0 -0
  361. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/questions.py +0 -0
  362. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/redaction.py +0 -0
  363. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/service.py +0 -0
  364. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/gateway/stt.py +0 -0
  365. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/git_env.py +0 -0
  366. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/__init__.py +0 -0
  367. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/backends.py +0 -0
  368. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/config.py +0 -0
  369. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/dispatcher.py +0 -0
  370. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/events.py +0 -0
  371. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/matcher.py +0 -0
  372. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/hooks/outcome.py +0 -0
  373. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/client.py +0 -0
  374. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/exceptions.py +0 -0
  375. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/instrumented_client.py +0 -0
  376. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/ledger.py +0 -0
  377. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/__init__.py +0 -0
  378. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  379. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/anthropic.py +0 -0
  380. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/base.py +0 -0
  381. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  382. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/google.py +0 -0
  383. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/mistral.py +0 -0
  384. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/models.py +0 -0
  385. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/openai.py +0 -0
  386. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  387. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
  388. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/tinker.py +0 -0
  389. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  390. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/ratelimit.py +0 -0
  391. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/__init__.py +0 -0
  392. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/accessors.py +0 -0
  393. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  394. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  395. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  396. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  397. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  398. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/groq.py +0 -0
  399. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  400. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/mistral.py +0 -0
  401. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  402. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  403. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  404. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  405. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  406. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
  407. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  408. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  409. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  410. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  411. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  412. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  413. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  414. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
  415. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/thinking.py +0 -0
  416. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  417. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/types.py +0 -0
  418. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/specs/validation.py +0 -0
  419. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/timeouts.py +0 -0
  420. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  421. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/llm/usage.py +0 -0
  422. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/local_state.py +0 -0
  423. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/__init__.py +0 -0
  424. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/config.py +0 -0
  425. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/oauth.py +0 -0
  426. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/service.py +0 -0
  427. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/state.py +0 -0
  428. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/tools.py +0 -0
  429. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/mcp/transport.py +0 -0
  430. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/__init__.py +0 -0
  431. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/identity.py +0 -0
  432. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/manager.py +0 -0
  433. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/manifest.py +0 -0
  434. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/markdown.py +0 -0
  435. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/models.py +0 -0
  436. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/protocol.py +0 -0
  437. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/memory/registry.py +0 -0
  438. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/models/__init__.py +0 -0
  439. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  440. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/permissions.py +0 -0
  441. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/runtime.py +0 -0
  442. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/README.md +0 -0
  443. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/__init__.py +0 -0
  444. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  445. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/base.py +0 -0
  446. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/browser.py +0 -0
  447. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/event_loop.py +0 -0
  448. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/filesystem.py +0 -0
  449. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/local.py +0 -0
  450. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/serializer.py +0 -0
  451. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/terminal.py +0 -0
  452. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/sandbox/utils.py +0 -0
  453. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/scratchpad.py +0 -0
  454. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/security/__init__.py +0 -0
  455. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/security/secrets.py +0 -0
  456. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/base.py +0 -0
  457. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/browser.py +0 -0
  458. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/file_system.py +0 -0
  459. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/html.py +0 -0
  460. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/__init__.py +0 -0
  461. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/client.py +0 -0
  462. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/config.py +0 -0
  463. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/detector.py +0 -0
  464. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  465. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/edits.py +0 -0
  466. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/manager.py +0 -0
  467. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/registry.py +0 -0
  468. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/lsp/registry.yaml +0 -0
  469. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/snapshots.py +0 -0
  470. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/terminal.py +0 -0
  471. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/terminal_buffer.py +0 -0
  472. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/services/workspace_scan.py +0 -0
  473. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/__init__.py +0 -0
  474. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/control.py +0 -0
  475. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/inbox.py +0 -0
  476. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/inmemory.py +0 -0
  477. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/projection.py +0 -0
  478. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/recording.py +0 -0
  479. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/runtime.py +0 -0
  480. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/session/store.py +0 -0
  481. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/testing/__init__.py +0 -0
  482. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/testing/store_conformance.py +0 -0
  483. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tool_subjects.py +0 -0
  484. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tools/__init__.py +0 -0
  485. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tools/ask_user.py +0 -0
  486. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tools/core.py +0 -0
  487. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tools/definitions.py +0 -0
  488. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tools/param_aliases.py +0 -0
  489. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/tools/registry.py +0 -0
  490. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/utils/__init__.py +0 -0
  491. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/utils/images.py +0 -0
  492. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/__init__.py +0 -0
  493. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/assets/fold.js +0 -0
  494. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/assets/player.css +0 -0
  495. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/assets/player.html +0 -0
  496. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/assets/player.js +0 -0
  497. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/bundle.py +0 -0
  498. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/hosting.py +0 -0
  499. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/redaction.py +0 -0
  500. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/server.py +0 -0
  501. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/singlefile.py +0 -0
  502. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/web/theme_css.py +0 -0
  503. {kolega_code-0.42.0 → kolega_code-0.44.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,64 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.44.0 - 2026-10-19
10
+
11
+ ### Added
12
+
13
+ - **Background sub-agents.** The agent can delegate with
14
+ `dispatch_agent(..., background=True)` and keep working while the child runs;
15
+ foreground dispatch remains the default. Jobs belong to the session in the
16
+ TUI, `ask`, `--loop`, goal runs, editor (ACP) sessions, and gateway chats.
17
+ Completion reports arrive automatically and normally start a continuation
18
+ instead of becoming extra prompts. The new `agent_job` tool lists, inspects,
19
+ or cancels jobs, with reports retained after completion, failure, or
20
+ cancellation. Persisted outcomes can be recovered when a session resumes, and
21
+ reported background usage is attributed to the session. Jobs survive turns,
22
+ not process exit; cancelling a main turn does not discard child results.
23
+ - The TUI shows a persistent background-agent indicator above the composer,
24
+ distinguishing running, queued, undelivered, and failed work, and lists
25
+ retained jobs in the `Ctrl+G` sub-agent inspector. Delivered reports appear as
26
+ collapsed rows that expand on click or `Enter`, including after a session is
27
+ restored.
28
+ - Added native Google Gemini 4 Argon (`gemini-4-argon`) and xAI Grok 4.7
29
+ (`grok-4.7`) support, including model selectors, image input, streaming, tool
30
+ calling, and named reasoning efforts. Argon uses a shared 1,048,576-token
31
+ input/thinking/output window; Grok 4.7 uses 500,000 tokens and supports `xhigh`
32
+ effort. Existing provider defaults remain unchanged.
33
+
34
+ ### Fixed
35
+
36
+ - Late transcript updates during screen teardown no longer raise while the
37
+ conversation is being pruned, so exiting or switching sessions can no longer
38
+ fail on a stale render.
39
+
40
+ ### Security
41
+
42
+ - Updated mcp to 1.30.0, closing CVE-2026-59951 (GHSA-84m7-p3x7-pcfv), a
43
+ streamable-HTTP session exhaustion issue in the MCP client.
44
+
45
+ ## 0.43.0 - 2026-10-13
46
+
47
+ ### Added
48
+
49
+ - **Strict tool schemas.** Code that drives Kolega's LLM client directly can
50
+ mark a tool definition `strict=True`. The Responses providers then ask the
51
+ provider to hold the tool call to the schema exactly — every required field
52
+ present and nothing extra. Tools that are not marked strict behave as before.
53
+
54
+ ### Changed
55
+
56
+ - DeepSeek requests now use `https://api.deepseek.com/beta`. DeepSeek enforces
57
+ strict tool schemas only on that endpoint and silently ignores the flag on the
58
+ bare host, so models that required a field could previously return a tool call
59
+ without it.
60
+
61
+ ### Fixed
62
+
63
+ - A tool call whose arguments contain a raw control character — an unescaped tab
64
+ or newline copied into a JSON string — is now kept instead of degrading to an
65
+ empty call. Observed live with `deepseek-flash`.
66
+
9
67
  ## 0.42.0 - 2026-10-07
10
68
 
11
69
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.42.0
3
+ Version: 0.44.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,7 +45,7 @@ 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'
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.42.0"
177
+ __version__ = "0.44.0"
@@ -139,6 +139,15 @@ class AgentFactory:
139
139
  return
140
140
  self.persist(session)
141
141
  try:
142
+ jobs = getattr(session.agent, "background_jobs", None)
143
+ if jobs is not None:
144
+ jobs.set_callbacks(on_ready=None, on_delivered=None)
145
+ await jobs.close()
146
+ await jobs.deliver(session.agent)
147
+ self.persist(session)
148
+ for old in session.retired_agents:
149
+ await old.cleanup()
150
+ session.retired_agents.clear()
142
151
  await session.agent.cleanup()
143
152
  except Exception: # noqa: BLE001 — closing must not mask the primary outcome
144
153
  logger.exception("acp session close: agent cleanup failed (session=%s)", session_id)
@@ -315,10 +324,24 @@ class AgentFactory:
315
324
  permission_mode=old.permission_mode,
316
325
  question_state=session.question_state,
317
326
  )
327
+ # New generations must keep publishing into the session-lifetime event
328
+ # consumer, including children still using the previous generation.
329
+ if manager is not session.manager:
330
+ raise RuntimeError("ACP rebuild must preserve the session connection manager")
318
331
  session.agent = agent
319
- session.manager = manager
332
+ jobs = getattr(old, "background_jobs", None)
333
+ if jobs is not None and agent is not old:
334
+ agent.background_jobs = jobs
335
+ agent.background_needs_turn = getattr(old, "background_needs_turn", False)
336
+ old.background_jobs = None
337
+ if jobs is not None and jobs.active_count and agent is not old:
338
+ # Children borrow this generation's terminal/browser/extensions.
339
+ # Keep it alive until the supervisor has joined them.
340
+ session.retired_agents.append(old)
341
+ return
320
342
  try:
321
- await old.cleanup()
343
+ if agent is not old:
344
+ await old.cleanup()
322
345
  except Exception: # noqa: BLE001
323
346
  logger.exception("acp model switch: old agent cleanup failed (session=%s)", session.session_id)
324
347
 
@@ -369,7 +392,8 @@ class AgentFactory:
369
392
  ) -> tuple[CoderAgent, CliConnectionManager]:
370
393
  journal = self._store.journal(record.session_id)
371
394
  recorder = self._store.recorder(record.session_id)
372
- manager = CliConnectionManager()
395
+ existing = self._acp_sessions.get(record.session_id)
396
+ manager = existing.manager if existing is not None else CliConnectionManager()
373
397
  recording = RecordingConnectionManager(
374
398
  manager,
375
399
  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.42.0"
54
+ __version__ = "0.44.0"