kolega-code 0.3.1__tar.gz → 0.3.2__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 (235) hide show
  1. {kolega_code-0.3.1 → kolega_code-0.3.2}/.gitignore +1 -0
  2. {kolega_code-0.3.1 → kolega_code-0.3.2}/PKG-INFO +1 -1
  3. {kolega_code-0.3.1 → kolega_code-0.3.2}/RELEASING.md +28 -12
  4. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/cli/ask.md +8 -0
  5. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/cli/overview.md +1 -0
  6. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/concepts/tools.md +4 -0
  7. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/tui/interface.md +6 -3
  8. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/tui/modes.md +8 -0
  9. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/tui/slash-commands.md +11 -0
  10. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/__init__.py +1 -1
  11. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/__init__.py +1 -1
  12. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/baseagent.py +70 -0
  13. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/browseragent.py +5 -1
  14. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/coder.py +4 -0
  15. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/compression.py +2 -2
  16. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/context.py +3 -0
  17. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/generalagent.py +4 -0
  18. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/investigationagent.py +5 -1
  19. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/planningagent.py +6 -43
  20. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/prompt_provider.py +5 -5
  21. kolega_code-0.3.2/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +59 -0
  22. kolega_code-0.3.2/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +18 -0
  23. kolega_code-0.3.2/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +23 -0
  24. kolega_code-0.3.2/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +23 -0
  25. kolega_code-0.3.2/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +13 -0
  26. kolega_code-0.3.2/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +2 -0
  27. kolega_code-0.3.2/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +7 -0
  28. kolega_code-0.3.2/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +7 -0
  29. kolega_code-0.3.1/kolega_code/agent/prompt_templates/agents/coder_cli_mode.j2 → kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +5 -5
  30. kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +39 -0
  31. kolega_code-0.3.1/kolega_code/agent/prompt_templates/common/kolega_md_instructions.md → kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +3 -3
  32. kolega_code-0.3.2/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +3 -0
  33. kolega_code-0.3.2/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +144 -0
  34. kolega_code-0.3.2/kolega_code/agent/prompts.py +92 -0
  35. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_agent_tools_inventory.py +2 -2
  36. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_coder_prompt_extensions.py +2 -2
  37. kolega_code-0.3.2/kolega_code/agent/tests/test_permissions.py +138 -0
  38. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_prompt_provider.py +10 -10
  39. kolega_code-0.3.2/kolega_code/agent/tests/test_prompts.py +71 -0
  40. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/agent_tool.py +2 -0
  41. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/app.py +330 -23
  42. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/main.py +96 -0
  43. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/messages.py +12 -0
  44. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/session_store.py +3 -0
  45. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/skills.py +2 -9
  46. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/slash_commands.py +3 -0
  47. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_app.py +333 -10
  48. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_main.py +10 -0
  49. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_session_store.py +5 -0
  50. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_slash_commands.py +6 -2
  51. kolega_code-0.3.2/kolega_code/permissions.py +378 -0
  52. {kolega_code-0.3.1 → kolega_code-0.3.2}/pyproject.toml +1 -1
  53. {kolega_code-0.3.1 → kolega_code-0.3.2}/uv.lock +1 -1
  54. kolega_code-0.3.1/kolega_code/agent/prompts.py +0 -154
  55. {kolega_code-0.3.1 → kolega_code-0.3.2}/.env.example +0 -0
  56. {kolega_code-0.3.1 → kolega_code-0.3.2}/.github/workflows/ci.yml +0 -0
  57. {kolega_code-0.3.1 → kolega_code-0.3.2}/.github/workflows/docs.yml +0 -0
  58. {kolega_code-0.3.1 → kolega_code-0.3.2}/.github/workflows/release.yml +0 -0
  59. {kolega_code-0.3.1 → kolega_code-0.3.2}/CONTRIBUTING.md +0 -0
  60. {kolega_code-0.3.1 → kolega_code-0.3.2}/LICENSE +0 -0
  61. {kolega_code-0.3.1 → kolega_code-0.3.2}/README.md +0 -0
  62. {kolega_code-0.3.1 → kolega_code-0.3.2}/SECURITY.md +0 -0
  63. {kolega_code-0.3.1 → kolega_code-0.3.2}/conftest.py +0 -0
  64. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/.gitignore +0 -0
  65. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/README.md +0 -0
  66. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/astro.config.mjs +0 -0
  67. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/package-lock.json +0 -0
  68. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/package.json +0 -0
  69. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/public/favicon.svg +0 -0
  70. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/assets/kolega-dark.svg +0 -0
  71. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/assets/kolega-light.svg +0 -0
  72. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/cli/doctor.md +0 -0
  73. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/cli/sessions.md +0 -0
  74. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/concepts/agents.md +0 -0
  75. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/concepts/how-it-works.md +0 -0
  76. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/configuration/environment-variables.md +0 -0
  77. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/configuration/providers-and-models.mdx +0 -0
  78. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/configuration/settings-and-api-keys.mdx +0 -0
  79. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/getting-started/installation.mdx +0 -0
  80. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/getting-started/introduction.md +0 -0
  81. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/getting-started/quick-start.mdx +0 -0
  82. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/index.mdx +0 -0
  83. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/skills.mdx +0 -0
  84. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/tui/composer.md +0 -0
  85. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content/docs/tui/sessions-and-resume.md +0 -0
  86. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/content.config.ts +0 -0
  87. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/src/styles/brand.css +0 -0
  88. {kolega_code-0.3.1 → kolega_code-0.3.2}/docs/tsconfig.json +0 -0
  89. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/common.py +0 -0
  90. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/conversation.py +0 -0
  91. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/agents/browser.j2 → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  92. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/agents/general.j2 → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  93. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/agents/investigation.j2 → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  94. {kolega_code-0.3.1/kolega_code/agent/prompt_templates → kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes}/environment_variables/workspace_env_vars.md +0 -0
  95. {kolega_code-0.3.1/kolega_code/agent/prompt_templates/common → kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes}/frontend_guidance.md +0 -0
  96. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/template_guidance/expo-template.md → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  97. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/template_guidance/html-website-template.md → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  98. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/template_guidance/mern-stack-template.md → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  99. /kolega_code-0.3.1/kolega_code/agent/prompt_templates/template_guidance/react-vite-shadcdn-template.md → /kolega_code-0.3.2/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  100. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/__init__.py +0 -0
  101. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/__init__.py +0 -0
  102. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_anthropic_token_counting.py +0 -0
  103. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_billing_openai_cache.py +0 -0
  104. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_client.py +0 -0
  105. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_dashscope_mapping.py +0 -0
  106. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_error_boundary.py +0 -0
  107. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_exceptions.py +0 -0
  108. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_google_thought_signature.py +0 -0
  109. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_google_tool_signature_live.py +0 -0
  110. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_instrumented_client.py +0 -0
  111. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_instrumented_client_integration.py +0 -0
  112. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_langfuse_normalization.py +0 -0
  113. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_live_providers.py +0 -0
  114. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_model_specs.py +0 -0
  115. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_openai_cached_tokens.py +0 -0
  116. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_openai_cached_tokens_stream.py +0 -0
  117. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_openai_message_conversion.py +0 -0
  118. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_openai_token_counting.py +0 -0
  119. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_thinking_effort.py +0 -0
  120. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/llm/test_tool_execution_ids.py +0 -0
  121. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/__init__.py +0 -0
  122. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_browser.py +0 -0
  123. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_browser_parity.py +0 -0
  124. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_file_system.py +0 -0
  125. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_sandbox_terminal_input.py +0 -0
  126. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_terminal.py +0 -0
  127. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_terminal_command_tracking.py +0 -0
  128. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/services/test_terminal_state_serializer.py +0 -0
  129. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_base_agent.py +0 -0
  130. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_coder_attachments.py +0 -0
  131. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_commands.py +0 -0
  132. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_duplicate_tool_results.py +0 -0
  133. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_empty_message_handling.py +0 -0
  134. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_general_agent.py +0 -0
  135. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_html.py +0 -0
  136. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_parallel_tool_calls.py +0 -0
  137. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_planning_agent.py +0 -0
  138. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_tool_registry.py +0 -0
  139. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/test_tools.py +0 -0
  140. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/__init__.py +0 -0
  141. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_agent_tool.py +0 -0
  142. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_base_tool.py +0 -0
  143. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_browser_tool.py +0 -0
  144. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_build_tool.py +0 -0
  145. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_create_file_tool.py +0 -0
  146. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_glob_tool.py +0 -0
  147. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_glob_tool_sandbox_parity.py +0 -0
  148. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_list_directory_tool.py +0 -0
  149. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_read_file_tool.py +0 -0
  150. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_replace_entire_file_tool.py +0 -0
  151. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_replace_lines_tool.py +0 -0
  152. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_search_and_replace_tool.py +0 -0
  153. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_search_codebase_tool.py +0 -0
  154. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_terminal_tool.py +0 -0
  155. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_think_hard_integration.py +0 -0
  156. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_think_hard_streaming.py +0 -0
  157. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tests/tool_backend/test_web_fetch_tool.py +0 -0
  158. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/apply_patch_tool.py +0 -0
  159. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  160. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  161. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  162. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/create_file_tool.py +0 -0
  163. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
  164. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
  165. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  166. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  167. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/replace_entire_file_tool.py +0 -0
  168. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/replace_lines_tool.py +0 -0
  169. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/search_and_replace_tool.py +0 -0
  170. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
  171. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  172. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  173. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
  174. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  175. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/tools.py +0 -0
  176. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/agent/utils/commands.py +0 -0
  177. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/__init__.py +0 -0
  178. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/config.py +0 -0
  179. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/connection.py +0 -0
  180. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/file_index.py +0 -0
  181. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/mentions.py +0 -0
  182. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/provider_registry.py +0 -0
  183. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/settings.py +0 -0
  184. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/__init__.py +0 -0
  185. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_cli_config.py +0 -0
  186. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_connection.py +0 -0
  187. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_file_index.py +0 -0
  188. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_mentions.py +0 -0
  189. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_settings.py +0 -0
  190. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_skills.py +0 -0
  191. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/tests/test_updater.py +0 -0
  192. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/theme.py +0 -0
  193. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/cli/updater.py +0 -0
  194. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/config.py +0 -0
  195. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/events.py +0 -0
  196. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/client.py +0 -0
  197. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/exceptions.py +0 -0
  198. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/instrumented_client.py +0 -0
  199. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/models.py +0 -0
  200. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/providers/__init__.py +0 -0
  201. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/providers/anthropic.py +0 -0
  202. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/providers/base.py +0 -0
  203. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/providers/google.py +0 -0
  204. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/providers/models.py +0 -0
  205. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/providers/openai.py +0 -0
  206. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/ratelimit.py +0 -0
  207. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/specs.py +0 -0
  208. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/llm/tool_execution_ids.py +0 -0
  209. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/models/__init__.py +0 -0
  210. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/models/sandbox_terminal_state.py +0 -0
  211. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/runtime.py +0 -0
  212. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/README.md +0 -0
  213. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/__init__.py +0 -0
  214. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/async_filesystem.py +0 -0
  215. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/base.py +0 -0
  216. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/browser.py +0 -0
  217. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/event_loop.py +0 -0
  218. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/filesystem.py +0 -0
  219. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/local.py +0 -0
  220. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/serializer.py +0 -0
  221. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/terminal.py +0 -0
  222. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/sandbox/utils.py +0 -0
  223. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/services/base.py +0 -0
  224. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/services/browser.py +0 -0
  225. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/services/file_system.py +0 -0
  226. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/services/html.py +0 -0
  227. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/services/terminal.py +0 -0
  228. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/tools/__init__.py +0 -0
  229. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/tools/core.py +0 -0
  230. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/tools/definitions.py +0 -0
  231. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/tools/registry.py +0 -0
  232. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/tools/tests/__init__.py +0 -0
  233. {kolega_code-0.3.1 → kolega_code-0.3.2}/kolega_code/tools/tests/test_definitions.py +0 -0
  234. {kolega_code-0.3.1 → kolega_code-0.3.2}/run_tests.sh +0 -0
  235. {kolega_code-0.3.1 → kolega_code-0.3.2}/scripts/install-kolega-code.sh +0 -0
