kolega-code 0.31.0__tar.gz → 0.32.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 (457) hide show
  1. {kolega_code-0.31.0 → kolega_code-0.32.0}/CHANGELOG.md +42 -0
  2. {kolega_code-0.31.0 → kolega_code-0.32.0}/PKG-INFO +28 -1
  3. {kolega_code-0.31.0 → kolega_code-0.32.0}/README.md +26 -0
  4. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/__init__.py +1 -1
  5. kolega_code-0.32.0/kolega_code/acp/__init__.py +38 -0
  6. kolega_code-0.32.0/kolega_code/acp/agent_factory.py +425 -0
  7. kolega_code-0.32.0/kolega_code/acp/bridge.py +381 -0
  8. kolega_code-0.32.0/kolega_code/acp/diffs.py +93 -0
  9. kolega_code-0.32.0/kolega_code/acp/permissions.py +116 -0
  10. kolega_code-0.32.0/kolega_code/acp/plans.py +40 -0
  11. kolega_code-0.32.0/kolega_code/acp/questions.py +67 -0
  12. kolega_code-0.32.0/kolega_code/acp/server.py +668 -0
  13. kolega_code-0.32.0/kolega_code/acp/session.py +46 -0
  14. kolega_code-0.32.0/kolega_code/acp/usage.py +30 -0
  15. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/__init__.py +1 -1
  16. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/baseagent.py +29 -2
  17. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/agent_tool.py +6 -2
  18. kolega_code-0.32.0/kolega_code/cli/acp.py +77 -0
  19. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/app.py +5 -1
  20. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/main.py +19 -0
  21. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/provider_registry.py +1 -0
  22. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/prompt_flows.py +3 -45
  23. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/accessors.py +1 -1
  24. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/deepseek.py +14 -0
  25. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/openrouter.py +948 -925
  26. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/projection.py +13 -4
  27. kolega_code-0.32.0/kolega_code/tools/ask_user.py +63 -0
  28. {kolega_code-0.31.0 → kolega_code-0.32.0}/pyproject.toml +2 -1
  29. {kolega_code-0.31.0 → kolega_code-0.32.0}/.gitignore +0 -0
  30. {kolega_code-0.31.0 → kolega_code-0.32.0}/CONTRIBUTING.md +0 -0
  31. {kolega_code-0.31.0 → kolega_code-0.32.0}/LICENSE +0 -0
  32. {kolega_code-0.31.0 → kolega_code-0.32.0}/MIGRATION.md +0 -0
  33. {kolega_code-0.31.0 → kolega_code-0.32.0}/RELEASING.md +0 -0
  34. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  35. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  36. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  37. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  38. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  39. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  40. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  41. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  42. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  43. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  44. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  45. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  46. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  47. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  48. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  49. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  50. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  51. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  52. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  53. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  54. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  55. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  56. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  57. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  58. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  59. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  60. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  61. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  62. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  63. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  64. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  65. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  66. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  67. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  68. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  69. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  70. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  71. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  72. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  73. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  74. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  75. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  76. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  77. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  78. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  79. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  80. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  81. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  82. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  83. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  84. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  85. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  86. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/browseragent.py +0 -0
  87. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/coder.py +0 -0
  88. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/common.py +0 -0
  89. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/compression.py +0 -0
  90. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/context.py +0 -0
  91. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/conversation.py +0 -0
  92. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/custom_agents.py +0 -0
  93. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/edit_protocols.py +0 -0
  94. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/errors.py +0 -0
  95. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/__init__.py +0 -0
  96. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/bridge.py +0 -0
  97. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  98. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  99. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/env.py +0 -0
  100. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  101. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/kernel.py +0 -0
  102. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/prelude.js +0 -0
  103. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/prelude.py +0 -0
  104. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/protocol.py +0 -0
  105. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  106. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/runner.js +0 -0
  107. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/runner.py +0 -0
  108. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/generalagent.py +0 -0
  109. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/goal.py +0 -0
  110. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/investigationagent.py +0 -0
  111. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/model_routing.py +0 -0
  112. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  113. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  114. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/budget.py +0 -0
  115. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/context.py +0 -0
  116. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/errors.py +0 -0
  117. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/executor.py +0 -0
  118. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/guide.py +0 -0
  119. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/journal.py +0 -0
  120. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  121. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/types.py +0 -0
  122. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/planningagent.py +0 -0
  123. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_dump.py +0 -0
  124. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_overrides.py +0 -0
  125. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_provider.py +0 -0
  126. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  127. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  128. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  129. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  130. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  131. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  132. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  133. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  134. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  135. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  136. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  137. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  138. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  139. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  140. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  141. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  142. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  143. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  144. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  145. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  146. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  147. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  148. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  149. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  150. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  151. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  152. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  153. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  154. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  155. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  156. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  157. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  158. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  159. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  160. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  161. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  162. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  163. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  164. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  165. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  166. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  167. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  168. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  169. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  170. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  171. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  172. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  173. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  174. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  175. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  176. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  177. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  178. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  179. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  180. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  181. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  182. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  183. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  184. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  185. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  186. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  187. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  188. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  189. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  190. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  191. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  192. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  193. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  194. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  195. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  196. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  197. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  198. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  199. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  200. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  201. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  202. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  203. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  204. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  205. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  206. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  207. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  208. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  209. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  210. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  211. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  212. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  213. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  214. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  215. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  216. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  217. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  218. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  219. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  220. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompts.py +0 -0
  221. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  222. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  223. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  224. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  225. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  226. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  227. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  228. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  229. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  230. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  231. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  232. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  233. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  234. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  235. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  236. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  237. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  238. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  239. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  240. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  241. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  242. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  243. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  244. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  245. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  246. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  247. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  248. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  249. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  250. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  251. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  252. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  253. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  254. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_definitions.py +0 -0
  255. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tools.py +0 -0
  256. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/utils/commands.py +0 -0
  257. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/volatile_context.py +0 -0
  258. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/__init__.py +0 -0
  259. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/_jwt.py +0 -0
  260. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  261. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/constants.py +0 -0
  262. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/tokens.py +0 -0
  263. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/__init__.py +0 -0
  264. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/framing.py +0 -0
  265. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/installer.py +0 -0
  266. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/manager.py +0 -0
  267. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/multiplex.py +0 -0
  268. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/native_host.py +0 -0
  269. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/protocol.py +0 -0
  270. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/registry.py +0 -0
  271. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/runtime.py +0 -0
  272. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/__init__.py +0 -0
  273. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/ask_output.py +0 -0
  274. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/atif_export.py +0 -0
  275. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/browser_backend.py +0 -0
  276. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/clipboard_image.py +0 -0
  277. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/config.py +0 -0
  278. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/connection.py +0 -0
  279. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/cron.py +0 -0
  280. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/diagnostics.py +0 -0
  281. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/file_index.py +0 -0
  282. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/goal.py +0 -0
  283. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/loop.py +0 -0
  284. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/mentions.py +0 -0
  285. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/messages.py +0 -0
  286. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/model_catalog.py +0 -0
  287. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/model_connection.py +0 -0
  288. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/plan_artifacts.py +0 -0
  289. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/prompt_history.py +0 -0
  290. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_event_protocol.py +0 -0
  291. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_event_store.py +0 -0
  292. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_journal.py +0 -0
  293. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_store.py +0 -0
  294. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_usage.py +0 -0
  295. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/settings.py +0 -0
  296. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/skills.py +0 -0
  297. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/slash_commands.py +0 -0
  298. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/theme.py +0 -0
  299. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/__init__.py +0 -0
  300. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
  301. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/app_base.py +0 -0
  302. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  303. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  304. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/constants.py +0 -0
  305. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/custom_model.py +0 -0
  306. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  307. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  308. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  309. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/pacing.py +0 -0
  310. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/session_diff.py +0 -0
  311. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/settings_panel.py +0 -0
  312. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/settings_screen.py +0 -0
  313. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/state.py +0 -0
  314. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  315. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/styles.tcss +0 -0
  316. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  317. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  318. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/transcript.py +0 -0
  319. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/widgets.py +0 -0
  320. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/updater.py +0 -0
  321. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/config.py +0 -0
  322. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/events.py +0 -0
  323. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/extensions.py +0 -0
  324. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/git_env.py +0 -0
  325. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/__init__.py +0 -0
  326. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/backends.py +0 -0
  327. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/config.py +0 -0
  328. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/dispatcher.py +0 -0
  329. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/events.py +0 -0
  330. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/matcher.py +0 -0
  331. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/outcome.py +0 -0
  332. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/client.py +0 -0
  333. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/exceptions.py +0 -0
  334. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/instrumented_client.py +0 -0
  335. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/ledger.py +0 -0
  336. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/models.py +0 -0
  337. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/__init__.py +0 -0
  338. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  339. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/anthropic.py +0 -0
  340. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/base.py +0 -0
  341. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  342. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  343. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/google.py +0 -0
  344. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/models.py +0 -0
  345. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/openai.py +0 -0
  346. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  347. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
  348. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/responses_common.py +0 -0
  349. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/tinker.py +0 -0
  350. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  351. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/ratelimit.py +0 -0
  352. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/__init__.py +0 -0
  353. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  354. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  355. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  356. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  357. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  358. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  359. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  360. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  361. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  362. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  363. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
  364. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  365. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  366. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  367. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  368. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  369. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  370. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  371. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  372. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
  373. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/thinking.py +0 -0
  374. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  375. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/types.py +0 -0
  376. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/validation.py +0 -0
  377. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/timeouts.py +0 -0
  378. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  379. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/usage.py +0 -0
  380. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/local_state.py +0 -0
  381. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/__init__.py +0 -0
  382. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/config.py +0 -0
  383. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/oauth.py +0 -0
  384. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/service.py +0 -0
  385. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/state.py +0 -0
  386. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/tools.py +0 -0
  387. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/transport.py +0 -0
  388. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/__init__.py +0 -0
  389. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/identity.py +0 -0
  390. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/manager.py +0 -0
  391. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/manifest.py +0 -0
  392. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/markdown.py +0 -0
  393. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/models.py +0 -0
  394. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/protocol.py +0 -0
  395. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/registry.py +0 -0
  396. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/models/__init__.py +0 -0
  397. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  398. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/permissions.py +0 -0
  399. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/runtime.py +0 -0
  400. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/README.md +0 -0
  401. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/__init__.py +0 -0
  402. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  403. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/base.py +0 -0
  404. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/browser.py +0 -0
  405. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/event_loop.py +0 -0
  406. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/filesystem.py +0 -0
  407. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/local.py +0 -0
  408. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/serializer.py +0 -0
  409. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/terminal.py +0 -0
  410. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/utils.py +0 -0
  411. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/scratchpad.py +0 -0
  412. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/security/__init__.py +0 -0
  413. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/security/secrets.py +0 -0
  414. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/base.py +0 -0
  415. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/browser.py +0 -0
  416. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/file_system.py +0 -0
  417. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/html.py +0 -0
  418. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/__init__.py +0 -0
  419. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/client.py +0 -0
  420. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/config.py +0 -0
  421. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/detector.py +0 -0
  422. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  423. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/edits.py +0 -0
  424. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/manager.py +0 -0
  425. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/registry.py +0 -0
  426. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/registry.yaml +0 -0
  427. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/snapshots.py +0 -0
  428. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/terminal.py +0 -0
  429. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/terminal_buffer.py +0 -0
  430. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/workspace_scan.py +0 -0
  431. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/__init__.py +0 -0
  432. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/control.py +0 -0
  433. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/inmemory.py +0 -0
  434. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/recording.py +0 -0
  435. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/runtime.py +0 -0
  436. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/store.py +0 -0
  437. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/testing/__init__.py +0 -0
  438. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/testing/store_conformance.py +0 -0
  439. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/__init__.py +0 -0
  440. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/core.py +0 -0
  441. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/definitions.py +0 -0
  442. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/param_aliases.py +0 -0
  443. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/registry.py +0 -0
  444. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/utils/__init__.py +0 -0
  445. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/utils/images.py +0 -0
  446. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/__init__.py +0 -0
  447. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/fold.js +0 -0
  448. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/player.css +0 -0
  449. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/player.html +0 -0
  450. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/player.js +0 -0
  451. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/bundle.py +0 -0
  452. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/hosting.py +0 -0
  453. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/redaction.py +0 -0
  454. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/server.py +0 -0
  455. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/singlefile.py +0 -0
  456. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/theme_css.py +0 -0
  457. {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,48 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.32.0 - 2026-08-24
10
+
11
+ ### Added
12
+
13
+ - **Editor integration over the Agent Client Protocol (ACP).** `kolega-code acp`
14
+ serves the full Kolega Code agent — models, tools, permissions, skills,
15
+ plan/build modes, sub-agent fan-out — to editors over stdio; Zed hosts it
16
+ natively through an `agent_servers` entry, and the new Editor Integration
17
+ docs page covers setup and flags (`--permission-mode`, `--acp-log`,
18
+ `--debug`). Each editor thread is an ordinary persisted Kolega Code session
19
+ that replays in the TUI, `kolega-code sessions`, exports, and `/share`.
20
+ Over the wire the agent server provides: TUI-faithful plan/build session
21
+ modes with task-list checklist rendering in the plan view and mid-turn mode
22
+ switching; tool approvals prompted through the editor
23
+ (`session/request_permission`) plus a model select and auto-approve toggle
24
+ as session config options; sub-agent dispatch cards with live progress and
25
+ per-subagent transcripts (Zed's `subagent_session_info` convention);
26
+ compaction shown as a collapsible thought view; advertised slash commands;
27
+ user questions via client elicitation; file edits rendered as diffs;
28
+ streamed terminal output; context-usage updates; and session load/restore so
29
+ clients can reopen previous threads.
30
+ - Added DeepSeek V4 Flash Vision (`deepseek-v4-flash-vision-exp`),
31
+ DeepSeek's first multimodal model (experimental): 1M-token context, image
32
+ input, hosted web search, and `none`/`low`/`high`/`max` reasoning effort on
33
+ the Responses API.
34
+
35
+ ### Changed
36
+
37
+ - OpenRouter catalog refreshed from the 2026-08-24 snapshots: 274 tool-capable
38
+ models, 20 featured.
39
+
40
+ ### Fixed
41
+
42
+ - Sub-agents launched by `dispatch_agent` now run in auto permission mode.
43
+ An ask-mode parent previously passed its approval callback down to the
44
+ sub-agent, which could hang a turn waiting for a prompt that ACP clients
45
+ cannot render for delegated work.
46
+ - Streaming consumers now receive reasoning and response text as clean,
47
+ ordered segments: thinking is flushed the moment prose starts (and vice
48
+ versa) instead of interleaving at buffer boundaries, and a lower flush
49
+ threshold makes streaming feel more responsive in every frontend.
50
+
9
51
  ## 0.31.0 - 2026-08-20
10
52
 
11
53
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.31.0
3
+ Version: 0.32.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/
@@ -26,6 +26,7 @@ Classifier: Programming Language :: Python :: 3.14
26
26
  Classifier: Topic :: Software Development
27
27
  Classifier: Topic :: Utilities
28
28
  Requires-Python: >=3.11
29
+ Requires-Dist: agent-client-protocol==0.12.0
29
30
  Requires-Dist: anthropic==0.101.0
30
31
  Requires-Dist: atif==1.7.0
31
32
  Requires-Dist: beautifulsoup4==4.14.3
@@ -153,6 +154,10 @@ use Kolega Code as an ordinary terminal coding agent:
153
154
  (including OAuth-enabled HTTP servers) as permission-gated tools.
154
155
  - **Interactive or scriptable:** Textual TUI with queued follow-ups, one-shot
155
156
  `kolega-code ask` with JSON output, session list/export/resume, `doctor`.
157
+ - **Editor integration:** drive the full agent from Zed or VS Code over the
158
+ Agent Client Protocol — streamed responses, tool cards, diffs, permission
159
+ prompts, plan/build approval, session restore, slash commands, and sub-agent
160
+ transcripts ([docs](https://kolega-ai.github.io/kolega-code/editor-integration/)).
156
161
  - **Extensibility:** agent skills, project prompt-template overrides
157
162
  ([docs](https://kolega-ai.github.io/kolega-code/configuration/prompt-overrides/)),
158
163
  lifecycle hooks, persistent project permission rules.
@@ -160,6 +165,28 @@ use Kolega Code as an ordinary terminal coding agent:
160
165
  API-key settings stay on your machine with restrictive permissions where
161
166
  applicable.
162
167
 
168
+ ## Editor integration (ACP)
169
+
170
+ `kolega-code acp` serves the Agent Client Protocol, so Zed and VS Code can host
171
+ the full agent — including permissions, plan/build modes, and sub-agent
172
+ transcripts. Configure Zed with:
173
+
174
+ ```json
175
+ {
176
+ "agent_servers": {
177
+ "Kolega Code": {
178
+ "command": "/absolute/path/to/bin/kolega-code",
179
+ "args": ["acp", "--permission-mode", "ask"]
180
+ }
181
+ }
182
+ }
183
+ ```
184
+
185
+ Use an absolute binary path: a bare `kolega-code` resolves to whatever is on the
186
+ editor's `PATH`, so an installed release can shadow a dev checkout. Full setup
187
+ for Zed, VS Code, and other ACP clients is in the
188
+ [editor integration docs](https://kolega-ai.github.io/kolega-code/editor-integration/).
189
+
163
190
  ## Quick start
164
191
 
165
192
  **1. Install** with the script:
@@ -70,6 +70,10 @@ use Kolega Code as an ordinary terminal coding agent:
70
70
  (including OAuth-enabled HTTP servers) as permission-gated tools.
71
71
  - **Interactive or scriptable:** Textual TUI with queued follow-ups, one-shot
72
72
  `kolega-code ask` with JSON output, session list/export/resume, `doctor`.
73
+ - **Editor integration:** drive the full agent from Zed or VS Code over the
74
+ Agent Client Protocol — streamed responses, tool cards, diffs, permission
75
+ prompts, plan/build approval, session restore, slash commands, and sub-agent
76
+ transcripts ([docs](https://kolega-ai.github.io/kolega-code/editor-integration/)).
73
77
  - **Extensibility:** agent skills, project prompt-template overrides
74
78
  ([docs](https://kolega-ai.github.io/kolega-code/configuration/prompt-overrides/)),
75
79
  lifecycle hooks, persistent project permission rules.
@@ -77,6 +81,28 @@ use Kolega Code as an ordinary terminal coding agent:
77
81
  API-key settings stay on your machine with restrictive permissions where
78
82
  applicable.
79
83
 
84
+ ## Editor integration (ACP)
85
+
86
+ `kolega-code acp` serves the Agent Client Protocol, so Zed and VS Code can host
87
+ the full agent — including permissions, plan/build modes, and sub-agent
88
+ transcripts. Configure Zed with:
89
+
90
+ ```json
91
+ {
92
+ "agent_servers": {
93
+ "Kolega Code": {
94
+ "command": "/absolute/path/to/bin/kolega-code",
95
+ "args": ["acp", "--permission-mode", "ask"]
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ Use an absolute binary path: a bare `kolega-code` resolves to whatever is on the
102
+ editor's `PATH`, so an installed release can shadow a dev checkout. Full setup
103
+ for Zed, VS Code, and other ACP clients is in the
104
+ [editor integration docs](https://kolega-ai.github.io/kolega-code/editor-integration/).
105
+
80
106
  ## Quick start
81
107
 
82
108
  **1. Install** with the script:
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.31.0"
177
+ __version__ = "0.32.0"
@@ -0,0 +1,38 @@
1
+ """ACP agent side for kolega-code.
2
+
3
+ Makes kolega-code usable from ACP clients (Zed, JetBrains, VS Code via
4
+ extensions, Neovim, Emacs) by serving the Agent Client Protocol v1 over
5
+ stdio. The client spawns this process and owns its lifecycle.
6
+
7
+ stdout carries only ACP JSON-RPC frames (owned by the SDK transport); all
8
+ diagnostics go to stderr. See ``acp-implementation-plan.md`` (repo root) for
9
+ the full design and phases.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from kolega_code.acp.agent_factory import ACP_AGENT_MODE, ACP_PERMISSION_MODE, MODE_BUILD, MODE_PLAN, AgentFactory
15
+ from kolega_code.acp.bridge import TOOL_KINDS, AcpBridge
16
+ from kolega_code.acp.diffs import AcpDiffProvider
17
+ from kolega_code.acp.permissions import AcpPermissionBroker
18
+ from kolega_code.acp.plans import task_entries_from_markdown
19
+ from kolega_code.acp.server import AcpAgent
20
+ from kolega_code.acp.session import AcpSession
21
+ from kolega_code.acp.usage import build_usage_update, context_window_for
22
+
23
+ __all__ = [
24
+ "ACP_AGENT_MODE",
25
+ "ACP_PERMISSION_MODE",
26
+ "MODE_BUILD",
27
+ "MODE_PLAN",
28
+ "AcpAgent",
29
+ "AcpBridge",
30
+ "AcpDiffProvider",
31
+ "AcpPermissionBroker",
32
+ "AcpSession",
33
+ "AgentFactory",
34
+ "TOOL_KINDS",
35
+ "build_usage_update",
36
+ "context_window_for",
37
+ "task_entries_from_markdown",
38
+ ]
@@ -0,0 +1,425 @@
1
+ """Headless agent composition for ACP sessions.
2
+
3
+ Builds the same agent stack the CLI uses — settings, model config, durable
4
+ session recording — one ``CoderAgent`` per ACP session.
5
+
6
+ Sessions use ``AgentMode.CLI`` (the standard interactive coder template; the
7
+ editor thread has a human present) with an *explicit* permission mode:
8
+ ``PermissionMode.ASK`` with a client-bound ``permission_callback`` (the
9
+ ``session/request_permission`` bridge). The ``ASK`` agent mode is
10
+ deliberately not used: it is the autonomous ``ask``-CLI template whose
11
+ permission handling is hardcoded to auto-approve.
12
+
13
+ Expected failures (missing model config, corrupt settings, unknown session)
14
+ are converted to ACP JSON-RPC errors so the client gets a clean message and
15
+ the process keeps serving.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import logging
21
+ from pathlib import Path
22
+ from typing import Any, Awaitable, Callable, cast
23
+
24
+ from acp.exceptions import RequestError
25
+ from acp.schema import (
26
+ SessionConfigOptionBoolean,
27
+ SessionConfigOptionSelect,
28
+ SessionConfigSelectGroup,
29
+ SessionConfigSelectOption,
30
+ SessionInfo,
31
+ )
32
+
33
+ from kolega_code.acp.questions import build_question_extension
34
+ from kolega_code.acp.session import AcpSession
35
+ from kolega_code.agent import CoderAgent, PromptExtension, ToolExtension
36
+ from kolega_code.agent.planningagent import PlanningAgent
37
+ from kolega_code.agent.prompt_provider import AgentMode
38
+ from kolega_code.agent.prompts import BUILD_QUESTION_PROMPT, PLANNING_QUESTION_PROMPT
39
+ from kolega_code.agent.tool_definitions import tool_description_asset
40
+ 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.connection import CliConnectionManager
43
+ from kolega_code.cli.provider_registry import PROVIDER_LABELS, ui_model_options
44
+ from kolega_code.cli.session_event_store import FileArtifactStore, FileSessionEventStore
45
+ from kolega_code.cli.session_store import SessionRecord, SessionStore, SessionStoreError
46
+ from kolega_code.cli.settings import CliSettings, SettingsStore
47
+ from kolega_code.permissions import PermissionDecision, PermissionMode, PermissionRequest, normalize_permission_mode
48
+ from kolega_code.session.recording import RecordingConnectionManager
49
+
50
+ logger = logging.getLogger(__name__)
51
+
52
+ ACP_AGENT_MODE = AgentMode.CLI
53
+ ACP_PERMISSION_MODE = PermissionMode.ASK
54
+ CONFIG_MODEL = "model"
55
+ CONFIG_PERMISSION_AUTO = "permission-auto"
56
+ CONFIG_MODE = "mode"
57
+ MODE_BUILD = "build"
58
+ MODE_PLAN = "plan"
59
+ INTERACTION_MODES = {MODE_BUILD, MODE_PLAN}
60
+
61
+ PermissionCallback = Callable[[PermissionRequest], Awaitable[PermissionDecision]]
62
+ ConfigOption = SessionConfigOptionSelect | SessionConfigOptionBoolean
63
+
64
+
65
+ def agent_class_for(mode: str) -> type[CoderAgent]:
66
+ return PlanningAgent if mode == MODE_PLAN else CoderAgent
67
+
68
+
69
+ class AgentFactory:
70
+ """Opens, loads, and persists ACP sessions backed by the session store."""
71
+
72
+ def __init__(self, permission_mode: PermissionMode = ACP_PERMISSION_MODE) -> None:
73
+ self._permission_mode = permission_mode
74
+ self._store = SessionStore()
75
+ self._settings: CliSettings | None = None
76
+ self._settings_store: SettingsStore | None = None
77
+ self._acp_sessions: dict[str, AcpSession] = {}
78
+
79
+ async def open_session(
80
+ self,
81
+ cwd: str,
82
+ *,
83
+ session_id: str | None = None,
84
+ permission_callback: PermissionCallback | None = None,
85
+ ) -> AcpSession:
86
+ project_path = Path(cwd).resolve()
87
+ self._load_settings()
88
+ config = self._config_for(project_path)
89
+ record = self._store.create(project_path, ACP_AGENT_MODE.value, config_summary(config), session_id=session_id)
90
+ return await self._build_session(record, config, restore=False, permission_callback=permission_callback)
91
+
92
+ async def load_session(
93
+ self,
94
+ cwd: str,
95
+ session_id: str,
96
+ *,
97
+ permission_callback: PermissionCallback | None = None,
98
+ ) -> AcpSession | None:
99
+ try:
100
+ record = self._store.load(session_id)
101
+ except SessionStoreError as exc:
102
+ logger.info("acp session/load: unknown session %s (%s)", session_id, exc)
103
+ return None
104
+ self._load_settings()
105
+ config = self._config_for(Path(record.project_path))
106
+ return await self._build_session(record, config, restore=True, permission_callback=permission_callback)
107
+
108
+ # -- session config options -------------------------------------------
109
+
110
+ def config_options_for(self, session: AcpSession) -> list[ConfigOption]:
111
+ return [self._model_option(session), self._permission_option(session), self._mode_option(session)]
112
+
113
+ async def set_permission_mode(self, session: AcpSession, mode: PermissionMode) -> None:
114
+ session.agent.set_permission_mode(mode)
115
+ session.record.permission_mode = mode.value
116
+
117
+ async def set_interaction_mode(self, session: AcpSession, mode: str) -> None:
118
+ """Switch plan/build mode by rebuilding the session agent with the mode's class."""
119
+ session.record.interaction_mode = mode
120
+ await self._rebuild_agent(session, session.config)
121
+
122
+ async def apply_model(self, session: AcpSession, provider: str, model: str) -> None:
123
+ config = self._config_for(Path(session.record.project_path), provider=provider, model=model)
124
+ session.config = config
125
+ await self._rebuild_agent(session, config)
126
+
127
+ # -- persistence --------------------------------------------------------
128
+
129
+ def persist(self, session: AcpSession) -> None:
130
+ """Flush the agent's conversation state into the session record."""
131
+ session.record.history = session.agent.dump_message_history()
132
+ session.record.compaction = session.agent.dump_compaction_state()
133
+ session.record.permission_mode = session.agent.permission_mode.value
134
+ self._store.save(session.record)
135
+
136
+ async def close_session(self, session_id: str) -> None:
137
+ session = self._acp_sessions.pop(session_id, None)
138
+ if session is None:
139
+ return
140
+ self.persist(session)
141
+ try:
142
+ await session.agent.cleanup()
143
+ except Exception: # noqa: BLE001 — closing must not mask the primary outcome
144
+ logger.exception("acp session close: agent cleanup failed (session=%s)", session_id)
145
+
146
+ def list_sessions(self, cwd: str | None) -> list[SessionInfo]:
147
+ records = self._store.list(project_path=Path(cwd).resolve() if cwd else None)
148
+ return [
149
+ SessionInfo(
150
+ session_id=record.session_id, cwd=record.project_path, title=record.title, updated_at=record.updated_at
151
+ )
152
+ for record in records
153
+ ]
154
+
155
+ def event_store(self, session_id: str) -> FileSessionEventStore:
156
+ """The session's durable event journal as a readable event store."""
157
+ return FileSessionEventStore(self._store.journal(session_id))
158
+
159
+ # -- internal -----------------------------------------------------------
160
+
161
+ @staticmethod
162
+ def _task_list_extension(record: SessionRecord, agent_holder: dict[str, Any], mode: str) -> ToolExtension:
163
+ """Shared task-list tools backed by the session record — the same list
164
+ the TUI's ``update_task_list`` writes, so a session moves between the
165
+ TUI and the editor with one task list.
166
+
167
+ Build mode can read and update the list; plan mode gets a read-only
168
+ view (same split as the TUI). Updates broadcast a ``task_list_update``
169
+ chat event so the bridge can refresh the editor's plan view live.
170
+ """
171
+
172
+ async def get_task_list() -> str:
173
+ return record.task_list_markdown or "No task list has been set."
174
+
175
+ async def update_task_list(task_list_markdown: str) -> str:
176
+ record.task_list_markdown = task_list_markdown.strip()
177
+ agent = agent_holder.get("agent")
178
+ if agent is not None:
179
+ await agent.send_chat_message(
180
+ message_type="task_list_update",
181
+ content=task_list_markdown.strip(),
182
+ tool_call_id=str(getattr(agent, "current_tool_call_id", "") or ""),
183
+ )
184
+ return "Task list updated."
185
+
186
+ tools: dict[str, Any] = {"get_task_list": get_task_list}
187
+ if mode == MODE_BUILD:
188
+ tools["update_task_list"] = update_task_list
189
+ return ToolExtension(
190
+ name="acp-shared-task-list",
191
+ tools=tools,
192
+ tool_descriptions={
193
+ "get_task_list": tool_description_asset(
194
+ "get_task_list" if mode == MODE_BUILD else "get_task_list_readonly"
195
+ ),
196
+ **({"update_task_list": tool_description_asset("update_task_list")} if mode == MODE_BUILD else {}),
197
+ },
198
+ tool_schemas={
199
+ "get_task_list": {"type": "object", "properties": {}, "required": []},
200
+ "update_task_list": {
201
+ "type": "object",
202
+ "properties": {
203
+ "task_list_markdown": {
204
+ "type": "string",
205
+ "description": "The full current shared task list as Markdown.",
206
+ }
207
+ },
208
+ "required": ["task_list_markdown"],
209
+ },
210
+ },
211
+ tool_groups={"planning_tools": list(tools)},
212
+ propagate_to_sub_agents=False,
213
+ )
214
+
215
+ @staticmethod
216
+ def _task_list_volatile_section(record: SessionRecord) -> Callable[[], VolatileSection]:
217
+ """The current shared task list as a volatile section (TUI parity: the
218
+ agent sees the latest list in context every turn without re-fetching).
219
+ An empty list is an absent section, exactly like the TUI."""
220
+
221
+ def provider() -> VolatileSection:
222
+ return VolatileSection("task_list", (record.task_list_markdown or "").strip())
223
+
224
+ return provider
225
+
226
+ def _load_settings(self) -> None:
227
+ settings_store = SettingsStore()
228
+ self._settings_store = settings_store
229
+ self._settings = settings_store.load()
230
+
231
+ def _config_for(self, project_path: Path, *, provider: str | None = None, model: str | None = None) -> Any:
232
+ assert self._settings is not None and self._settings_store is not None
233
+ overrides = CliConfigOverrides(provider=provider, model=model) if provider and model else None
234
+ return build_agent_config(
235
+ project_path,
236
+ overrides=overrides,
237
+ settings=self._settings,
238
+ settings_store=self._settings_store,
239
+ )
240
+
241
+ def _model_option(self, session: AcpSession) -> SessionConfigOptionSelect:
242
+ assert self._settings is not None
243
+ groups: list[SessionConfigSelectGroup] = []
244
+ for provider, key in sorted(self._settings.api_keys.items()):
245
+ if not key:
246
+ continue
247
+ options = [
248
+ SessionConfigSelectOption(value=f"{provider}/{model}", name=label)
249
+ for label, model in ui_model_options(provider)
250
+ ]
251
+ if options:
252
+ groups.append(
253
+ SessionConfigSelectGroup(
254
+ group=provider,
255
+ name=str(PROVIDER_LABELS.get(cast(Any, provider), provider)),
256
+ options=options,
257
+ ),
258
+ )
259
+ primary = session.agent.primary_model_config
260
+ current = f"{primary.provider.value}/{primary.model}"
261
+ return SessionConfigOptionSelect(
262
+ type="select",
263
+ id=CONFIG_MODEL,
264
+ name="Model",
265
+ current_value=current,
266
+ options=groups,
267
+ )
268
+
269
+ @staticmethod
270
+ def _permission_option(session: AcpSession) -> SessionConfigOptionSelect:
271
+ # A select rather than the ACP boolean: vscode-acp renders only
272
+ # select-type config options (its UI skips every other type), and Zed
273
+ # renders selects just as well.
274
+ return SessionConfigOptionSelect(
275
+ type="select",
276
+ id=CONFIG_PERMISSION_AUTO,
277
+ name="Permissions",
278
+ current_value="auto" if session.agent.permission_mode == PermissionMode.AUTO else "ask",
279
+ options=[
280
+ SessionConfigSelectOption(value="ask", name="Ask"),
281
+ SessionConfigSelectOption(value="auto", name="Auto-approve"),
282
+ ],
283
+ )
284
+
285
+ @staticmethod
286
+ def _mode_option(session: AcpSession) -> SessionConfigOptionSelect:
287
+ return SessionConfigOptionSelect(
288
+ type="select",
289
+ id=CONFIG_MODE,
290
+ name="Mode",
291
+ current_value=session.record.interaction_mode or MODE_BUILD,
292
+ options=[
293
+ SessionConfigSelectOption(value=MODE_BUILD, name="Build"),
294
+ SessionConfigSelectOption(value=MODE_PLAN, name="Plan"),
295
+ ],
296
+ )
297
+
298
+ async def _rebuild_agent(self, session: AcpSession, config: Any) -> None:
299
+ """Replace the session's agent with a rebuild carrying the same history.
300
+
301
+ Config options apply between turns, so the persisted record is the
302
+ freshest history state; ``restore=True`` loads it into the rebuild.
303
+ """
304
+ old = session.agent
305
+ # The approval flow rebuilds mid-turn, before prompt() persists the
306
+ # just-finished plan turn. Dump the live agent into the record first
307
+ # (as the TUI does before rebuilds) so the rebuild restores the full
308
+ # conversation, not the stale pre-turn snapshot.
309
+ self.persist(session)
310
+ agent, manager = await self._construct_agent(
311
+ session.record,
312
+ config,
313
+ restore=True,
314
+ permission_callback=session.permission_callback,
315
+ permission_mode=old.permission_mode,
316
+ question_state=session.question_state,
317
+ )
318
+ session.agent = agent
319
+ session.manager = manager
320
+ try:
321
+ await old.cleanup()
322
+ except Exception: # noqa: BLE001
323
+ logger.exception("acp model switch: old agent cleanup failed (session=%s)", session.session_id)
324
+
325
+ async def _build_session(
326
+ self,
327
+ record: SessionRecord,
328
+ config: Any,
329
+ *,
330
+ restore: bool,
331
+ permission_callback: PermissionCallback | None,
332
+ ) -> AcpSession:
333
+ """Compose the durable agent stack for one session (the ``ask`` recipe + recording)."""
334
+ permission_mode = (
335
+ normalize_permission_mode(record.permission_mode, default=self._permission_mode)
336
+ if restore
337
+ else self._permission_mode
338
+ )
339
+ question_state: dict[str, Any] = {}
340
+ agent, manager = await self._construct_agent(
341
+ record,
342
+ config,
343
+ restore=restore,
344
+ permission_callback=permission_callback,
345
+ permission_mode=permission_mode,
346
+ question_state=question_state,
347
+ )
348
+ session = AcpSession(
349
+ session_id=record.session_id,
350
+ record=record,
351
+ agent=agent,
352
+ manager=manager,
353
+ permission_callback=permission_callback,
354
+ config=config,
355
+ question_state=question_state,
356
+ )
357
+ self._acp_sessions[record.session_id] = session
358
+ return session
359
+
360
+ async def _construct_agent(
361
+ self,
362
+ record: SessionRecord,
363
+ config: Any,
364
+ *,
365
+ restore: bool,
366
+ permission_callback: PermissionCallback | None,
367
+ permission_mode: PermissionMode | None = None,
368
+ question_state: dict[str, Any] | None = None,
369
+ ) -> tuple[CoderAgent, CliConnectionManager]:
370
+ journal = self._store.journal(record.session_id)
371
+ recorder = self._store.recorder(record.session_id)
372
+ manager = CliConnectionManager()
373
+ recording = RecordingConnectionManager(
374
+ manager,
375
+ FileSessionEventStore(journal),
376
+ session_id=record.session_id,
377
+ artifact_store=FileArtifactStore(journal),
378
+ )
379
+ interaction_mode = record.interaction_mode or MODE_BUILD
380
+ agent_class = agent_class_for(interaction_mode)
381
+ agent_holder: dict[str, Any] = {}
382
+ question_markdown = PLANNING_QUESTION_PROMPT if interaction_mode == MODE_PLAN else BUILD_QUESTION_PROMPT
383
+ prompt_extensions = [
384
+ PromptExtension(
385
+ id="acp-questions",
386
+ title="Asking the User",
387
+ markdown=question_markdown,
388
+ modes=[ACP_AGENT_MODE],
389
+ propagate_to_sub_agents=False,
390
+ ),
391
+ ]
392
+ agent = agent_class(
393
+ project_path=Path(record.project_path),
394
+ workspace_id=record.workspace_id,
395
+ thread_id=record.thread_id,
396
+ connection_manager=recording,
397
+ config=config,
398
+ agent_mode=ACP_AGENT_MODE,
399
+ permission_mode=permission_mode or self._permission_mode,
400
+ permission_callback=permission_callback,
401
+ prompt_extensions=prompt_extensions,
402
+ tool_extensions=[
403
+ self._task_list_extension(record, agent_holder, interaction_mode),
404
+ build_question_extension(question_state or {}),
405
+ ],
406
+ # Mirror the ask path: a resumed session hands the recorder over after
407
+ # restoring history, so construction never double-records a resumed turn.
408
+ session_recorder=None if restore else recorder,
409
+ )
410
+ agent_holder["agent"] = agent
411
+ agent.add_volatile_section(self._task_list_volatile_section(record))
412
+ lsp_messages = await agent.tool_collection.initialize()
413
+ for message in lsp_messages:
414
+ logger.debug("acp lsp: %s", message)
415
+ if restore:
416
+ agent.restore_message_history(record.history)
417
+ agent.restore_compaction_state(record.compaction)
418
+ agent.session_recorder = recorder
419
+ return agent, manager
420
+
421
+ # -- error conversion -------------------------------------------------
422
+
423
+ @staticmethod
424
+ def protocol_error(exc: BaseException) -> RequestError:
425
+ return RequestError.internal_error({"message": str(exc) or exc.__class__.__name__})