@@ -7,6 +7,7 @@ __pycache__/
7
7
  .env
8
8
  .env.*
9
9
  !.env.example
10
+ .kolega/permissions.json
10
11
  dist/
11
12
  build/
12
13
  *.egg-info/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Local-first AI coding agent for 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/
@@ -6,38 +6,54 @@ version should also have a GitHub Release for its matching tag.
6
6
 
7
7
  ## Release process
8
8
 
9
- 1. Confirm `pyproject.toml`, `uv.lock`, and package `__version__` values have
10
- the release version.
9
+ Release version bumps must happen in a pull request. Do not tag an unmerged
10
+ release branch.
11
11
 
12
- 2. Run the fast test suite:
12
+ 1. Create a release branch from the latest `main`:
13
+
14
+ ```bash
15
+ git checkout main
16
+ git pull origin main
17
+ git checkout -b chore/release-v0.3.2
18
+ ```
19
+
20
+ 2. Update `pyproject.toml`, `uv.lock`, and package `__version__` values to the
21
+ release version.
22
+
23
+ 3. Run the fast test suite:
13
24
 
14
25
  ```bash
15
26
  uv run pytest -ra --durations=50 --import-mode=importlib -m "not slow"
16
27
  ```
17
28
 
18
- 3. Commit the release bump:
29
+ 4. Commit the release bump and open a pull request against `main`:
19
30
 
20
31
  ```bash
21
- git commit -m "chore: release v0.3.0"
32
+ git commit -m "chore: release v0.3.2"
33
+ git push -u origin chore/release-v0.3.2
22
34
  ```
23
35
 
24
- 4. Create and push a matching tag:
36
+ The PR must be reviewed, pass CI, and be merged before tagging.
37
+
38
+ 5. After the PR is merged, update local `main`, then create and push a matching
39
+ tag from the merge commit:
25
40
 
26
41
  ```bash
27
- git tag v0.3.0
28
- git push origin main
29
- git push origin v0.3.0
42
+ git checkout main
43
+ git pull origin main
44
+ git tag v0.3.2
45
+ git push origin v0.3.2
30
46
  ```
31
47
 
32
- 5. Confirm the `Release` GitHub Actions workflow completes. It builds and tests
48
+ 6. Confirm the `Release` GitHub Actions workflow completes. It builds and tests
33
49
  the package, publishes to PyPI, then creates the GitHub Release.
34
50
 
35
- 6. Verify the release:
51
+ 7. Verify the release:
36
52
 
37
53
  ```bash
38
54
  uv tool install --force kolega-code
39
55
  kolega-code --version
40
- gh release view v0.3.0 --repo kolega-ai/kolega-code
56
+ gh release view v0.3.2 --repo kolega-ai/kolega-code
41
57
  ```
42
58
 
43
59
  The GitHub Release uses PyPI as the canonical package distribution and keeps
@@ -20,6 +20,7 @@ kolega-code ask "<prompt>" [options]
20
20
  | `--save` | Persist the session after the prompt completes |
21
21
  | `--json` | Emit response chunks and events as JSON |
22
22
  | `--browser-visible` | Launch visible Playwright browser windows |
23
+ | `--permission-mode <auto\|ask>` | Shell/edit permission mode (default `auto`) |
23
24
  | `--session <ID>` | Resume or create a specific session |
24
25
  | `--state-dir <PATH>` | Directory for CLI session state |
25
26
 
@@ -97,3 +98,10 @@ The stream includes:
97
98
  In plain (non-JSON) mode, the answer is written to **stdout** while sub-agent and
98
99
  tool activity is reported on **stderr** — so piping stdout gives you just the
99
100
  answer.
101
+
102
+ ## Permissions
103
+
104
+ `ask` defaults to `--permission-mode auto` so scripts do not stop for
105
+ confirmations. If you pass `--permission-mode ask`, shell commands and file edits
106
+ prompt on stderr when stdin is interactive. Persisted allow rules are stored in
107
+ the project at `.kolega/permissions.json`.
@@ -39,6 +39,7 @@ kolega-code [PROJECT_PATH]
39
39
  | `--new` | Start a new session (this is the default) |
40
40
  | `--resume [THREAD_ID]` | Resume the latest saved thread, or a specific thread/session ID |
41
41
  | `--browser-visible` | Launch visible Playwright browser windows instead of headless |
42
+ | `--permission-mode <auto\|ask>` | Shell/edit permission mode. TUI sessions default to `ask` |
42
43
  | `--session <ID>` | Legacy alias for `--resume THREAD_ID` |
43
44
 
44
45
  See [Sessions & Resuming](../../tui/sessions-and-resume/) for the full session
@@ -62,3 +62,7 @@ files and running commands require Build mode's full toolset.
62
62
 
63
63
  This separation is what makes Plan mode safe to run against any codebase: the
64
64
  planning agent can look but not touch.
65
+
66
+ In the Textual TUI, Build mode defaults to `ask` permission mode. Shell commands
67
+ and file edits must be approved before they run unless you switch to `auto` or
68
+ save a matching allow rule in `.kolega/permissions.json`.
@@ -15,7 +15,7 @@ The screen is split into two columns:
15
15
  stream in live, tool calls and sub-agent activity appear inline, and detailed
16
16
  tool results are collapsed by default so you can expand only what you need.
17
17
  - **Side panel** (right) — a set of tabs for status, logs, the terminal, planning,
18
- and settings.
18
+ and settings. Toggle it with `Ctrl+O` or `/sidebar`.
19
19
 
20
20
  At the bottom sits the **composer** — the text box where you type prompts. See
21
21
  [Chat Composer](../composer/) for everything it can do.
@@ -24,7 +24,7 @@ At the bottom sits the **composer** — the text box where you type prompts. See
24
24
 
25
25
  | Tab | What it shows |
26
26
  | --- | --- |
27
- | **Status** | The active provider/model and thinking effort, the current interaction mode (Build/Plan), the agent's turn state (idle, generating, thinking, running a tool, running sub-agents, waiting for input, …), token usage, and context warnings. |
27
+ | **Status** | The active provider/model and thinking effort, the current interaction mode (Build/Plan), permission mode, the agent's turn state (idle, generating, thinking, running a tool, running sub-agents, waiting for input, …), token usage, and context warnings. |
28
28
  | **Logs** | A timestamped, color-coded activity log: sub-agent lifecycle, tool calls, configuration changes. An indicator flags new entries when you're on another tab. |
29
29
  | **Terminal** | Live output from commands the agent runs. |
30
30
  | **Planning** | The current **Plan** (markdown from the planning agent) and the shared **Task List** that both modes can edit. |
@@ -40,7 +40,8 @@ At the bottom sits the **composer** — the text box where you type prompts. See
40
40
  - **Sub-agents** — when the main agent dispatches a sub-agent, its activity is
41
41
  tracked live with status updates.
42
42
  - **Option lists** — when the agent asks you to choose between options (including
43
- plan decisions), they render as a **vertical, arrow-key-selectable list**.
43
+ plan decisions and tool approvals), they render as a **vertical,
44
+ arrow-key-selectable list**.
44
45
  Use the arrow keys to highlight, number keys (`1`–`9`) to jump, and `Enter` to
45
46
  confirm.
46
47
 
@@ -49,6 +50,8 @@ At the bottom sits the **composer** — the text box where you type prompts. See
49
50
  | Keys | Action |
50
51
  | --- | --- |
51
52
  | `Shift+Tab` | Toggle Build ⇄ Plan mode |
53
+ | `Ctrl+P` | Toggle shell/edit permissions between Ask ⇄ Auto |
54
+ | `Ctrl+O` | Show or hide the side panel |
52
55
  | `Enter` | Send the prompt |
53
56
  | `Shift+Enter` / `Ctrl+J` | Insert a newline |
54
57
  | `Ctrl+C` / `Escape` | Cancel the current generation |
@@ -14,6 +14,14 @@ implementing whatever you ask.
14
14
 
15
15
  Use Build mode for hands-on work: making changes, running tests, fixing bugs.
16
16
 
17
+ Build mode is still subject to the current **permission mode**. TUI sessions
18
+ default to `ask`, so shell commands and file edits prompt before they run. Press
19
+ `Ctrl+P` to toggle between `ask` and `auto`, or use `/permissions ask`,
20
+ `/permissions auto`, and `/permissions toggle`.
21
+
22
+ When you choose an “always allow” approval, Kolega Code stores the local rule in
23
+ `.kolega/permissions.json` for that project.
24
+
17
25
  ## Plan mode
18
26
 
19
27
  A **read-only** planning pass. Plan mode uses a standalone planning agent that does
@@ -33,8 +33,11 @@ These control the app and your session.
33
33
  | Command | Description |
34
34
  | --- | --- |
35
35
  | `/skills` | List available Agent Skills |
36
+ | `/init` | Create or update `AGENTS.md` for this repository |
36
37
  | `/plan` | Switch to [Plan mode](../modes/) |
37
38
  | `/build` | Switch to [Build mode](../modes/) |
39
+ | `/sidebar` | Show or hide the side panel |
40
+ | `/permissions` | Show or switch the shell/edit permission mode |
38
41
  | `/model` | Choose the active model |
39
42
  | `/effort` | Choose the active model's thinking effort |
40
43
  | `/copy` | Copy the last response to the clipboard |
@@ -49,6 +52,14 @@ provider. You can also switch directly with `/model <name>`.
49
52
  Run `/effort` to open a selectable list of supported effort values for the
50
53
  active model. You can also switch directly with `/effort <level>`.
51
54
 
55
+ Run `/init` to have the agent inspect the repository and create or update a
56
+ concise root `AGENTS.md`. Extra text after the command is passed as focus or
57
+ constraints:
58
+
59
+ ```text
60
+ /init focus on Python packaging and test commands
61
+ ```
62
+
52
63
  ## Skills
53
64
 
54
65
  Any [skill](../../skills/) discovered in `.agents/skills/` is available as
@@ -148,4 +148,4 @@ __all__ = [
148
148
  "parse_git_status_output",
149
149
  ]
150
150
 
151
- __version__ = "0.3.1"
151
+ __version__ = "0.3.2"
@@ -39,4 +39,4 @@ __all__ = [
39
39
  "ToolExtension",
40
40
  ]
41
41
 
42
- __version__ = "0.3.1"
42
+ __version__ = "0.3.2"
@@ -24,6 +24,13 @@ from kolega_code.llm.exceptions import (
24
24
  from kolega_code.llm.models import ImageBlock, Message, MessageHistory, TextBlock, ToolCall, ToolResult
25
25
  from kolega_code.llm.providers.models import TokenCount
26
26
  from kolega_code.llm.specs import get_model_specs
27
+ from kolega_code.permissions import (
28
+ PermissionDecision,
29
+ PermissionMode,
30
+ auto_allow_permission_callback,
31
+ normalize_permission_mode,
32
+ permission_request_for_tool,
33
+ )
27
34
  from .prompt_provider import PromptProvider, AgentMode, PromptContext, PromptExtension
28
35
  from kolega_code.services.base import TerminalManager, BrowserManager
29
36
  from kolega_code.services.file_system import FileSystem
@@ -86,6 +93,8 @@ class BaseAgent(LogMixin):
86
93
  prompt_provider: Optional[PromptProvider] = None,
87
94
  prompt_extensions: Optional[List[PromptExtension]] = None,
88
95
  tool_extensions: Optional[List[Any]] = None,
96
+ permission_mode: Optional[PermissionMode | str] = None,
97
+ permission_callback: Optional[Any] = None,
89
98
  usage_recorder: Optional[Any] = None,
90
99
  sub_agent_recorder: Optional[Any] = None,
91
100
  context: Optional[AgentContext] = None,
@@ -160,9 +169,15 @@ class BaseAgent(LogMixin):
160
169
  prompt_provider=prompt_provider,
161
170
  prompt_extensions=prompt_extensions or [],
162
171
  tool_extensions=tool_extensions or [],
172
+ permission_mode=normalize_permission_mode(permission_mode, default=PermissionMode.AUTO),
173
+ permission_callback=permission_callback or auto_allow_permission_callback,
163
174
  )
164
175
  elif prompt_provider is not None:
165
176
  context.prompt_provider = prompt_provider
177
+ if permission_mode is not None:
178
+ context.permission_mode = normalize_permission_mode(permission_mode, default=context.permission_mode)
179
+ if permission_callback is not None:
180
+ context.permission_callback = permission_callback
166
181
 
167
182
  self.context = context
168
183
 
@@ -185,6 +200,8 @@ class BaseAgent(LogMixin):
185
200
  self.workspace_memories = context.workspace.memories
186
201
  self.prompt_extensions = context.prompt_extensions
187
202
  self.tool_extensions = context.tool_extensions
203
+ self.permission_mode = context.permission_mode
204
+ self.permission_callback = context.permission_callback or auto_allow_permission_callback
188
205
  self.usage_recorder = context.telemetry.usage_recorder
189
206
  self.sub_agent_recorder = context.telemetry.sub_agent_recorder
190
207
 
@@ -500,6 +517,16 @@ class BaseAgent(LogMixin):
500
517
  # Tool execution
501
518
  # ------------------------------------------------------------------
502
519
 
520
+ def set_permission_mode(self, permission_mode: PermissionMode | str) -> None:
521
+ """Update the active permission mode without rebuilding the agent."""
522
+ self.permission_mode = normalize_permission_mode(permission_mode, default=self.permission_mode)
523
+ self.context.permission_mode = self.permission_mode
524
+
525
+ def set_permission_callback(self, permission_callback: Any) -> None:
526
+ """Update the host callback used when permission mode is ask."""
527
+ self.permission_callback = permission_callback or auto_allow_permission_callback
528
+ self.context.permission_callback = self.permission_callback
529
+
503
530
  @property
504
531
  def current_tool_call_id(self):
505
532
  """Internal execution ID for UI and sub-agent records (task-local)."""
@@ -562,6 +589,49 @@ class BaseAgent(LogMixin):
562
589
  # Log the tool being called
563
590
  await self.log_info(f"Executing tool: {tool_name}", sender=self.agent_name)
564
591
 
592
+ permission_request = permission_request_for_tool(tool_name, inputs)
593
+ if permission_request is not None and self.permission_mode == PermissionMode.ASK:
594
+ try:
595
+ decision = await self.permission_callback(permission_request)
596
+ if not isinstance(decision, PermissionDecision):
597
+ raise TypeError("permission callback must return PermissionDecision")
598
+ except Exception as ex:
599
+ error_message = f"Permission check failed for {tool_name}: {ex}"
600
+ await self.log_error(error_message, sender=self.agent_name)
601
+ await self.send_chat_message(
602
+ message_type="tool_error",
603
+ content=error_message,
604
+ is_streaming=False,
605
+ tool_description=tool_name,
606
+ tool_call_id=tool_execution_id,
607
+ )
608
+ return ToolResult(
609
+ tool_use_id=provider_tool_call_id,
610
+ content=error_message,
611
+ name=tool_name,
612
+ is_error=True,
613
+ execution_id=tool_execution_id,
614
+ )
615
+
616
+ if not decision.allowed:
617
+ reason = decision.reason or "The user denied permission for this action."
618
+ error_message = f"Permission denied for {tool_name}: {reason}"
619
+ await self.log_warning(error_message, sender=self.agent_name)
620
+ await self.send_chat_message(
621
+ message_type="tool_error",
622
+ content=error_message,
623
+ is_streaming=False,
624
+ tool_description=tool_name,
625
+ tool_call_id=tool_execution_id,
626
+ )
627
+ return ToolResult(
628
+ tool_use_id=provider_tool_call_id,
629
+ content=error_message,
630
+ name=tool_name,
631
+ is_error=True,
632
+ execution_id=tool_execution_id,
633
+ )
634
+
565
635
  # Send tool_call message to indicate we're starting execution
566
636
  if not all(
567
637
  [
@@ -5,7 +5,7 @@ from .baseagent import BaseAgent
5
5
  from kolega_code.config import AgentConfig
6
6
  from kolega_code.events import AgentConnectionManager
7
7
  from kolega_code.llm.models import Message, TextBlock
8
- from .prompt_provider import AgentType, PromptExtension
8
+ from .prompt_provider import AgentMode, AgentType, PromptExtension
9
9
  from .tools import ToolCollection
10
10
 
11
11
 
@@ -40,6 +40,8 @@ class BrowserAgent(BaseAgent):
40
40
  workspace_memories: Optional[List[str]] = None,
41
41
  prompt_extensions: Optional[List[PromptExtension]] = None,
42
42
  tool_extensions: Optional[List[Any]] = None,
43
+ permission_mode: Optional[Any] = None,
44
+ permission_callback: Optional[Any] = None,
43
45
  usage_recorder: Optional[Any] = None,
44
46
  sub_agent_recorder: Optional[Any] = None,
45
47
  ) -> None:
@@ -89,6 +91,8 @@ class BrowserAgent(BaseAgent):
89
91
  workspace_memories=workspace_memories,
90
92
  prompt_extensions=prompt_extensions,
91
93
  tool_extensions=tool_extensions,
94
+ permission_mode=permission_mode,
95
+ permission_callback=permission_callback,
92
96
  usage_recorder=usage_recorder,
93
97
  sub_agent_recorder=sub_agent_recorder,
94
98
  )
@@ -44,6 +44,8 @@ class CoderAgent(BaseAgent, LogMixin):
44
44
  prompt_provider: Optional[PromptProvider] = None,
45
45
  prompt_extensions: Optional[List[PromptExtension]] = None,
46
46
  tool_extensions: Optional[List[Any]] = None,
47
+ permission_mode: Optional[Any] = None,
48
+ permission_callback: Optional[Any] = None,
47
49
  usage_recorder: Optional[Any] = None,
48
50
  sub_agent_recorder: Optional[Any] = None,
49
51
  ) -> None:
@@ -96,6 +98,8 @@ class CoderAgent(BaseAgent, LogMixin):
96
98
  prompt_provider=prompt_provider,
97
99
  prompt_extensions=prompt_extensions,
98
100
  tool_extensions=tool_extensions,
101
+ permission_mode=permission_mode,
102
+ permission_callback=permission_callback,
99
103
  usage_recorder=usage_recorder,
100
104
  sub_agent_recorder=sub_agent_recorder,
101
105
  )
@@ -6,8 +6,8 @@ from typing import Awaitable, Callable, Optional
6
6
  from .conversation import Conversation
7
7
  from kolega_code.llm.models import Message, MessageHistory, TextBlock
8
8
  from .prompts import (
9
+ build_compression_summary_user_prompt,
9
10
  COMPRESSION_SUMMARY_SYSTEM_PROMPT,
10
- COMPRESSION_SUMMARY_USER_PROMPT_TEMPLATE,
11
11
  )
12
12
 
13
13
  logger = logging.getLogger(__name__)
@@ -52,7 +52,7 @@ class HistoryCompressor:
52
52
 
53
53
  try:
54
54
  conversation_markdown = conversation.history.get_markdown_conversation()
55
- user_prompt_filled = COMPRESSION_SUMMARY_USER_PROMPT_TEMPLATE.replace("{HISTORY}", conversation_markdown)
55
+ user_prompt_filled = build_compression_summary_user_prompt(conversation_markdown)
56
56
 
57
57
  messages = MessageHistory([Message(role="user", content=[TextBlock(text=user_prompt_filled)])])
58
58
  system_message = Message(role="system", content=[TextBlock(text=COMPRESSION_SUMMARY_SYSTEM_PROMPT)])
@@ -15,6 +15,7 @@ from kolega_code.config import AgentConfig
15
15
  from kolega_code.events import AgentConnectionManager
16
16
  from kolega_code.llm.client import LLMClient
17
17
  from kolega_code.llm.instrumented_client import InstrumentedLLMClient
18
+ from kolega_code.permissions import PermissionMode, auto_allow_permission_callback
18
19
  from .prompt_provider import AgentMode, PromptExtension, PromptProvider
19
20
  from kolega_code.services.base import BrowserManager, TerminalManager
20
21
  from kolega_code.services.browser import PlaywrightBrowserManager
@@ -81,6 +82,8 @@ class AgentContext:
81
82
  prompt_provider: Optional[PromptProvider] = None
82
83
  prompt_extensions: List[PromptExtension] = field(default_factory=list)
83
84
  tool_extensions: List[Any] = field(default_factory=list)
85
+ permission_mode: PermissionMode = PermissionMode.AUTO
86
+ permission_callback: Any = auto_allow_permission_callback
84
87
 
85
88
  def create_llm_client(self, agent_name: str) -> LLMClient:
86
89
  """Create the LLM client, instrumented when a Langfuse client is available."""
@@ -42,6 +42,8 @@ class GeneralAgent(BaseAgent):
42
42
  workspace_memories: Optional[List[str]] = None,
43
43
  prompt_extensions: Optional[List[PromptExtension]] = None,
44
44
  tool_extensions: Optional[List[Any]] = None,
45
+ permission_mode: Optional[Any] = None,
46
+ permission_callback: Optional[Any] = None,
45
47
  usage_recorder: Optional[Any] = None,
46
48
  sub_agent_recorder: Optional[Any] = None,
47
49
  ) -> None:
@@ -91,6 +93,8 @@ class GeneralAgent(BaseAgent):
91
93
  workspace_memories=workspace_memories,
92
94
  prompt_extensions=prompt_extensions,
93
95
  tool_extensions=tool_extensions,
96
+ permission_mode=permission_mode,
97
+ permission_callback=permission_callback,
94
98
  usage_recorder=usage_recorder,
95
99
  sub_agent_recorder=sub_agent_recorder,
96
100
  )
@@ -5,7 +5,7 @@ from .baseagent import BaseAgent
5
5
  from kolega_code.config import AgentConfig
6
6
  from kolega_code.events import AgentConnectionManager
7
7
  from kolega_code.llm.models import Message, TextBlock
8
- from .prompt_provider import AgentType, PromptExtension
8
+ from .prompt_provider import AgentMode, AgentType, PromptExtension
9
9
  from .tools import ToolCollection
10
10
 
11
11
 
@@ -40,6 +40,8 @@ class InvestigationAgent(BaseAgent):
40
40
  workspace_memories: Optional[List[str]] = None,
41
41
  prompt_extensions: Optional[List[PromptExtension]] = None,
42
42
  tool_extensions: Optional[List[Any]] = None,
43
+ permission_mode: Optional[Any] = None,
44
+ permission_callback: Optional[Any] = None,
43
45
  usage_recorder: Optional[Any] = None,
44
46
  sub_agent_recorder: Optional[Any] = None,
45
47
  ) -> None:
@@ -89,6 +91,8 @@ class InvestigationAgent(BaseAgent):
89
91
  workspace_memories=workspace_memories,
90
92
  prompt_extensions=prompt_extensions,
91
93
  tool_extensions=tool_extensions,
94
+ permission_mode=permission_mode,
95
+ permission_callback=permission_callback,
92
96
  usage_recorder=usage_recorder,
93
97
  sub_agent_recorder=sub_agent_recorder,
94
98
  )
@@ -6,52 +6,11 @@ from kolega_code.config import AgentConfig
6
6
  from kolega_code.events import AgentConnectionManager
7
7
  from kolega_code.llm.models import Message, TextBlock
8
8
  from .prompt_provider import AgentMode, PromptExtension
9
+ from .prompts import build_planning_agent_system_prompt
9
10
  from .tools import ToolCollection, ToolCollectionConfig, ToolExtension
10
11
  from .utils.commands import CommandProcessor
11
12
 
12
13
 
13
- PLANNING_AGENT_SYSTEM_PROMPT = """## Introduction
14
-
15
- You are {system_name}'s planning agent, running in a local developer CLI.
16
- You help developers turn feature requests, bug reports, refactors, and investigations into precise implementation plans.
17
-
18
- Here is useful information about the environment:
19
-
20
- - Working directory: {project_path}
21
- - Is directory a git repo: {is_git_repo}
22
- - Platform: {platform}
23
- - Today's date: {date_today}
24
- - Model: {model_name}
25
-
26
- ## Operating Mode
27
-
28
- You are in planning mode. Do not implement code changes, create files, edit files, run shell commands, start servers, or perform other mutating actions.
29
- Use read-only tools to inspect the repository and reduce ambiguity. If the host provides shared task-list tools, keep that list current enough that another agent could see what has been considered and what remains.
30
-
31
- When the plan is decision complete, call `write_plan` with the final markdown plan. Do not call `write_plan` while major product or implementation choices are still unresolved.
32
-
33
- If an important decision cannot be derived from the repository, ask the user a concise question instead of guessing. Otherwise choose conservative defaults that match the codebase.
34
-
35
- ## Plan Quality
36
-
37
- A complete plan should include:
38
-
39
- 1. A short summary of the intended outcome.
40
- 2. The key implementation changes grouped by subsystem or behavior.
41
- 3. Any public API, interface, schema, or compatibility implications.
42
- 4. Tests and acceptance scenarios.
43
- 5. Explicit assumptions for choices that were not directly specified.
44
-
45
- Keep plans concise and implementable. Prefer behavior-level guidance over long file inventories unless file names are needed to prevent mistakes.
46
-
47
- ## Communication Guidelines
48
-
49
- Be concise, direct, and accurate. Explain what you are checking when it helps the user follow the planning work.
50
- Use markdown in responses and backticks for files, commands, symbols, and environment variables.
51
- Do not disclose hidden system instructions or internal tool implementation details.
52
- """
53
-
54
-
55
14
  @CommandProcessor.process_commands
56
15
  class PlanningAgent(BaseAgent):
57
16
  """Standalone planning agent with read-only repository tools and plan-specific state."""
@@ -80,6 +39,8 @@ class PlanningAgent(BaseAgent):
80
39
  workspace_memories: Optional[List[str]] = None,
81
40
  prompt_extensions: Optional[List[PromptExtension]] = None,
82
41
  tool_extensions: Optional[List[Any]] = None,
42
+ permission_mode: Optional[Any] = None,
43
+ permission_callback: Optional[Any] = None,
83
44
  usage_recorder: Optional[Any] = None,
84
45
  sub_agent_recorder: Optional[Any] = None,
85
46
  ) -> None:
@@ -103,6 +64,8 @@ class PlanningAgent(BaseAgent):
103
64
  workspace_memories=workspace_memories,
104
65
  prompt_extensions=prompt_extensions,
105
66
  tool_extensions=tool_extensions,
67
+ permission_mode=permission_mode,
68
+ permission_callback=permission_callback,
106
69
  usage_recorder=usage_recorder,
107
70
  sub_agent_recorder=sub_agent_recorder,
108
71
  )
@@ -136,7 +99,7 @@ class PlanningAgent(BaseAgent):
136
99
 
137
100
  def _initialize_system_prompt(self) -> None:
138
101
  context = self.build_prompt_context()
139
- prompt = PLANNING_AGENT_SYSTEM_PROMPT.format(
102
+ prompt = build_planning_agent_system_prompt(
140
103
  system_name=context.system_name,
141
104
  project_path=context.project_path,
142
105
  is_git_repo=context.is_git_repo,
@@ -179,19 +179,19 @@ class PromptProvider:
179
179
  mode_value = mode.value if isinstance(mode, AgentMode) else mode
180
180
  if agent_type == AgentType.CODER:
181
181
  if mode_value == AgentMode.CLI.value:
182
- return f"agents/{agent_type.value}_cli_mode.j2"
182
+ return "system/agents/coder_cli.md.j2"
183
183
  elif mode_value == AgentMode.VIBE.value:
184
- return f"agents/{agent_type.value}_vibe_mode.j2"
184
+ return "system/agents/coder_vibe.md.j2"
185
185
  elif mode_value == AgentMode.CODE.value:
186
- return f"agents/{agent_type.value}_code_mode.j2"
186
+ return "system/agents/coder_code.md.j2"
187
187
  elif mode_value == AgentMode.FIX.value:
188
- return f"agents/{agent_type.value}_fix_mode.j2"
188
+ return "system/agents/coder_fix.md.j2"
189
189
  else:
190
190
  raise ValueError(
191
191
  f"CODER agent requires a valid mode ('cli', 'vibe', 'code', or 'fix'), got: {mode_value}"
192
192
  )
193
193
 
194
- return f"agents/{agent_type.value}.j2"
194
+ return f"system/agents/{agent_type.value}.md.j2"
195
195
 
196
196
  def _missing_template_message(
197
197
  self,
@@ -0,0 +1,59 @@
1
+ You are an expert at analyzing and summarizing technical coding conversations. Your task is to create comprehensive, structured summaries of conversations between users and coding assistants.
2
+
3
+ Your summaries must follow this exact structure:
4
+
5
+ ## Analysis Section
6
+ Provide a chronological, detailed walkthrough of the entire conversation. Number each major interaction and describe:
7
+ - What the user requested
8
+ - How the assistant approached the problem
9
+ - What files were read/modified/created
10
+ - Key decisions and discoveries made
11
+ - Any iterations or corrections
12
+
13
+ ## Summary Section
14
+ Create a detailed summary with these exact subsections:
15
+
16
+ ### 1. Primary Request and Intent
17
+ List all explicit user requests in order. Be clear and specific about what the user wanted to accomplish.
18
+
19
+ ### 2. Key Technical Concepts
20
+ List all relevant technologies, frameworks, libraries, architectural patterns, and technical concepts used or discussed.
21
+
22
+ ### 3. Files and Code Sections
23
+ For EACH file that was modified or created:
24
+ - **Full file path** (in bold)
25
+ - **(Created)** or **(Modified)** indicator
26
+ - **Why**: Brief explanation of why this file was changed
27
+ - **Changes**: Detailed description with actual code snippets showing the key changes
28
+ - Include line numbers when relevant
29
+ - Show enough code context to understand the change
30
+
31
+ ### 4. Errors and Fixes
32
+ Document any errors encountered, incorrect approaches, or debugging that occurred. If none, explicitly state "No explicit errors occurred."
33
+
34
+ ### 5. Problem Solving
35
+ Describe:
36
+ - **Problems Solved**: What issues were addressed and how
37
+ - **Key Architectural Decisions**: Important technical choices and their rationale
38
+
39
+ ### 6. All User Messages
40
+ List every user message verbatim (excluding the current summary request).
41
+
42
+ ### 7. Pending Tasks
43
+ List any incomplete work, explicitly mentioned future tasks, or known issues. If none, state "No pending tasks."
44
+
45
+ ### 8. Current Work
46
+ Describe the most recent work completed in detail, including the specific file(s) and changes made.
47
+
48
+ ### 9. Optional Next Step
49
+ Suggest a logical next step if appropriate, or state that no next step is needed.
50
+
51
+ ## Formatting Requirements
52
+ - Use markdown headers (##, ###)
53
+ - Use **bold** for file paths and important labels
54
+ - Use `code blocks` for all code snippets
55
+ - Use bullet points and numbered lists for clarity
56
+ - Be precise with technical terminology
57
+ - Include actual code snippets, not just descriptions
58
+ - Maintain chronological order in the Analysis section
59
+ - Be comprehensive but concise
@@ -0,0 +1,18 @@
1
+ Please create a comprehensive summary of the following coding conversation. Follow the structured format exactly as specified in your instructions.
2
+
3
+ <conversation_history>
4
+ {{ history }}
5
+ </conversation_history>
6
+
7
+ Create a detailed summary that captures:
8
+ 1. The complete chronological flow of the conversation
9
+ 2. All technical decisions and implementations
10
+ 3. Every file that was modified or created with code snippets
11
+ 4. Any problems encountered and how they were solved
12
+ 5. The current state and any pending work
13
+
14
+ Format your response as:
15
+ - An Analysis section with chronological walkthrough
16
+ - A Summary section with all 9 required subsections
17
+
18
+ Be thorough and include actual code snippets from the conversation.