kolega-code 0.14.0__tar.gz → 0.16.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.
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.gitignore +1 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/CHANGELOG.md +45 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/PKG-INFO +2 -2
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/astro.config.mjs +8 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/assets/coverage.svg +1 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/concepts/tools.md +3 -0
- kolega_code-0.16.0/docs/src/content/docs/configuration/lsp.md +121 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/configuration/providers-and-models.mdx +2 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/gigacode.mdx +10 -0
- kolega_code-0.16.0/docs/src/content/docs/troubleshooting/terminal-tmux.md +67 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/tui/composer.md +21 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/tui/interface.md +4 -2
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/tui/slash-commands.md +2 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/__init__.py +1 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/guide.py +19 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/edit_tool.py +109 -8
- kolega_code-0.16.0/kolega_code/agent/tool_backend/lsp_tool.py +1121 -0
- kolega_code-0.16.0/kolega_code/agent/tool_backend/snapshot_tool.py +191 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tools.py +402 -5
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/app.py +64 -3
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/config.py +4 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/main.py +25 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/messages.py +11 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/provider_registry.py +2 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/settings.py +19 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/skills.py +289 -11
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/slash_commands.py +6 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/agent_runtime.py +93 -3
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/app_base.py +2 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/command_handlers.py +24 -8
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/settings_panel.py +60 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/transcript.py +18 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/widgets.py +33 -10
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/config.py +11 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/openai.py +13 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/xai.py +13 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/permissions.py +5 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/async_filesystem.py +26 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/filesystem.py +20 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/services/file_system.py +24 -0
- kolega_code-0.16.0/kolega_code/services/lsp/__init__.py +55 -0
- kolega_code-0.16.0/kolega_code/services/lsp/client.py +397 -0
- kolega_code-0.16.0/kolega_code/services/lsp/config.py +134 -0
- kolega_code-0.16.0/kolega_code/services/lsp/detector.py +276 -0
- kolega_code-0.16.0/kolega_code/services/lsp/diagnostics.py +250 -0
- kolega_code-0.16.0/kolega_code/services/lsp/edits.py +489 -0
- kolega_code-0.16.0/kolega_code/services/lsp/manager.py +1553 -0
- kolega_code-0.16.0/kolega_code/services/lsp/registry.py +371 -0
- kolega_code-0.16.0/kolega_code/services/lsp/registry.yaml +482 -0
- kolega_code-0.16.0/kolega_code/services/snapshots.py +600 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/pyproject.toml +2 -2
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_model_specs.py +12 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_reasoning_replay.py +1 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_supports_vision.py +1 -0
- kolega_code-0.16.0/tests/agent/llm/test_xai_prompt_cache_header.py +38 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_agent_tools_inventory.py +4 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_permissions.py +22 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_prompts.py +9 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tool_collection_config.py +4 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tool_registry.py +1 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_edit_tool.py +64 -0
- kolega_code-0.16.0/tests/agent/tool_backend/test_lsp_tool.py +595 -0
- kolega_code-0.16.0/tests/agent/tool_backend/test_snapshot_tool.py +345 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/_app_test_utils.py +46 -65
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_agent_wiring.py +8 -58
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_bootstrap_settings.py +33 -262
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_compaction_restore.py +3 -25
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_composer_input.py +110 -133
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_focus_behavior.py +2 -2
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_goal_command.py +11 -27
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_image_vision_warning.py +5 -26
- kolega_code-0.16.0/tests/cli/test_app_lsp_settings_status.py +132 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_misc_commands.py +6 -57
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_model_effort_commands.py +17 -150
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_model_switch_vision.py +1 -58
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_navigation_commands.py +6 -58
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_permission_prompts.py +2 -59
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_persistence_history.py +34 -145
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_plan_lifecycle.py +7 -142
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_planning_questions.py +17 -132
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_planning_restore.py +4 -64
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_entries.py +5 -62
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_errors.py +8 -62
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_selection.py +6 -82
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_status.py +5 -40
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_streaming.py +10 -82
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_tools.py +71 -120
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_skill_commands.py +5 -56
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_status_modes.py +24 -218
- kolega_code-0.16.0/tests/cli/test_app_tmux_shortcuts.py +193 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_ask_goal.py +4 -18
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_main.py +18 -86
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_settings.py +34 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_skills.py +134 -1
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_themes.py +1 -16
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_tui_stylesheet.py +3 -42
- kolega_code-0.16.0/tests/services/lsp/_fake_server.py +637 -0
- kolega_code-0.16.0/tests/services/lsp/conftest.py +168 -0
- kolega_code-0.16.0/tests/services/lsp/test_client.py +351 -0
- kolega_code-0.16.0/tests/services/lsp/test_detector.py +76 -0
- kolega_code-0.16.0/tests/services/lsp/test_diagnostics.py +166 -0
- kolega_code-0.16.0/tests/services/lsp/test_edits.py +161 -0
- kolega_code-0.16.0/tests/services/lsp/test_integration.py +387 -0
- kolega_code-0.16.0/tests/services/lsp/test_lsp_edit_tool_integration.py +79 -0
- kolega_code-0.16.0/tests/services/lsp/test_manager.py +375 -0
- kolega_code-0.16.0/tests/services/lsp/test_project_config.py +153 -0
- kolega_code-0.16.0/tests/services/lsp/test_registry.py +133 -0
- kolega_code-0.16.0/tests/services/lsp/test_trust.py +113 -0
- kolega_code-0.16.0/tests/services/test_snapshots.py +138 -0
- kolega_code-0.16.0/tests/test_agent_config_serialization.py +74 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/uv.lock +104 -104
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.env.example +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.githooks/pre-commit +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.github/workflows/ci.yml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.github/workflows/docs.yml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.github/workflows/release.yml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/.pre-commit-config.yaml +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/LICENSE +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/README.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/RELEASING.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/SECURITY.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/.gitignore +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/README.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/package-lock.json +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/package.json +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/public/favicon.svg +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/assets/demo.gif +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/assets/kolega-dark.svg +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/assets/kolega-light.svg +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/cli/ask.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/cli/doctor.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/cli/overview.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/cli/sessions.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/concepts/agents.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/concepts/how-it-works.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/configuration/environment-variables.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/configuration/mcp.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/configuration/prompt-overrides.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/configuration/settings-and-api-keys.mdx +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/configuration/sign-in-with-chatgpt.mdx +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/getting-started/installation.mdx +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/getting-started/quick-start.mdx +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/goal.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/hooks.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/index.mdx +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/skills.mdx +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/troubleshooting/diagnostics.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/tui/modes.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content/docs/tui/sessions-and-resume.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/content.config.ts +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/src/styles/brand.css +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/docs/tsconfig.json +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/baseagent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/events.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/client.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/run_tests.sh +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/scripts/bench_hotpaths.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/scripts/check-dev-hooks.sh +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/scripts/install-kolega-code.sh +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/scripts/setup-dev.sh +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/compaction_helpers.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/conftest.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/_token_counting_utils.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_anthropic_local_token_counting_incremental.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_anthropic_token_counting.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_billing_openai_cache.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_chatgpt_live.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_chatgpt_oauth_auth_config.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_chatgpt_oauth_conversion.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_chatgpt_oauth_provider.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_chatgpt_oauth_provider_generate.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_chatgpt_oauth_streaming.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_client.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_client_live.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_client_runtime.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_dashscope_mapping.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_error_boundary.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_exceptions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_google_thought_signature.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_google_tool_signature_live.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_instrumented_client.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_instrumented_client_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_instrumented_client_stream.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_langfuse_normalization.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_live_providers.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_message_conversion.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_cached_tokens.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_cached_tokens_stream.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_message_conversion.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_responses_provider.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_stream_accumulation.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_token_counting.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_openai_token_counting_incremental.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_provider_usage_mapping.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_streaming_timeouts.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_thinking_effort.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/llm/test_tool_execution_ids.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/orchestration/test_orchestration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_browser.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_browser_console_logs.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_browser_content.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_browser_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_browser_parity.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_file_system.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_file_system_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_file_system_path.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_local_file_system.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_sandbox_terminal_input.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_terminal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_terminal_buffer.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/services/test_terminal_state_serializer.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_anthropic_history_validation.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_compaction.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_effective_history.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_history_serialization.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_prompt_context.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_role_overrides.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_runtime.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_tool_call_repair.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_tool_call_repair_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_base_agent_tool_execution.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_coder_attachments.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_coder_prompt_extensions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_commands.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_compaction_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_compaction_persistence.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_compaction_subagent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_compaction_tui_events.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_compress_command.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_compression.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_conversation_compaction.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_duplicate_tool_results.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_empty_message_handling.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_event_emitter.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_general_agent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_gigacode_gating.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_goal.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_goal_evaluate.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_history_adapter_thinking.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_history_image_blocks.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_hooks_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_html.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_image_compat.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_parallel_tool_calls.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_planning_agent.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_prompt_dump.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_prompt_overrides.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_prompt_provider.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_read_image_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tool_collection_builtin_dispatch.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tool_collection_extensions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tool_collection_initialization.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tool_collection_memory.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/test_tools.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_agent_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_base_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_browser_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_build_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_edit_preview.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_glob_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_glob_tool_sandbox_parity.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_list_directory_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_read_file_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_search_codebase_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_terminal_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_think_hard_integration.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_think_hard_streaming.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_think_hard_streaming_content.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_think_hard_streaming_errors.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_think_hard_streaming_updates.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_web_fetch_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_web_search_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/agent/tool_backend/test_workflow_tool.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/auth/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/auth/test_chatgpt_oauth.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/auth/test_tokens.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_changes_inspector.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_composer_commands.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_conversation_rendering.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_diagnostics.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_mention_dropdown.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_modes_planning.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_scroll.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_rendering_terminal_logs.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_session_diff_async.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_slash_dropdown.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_app_sub_agents_workflows.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_cli_config.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_clipboard_image.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_connection.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_diagnostics.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_file_index.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_mcp_cli.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_mcp_settings_formatting.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_mentions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_plan_artifacts.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_provider_registry.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_session_diff.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_session_store.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_slash_commands.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_sub_agent_stream_accumulation.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_terminal_display.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_transcript_streaming_render.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/cli/test_updater.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/conftest.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/hooks/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/hooks/test_hooks.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/mcp/test_config_state_tools.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/test_mcp_permissions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/test_mcp_transport.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/tools/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/tools/test_definitions.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/utils/__init__.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/utils/test_images.py +0 -0
- {kolega_code-0.14.0 → kolega_code-0.16.0}/tests/utils/test_images_ascii.py +0 -0
|
@@ -6,6 +6,51 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.16.0 - 2026-07-09
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added support for xAI Grok 4.5 (`grok-4.5`): 500K-token context, vision input,
|
|
14
|
+
and `low`/`medium`/`high` reasoning effort. Selectable in the Settings UI,
|
|
15
|
+
`/model` picker, CLI flags, and env vars; now the default `xai` model.
|
|
16
|
+
- Send a stable `x-grok-conv-id` header on xAI Chat Completions requests so
|
|
17
|
+
multi-turn agent loops pin to a cache-warm server (xAI prompt-caching guidance).
|
|
18
|
+
- Added session-scoped workspace snapshots for agent file mutations: `snapshot`
|
|
19
|
+
(list/show/create/restore, including `snapshot_id='latest'` undo) and `resolve`
|
|
20
|
+
for applying or discarding pending `lsp_edit` preview actions. Restore refuses
|
|
21
|
+
on post-snapshot drift unless `force=true`.
|
|
22
|
+
- Improved TUI usability inside tmux/screen when Shift-modified keys never reach
|
|
23
|
+
the app: `/attach` with no path pastes an image from the system clipboard,
|
|
24
|
+
`Alt+V` is a portable image-paste binding alongside `Ctrl+Shift+V`, startup
|
|
25
|
+
help highlights `Ctrl+J` / `/plan` / `/build` fallbacks, and a one-time
|
|
26
|
+
startup hint appears under tmux. Documented optional tmux extended-keys config
|
|
27
|
+
under Troubleshooting.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Prevented a TUI crash when pasting long multi-line text into the composer
|
|
32
|
+
(`OSError: File name too long` from treating paste content as a path).
|
|
33
|
+
- Stopped advertising host lifecycle `initialize` as a model-callable tool while
|
|
34
|
+
keeping it available for CLI/TUI startup (LSP setup).
|
|
35
|
+
- Bumped `lxml-html-clean` to 0.4.5 (and transitive `lxml` to 6.1.1) to clear
|
|
36
|
+
GHSA-4jhm-jv67-739f from the dependency audit.
|
|
37
|
+
|
|
38
|
+
## 0.15.0 - 2026-07-07
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- Added Language Server Protocol (LSP) integration with an agent-callable
|
|
43
|
+
read-only `lsp` tool (diagnostics, go-to-definition, references, hover,
|
|
44
|
+
document/workspace symbols, and status) and a trusted `lsp_edit` tool for
|
|
45
|
+
rename, formatting, and code actions. The `edit`, `multi_edit`, and `write`
|
|
46
|
+
tools now append LSP diagnostics to their results, with a `/lsp` status
|
|
47
|
+
command, detected-language status in the TUI wordmark, and a Settings toggle.
|
|
48
|
+
- Added bounded skill metadata rendering with a context-aware token budget.
|
|
49
|
+
The prompt catalog now uses skill name and description only, descriptions are
|
|
50
|
+
truncated before skills are omitted, and `list_skills` is queryable with
|
|
51
|
+
`max_results`.
|
|
52
|
+
- Documented composable workflow shapes in the Gigacode orchestration guide.
|
|
53
|
+
|
|
9
54
|
## 0.14.0 - 2026-07-03
|
|
10
55
|
|
|
11
56
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.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/
|
|
@@ -234,7 +234,7 @@ Requires-Dist: google-genai==2.0.1
|
|
|
234
234
|
Requires-Dist: httpx==0.28.1
|
|
235
235
|
Requires-Dist: jinja2==3.1.6
|
|
236
236
|
Requires-Dist: langfuse==3.14.5
|
|
237
|
-
Requires-Dist: lxml-html-clean==0.4.
|
|
237
|
+
Requires-Dist: lxml-html-clean==0.4.5
|
|
238
238
|
Requires-Dist: mcp>=1.21.2
|
|
239
239
|
Requires-Dist: nest-asyncio==1.6.0
|
|
240
240
|
Requires-Dist: openai==1.109.1
|
|
@@ -68,6 +68,10 @@ export default defineConfig({
|
|
|
68
68
|
label: "MCP Servers",
|
|
69
69
|
slug: "configuration/mcp",
|
|
70
70
|
},
|
|
71
|
+
{
|
|
72
|
+
label: "Language Servers",
|
|
73
|
+
slug: "configuration/lsp",
|
|
74
|
+
},
|
|
71
75
|
{
|
|
72
76
|
label: "Environment Variables",
|
|
73
77
|
slug: "configuration/environment-variables",
|
|
@@ -116,6 +120,10 @@ export default defineConfig({
|
|
|
116
120
|
label: "Diagnostics & Bug Reports",
|
|
117
121
|
slug: "troubleshooting/diagnostics",
|
|
118
122
|
},
|
|
123
|
+
{
|
|
124
|
+
label: "Terminal & tmux shortcuts",
|
|
125
|
+
slug: "troubleshooting/terminal-tmux",
|
|
126
|
+
},
|
|
119
127
|
],
|
|
120
128
|
},
|
|
121
129
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage:
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 79.93%"><title>coverage: 79.93%</title><filter id="blur"><feGaussianBlur stdDeviation="16"/></filter><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#67ac09"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="315" y="150" fill-opacity=".8" filter="url(#blur)" textLength="510">coverage</text><text x="315" y="150" fill-opacity=".3" textLength="510">coverage</text></g><text x="315" y="140" textLength="510">coverage</text></g><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="865" y="150" fill-opacity=".8" filter="url(#blur)" textLength="430">79.93%</text><text x="865" y="150" fill-opacity=".3" textLength="430">79.93%</text></g><text x="865" y="140" textLength="430">79.93%</text></g></g></svg>
|
|
@@ -18,6 +18,9 @@ Read, search, and edit your project:
|
|
|
18
18
|
- `read_entire_file`, `read_file_section` — read file contents.
|
|
19
19
|
- `find_files_by_pattern` — glob-based file search.
|
|
20
20
|
- `search_codebase` — search the codebase by regular expression (ripgrep/grep), e.g. `foo|bar`.
|
|
21
|
+
- `lsp` — read diagnostics, symbols, definitions,
|
|
22
|
+
references, hover text, call hierarchy, and code action metadata from
|
|
23
|
+
[configured language servers](../../configuration/lsp/).
|
|
21
24
|
- Create and edit files — create new files and apply precise edits.
|
|
22
25
|
|
|
23
26
|
### Terminal
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Language servers
|
|
3
|
+
description: Configure LSP diagnostics, code intelligence, and trusted LSP edits.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Kolega Code can start local Language Server Protocol (LSP) servers for detected
|
|
7
|
+
project languages. LSP is enabled by default and is used for:
|
|
8
|
+
|
|
9
|
+
- diagnostics after `edit`, `multi_edit`, and `write`;
|
|
10
|
+
- the generic read-only `lsp` tool;
|
|
11
|
+
- the permission-gated `lsp_edit` tool;
|
|
12
|
+
- `/lsp` and the Settings tab status display.
|
|
13
|
+
|
|
14
|
+
The `lsp` tool remains read-only. Mutating LSP operations are exposed through
|
|
15
|
+
`lsp_edit`, which is treated like `edit`, `multi_edit`, and `write` for
|
|
16
|
+
permission prompts. Kolega Code does not expose raw arbitrary LSP requests.
|
|
17
|
+
|
|
18
|
+
## Tool operations
|
|
19
|
+
|
|
20
|
+
The generic `lsp` tool supports:
|
|
21
|
+
|
|
22
|
+
- `diagnostics` for file errors, warnings, and hints;
|
|
23
|
+
- `definition`, `type_definition`, `implementation`, `references`, and `hover`;
|
|
24
|
+
- `document_symbols` and `workspace_symbols`;
|
|
25
|
+
- `call_hierarchy` for incoming and outgoing calls;
|
|
26
|
+
- `code_actions` to list available quick fixes and refactors without applying them;
|
|
27
|
+
- `status`, `capabilities`, and `reload`.
|
|
28
|
+
|
|
29
|
+
Position operations use `path`, a 1-based `line`, and a `symbol` on that line.
|
|
30
|
+
Use `symbol#2` to select the second occurrence of a symbol on the same line.
|
|
31
|
+
`code_actions` includes an `action_id` for each action so a later `lsp_edit`
|
|
32
|
+
call can apply the exact server-provided action.
|
|
33
|
+
|
|
34
|
+
The mutating `lsp_edit` tool supports:
|
|
35
|
+
|
|
36
|
+
- `rename` for symbol rename;
|
|
37
|
+
- `rename_file` for file moves with `workspace/willRenameFiles` and
|
|
38
|
+
`workspace/didRenameFiles` notifications;
|
|
39
|
+
- `format_document` and `format_range`;
|
|
40
|
+
- `apply_code_action` by `action_id`, title/query, or index.
|
|
41
|
+
|
|
42
|
+
`lsp_edit` applies server-provided `WorkspaceEdit` payloads only. If the server
|
|
43
|
+
does not advertise or return an edit for an operation, Kolega Code reports that
|
|
44
|
+
the operation is unsupported instead of constructing a manual fallback edit.
|
|
45
|
+
Pass `apply: false` to preview the LSP edit without writing files.
|
|
46
|
+
|
|
47
|
+
## Project configuration
|
|
48
|
+
|
|
49
|
+
Create `<project>/.kolega/lsp.json` to override LSP behavior for a repository.
|
|
50
|
+
Project LSP config is trusted input because custom servers can execute local
|
|
51
|
+
binaries. Kolega Code ignores this file unless the session is started with
|
|
52
|
+
`--trust-lsp` or the project is listed in trusted LSP projects in user settings.
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"enabled": true,
|
|
57
|
+
"auto_diagnostics_on_edit": true,
|
|
58
|
+
"max_diagnostics": 20,
|
|
59
|
+
"auto_fallback": true,
|
|
60
|
+
"prompt_on_missing": true,
|
|
61
|
+
"disabled_languages": [],
|
|
62
|
+
"preferences": {
|
|
63
|
+
"python": "pyright"
|
|
64
|
+
},
|
|
65
|
+
"diagnostic_servers": ["ruff-lsp"],
|
|
66
|
+
"initialization_options": {
|
|
67
|
+
"pyright": {
|
|
68
|
+
"python": {
|
|
69
|
+
"analysis": {
|
|
70
|
+
"typeCheckingMode": "basic"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"workspace_configuration": {
|
|
76
|
+
"pyright": {
|
|
77
|
+
"python": {
|
|
78
|
+
"analysis": {
|
|
79
|
+
"typeCheckingMode": "basic"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"servers": {
|
|
85
|
+
"custom-python-lsp": {
|
|
86
|
+
"bin": "custom-lsp",
|
|
87
|
+
"args": ["--stdio"],
|
|
88
|
+
"languages": ["python"],
|
|
89
|
+
"env": {
|
|
90
|
+
"CUSTOM_LSP_MODE": "project"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The project file cannot change the user's global LSP kill switch: `enabled` is
|
|
98
|
+
accepted in user settings, but ignored from `.kolega/lsp.json`.
|
|
99
|
+
|
|
100
|
+
`preferences` chooses the preferred server for a language. If
|
|
101
|
+
`auto_fallback` is `false`, Kolega Code checks only the preferred server before
|
|
102
|
+
reporting the language as missing. If it is `true`, installed alternatives can be
|
|
103
|
+
used automatically.
|
|
104
|
+
|
|
105
|
+
`diagnostic_servers` starts additional servers for diagnostics alongside the
|
|
106
|
+
primary server. This is useful for setups such as Pyright plus Ruff.
|
|
107
|
+
|
|
108
|
+
`initialization_options` is sent in the LSP `initialize` request. Some servers
|
|
109
|
+
also ask for `workspace/configuration`; use `workspace_configuration` for those
|
|
110
|
+
responses, keyed first by server name and then by requested section.
|
|
111
|
+
|
|
112
|
+
## Status and troubleshooting
|
|
113
|
+
|
|
114
|
+
Run `/lsp` in the TUI to see detected languages, missing servers, active
|
|
115
|
+
sessions, and recent diagnostic counts. The Settings tab has a global LSP toggle;
|
|
116
|
+
changing it requires restarting the agent session.
|
|
117
|
+
|
|
118
|
+
If a server is missing, `/lsp` shows the server name and install guidance from
|
|
119
|
+
Kolega Code's bundled registry. You can suppress a language with
|
|
120
|
+
`disabled_languages` or point it at a custom server with `servers` and
|
|
121
|
+
`preferences`.
|
|
@@ -184,6 +184,8 @@ models in the TUI.
|
|
|
184
184
|
| Ollama Cloud `gpt-oss:*` | `low`, `medium`, `high` | `medium` |
|
|
185
185
|
| Google `gemini-2.5-pro` | `auto`, `low`, `medium`, `high` | `medium` |
|
|
186
186
|
| OpenAI reasoning models | `low`, `medium`, `high` | `medium` |
|
|
187
|
+
| xAI `grok-4.5` | `low`, `medium`, `high` | `medium` |
|
|
188
|
+
| xAI `grok-4.3` | `none`, `low`, `medium`, `high` | `low` |
|
|
187
189
|
|
|
188
190
|
## Check what's active
|
|
189
191
|
|
|
@@ -34,6 +34,9 @@ can:
|
|
|
34
34
|
modules, services, issues, or review targets.
|
|
35
35
|
- **Run judge panels** — ask several agents to evaluate a change or plan from
|
|
36
36
|
different angles, then reconcile disagreements.
|
|
37
|
+
- **Compose workflow shapes** — use sweeps, matrices, funnels, pipelines, triage
|
|
38
|
+
loops, and adversarial reviews when the task needs more structure than simple
|
|
39
|
+
parallelism.
|
|
37
40
|
- **Preserve artifacts** — save the workflow script, result files, transcripts, raw
|
|
38
41
|
JSONL, and resume journal so the run is inspectable after the fact.
|
|
39
42
|
|
|
@@ -99,6 +102,13 @@ findings = await parallel([
|
|
|
99
102
|
return findings
|
|
100
103
|
```
|
|
101
104
|
|
|
105
|
+
The stage names in a workflow are not fixed runtime types. The agent composes
|
|
106
|
+
shapes from the task: a broad audit might map surfaces, sweep reviewers across
|
|
107
|
+
them, verify findings adversarially, and synthesize; a planning task might funnel
|
|
108
|
+
unknowns through research and option comparison; a debugging task might cluster
|
|
109
|
+
failures, investigate root causes, test targeted fixes, and run a regression
|
|
110
|
+
review. All of those shapes are built from the same primitives above.
|
|
111
|
+
|
|
102
112
|
<Aside type="note">
|
|
103
113
|
Workflows are deterministic and **resumable**. Each run is saved under Kolega
|
|
104
114
|
Code's state directory (`workflows/<run-id>/`) with its script, full result files,
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Terminal & tmux shortcuts
|
|
3
|
+
description: Why Shift chords fail in tmux/screen and the portable fallbacks Kolega Code supports.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Kolega Code’s TUI uses some Shift-modified shortcuts (`Shift+Enter`, `Shift+Tab`,
|
|
7
|
+
`Ctrl+Shift+V`). In a modern terminal with the [Kitty keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/),
|
|
8
|
+
those chords reach the app. Inside **tmux** or **GNU screen**, the multiplexer
|
|
9
|
+
often sits between the terminal and the app and either drops modifiers or
|
|
10
|
+
never forwards the extended key sequences — so Shift chords look like plain
|
|
11
|
+
keys, or never arrive at all.
|
|
12
|
+
|
|
13
|
+
Kolega Code cannot invent modifier information the terminal never sends. Instead
|
|
14
|
+
it provides **portable fallbacks** that work without Shift, plus optional tmux
|
|
15
|
+
config if you want the original chords restored.
|
|
16
|
+
|
|
17
|
+
## Portable shortcuts
|
|
18
|
+
|
|
19
|
+
| Action | Preferred (capable terminals) | Portable fallback |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| Send prompt | `Enter` | — |
|
|
22
|
+
| Insert newline | `Shift+Enter` | `Ctrl+J` or `Ctrl+Enter` |
|
|
23
|
+
| Toggle Plan ⇄ Build | `Shift+Tab` | `/plan` or `/build` |
|
|
24
|
+
| Paste image from system clipboard | `Ctrl+Shift+V` | `Alt+V` (Option+V on macOS when the terminal treats Option as Meta) or `/attach` with no path |
|
|
25
|
+
| Attach image from a file | — | `/attach <path>` or `@image.png` |
|
|
26
|
+
|
|
27
|
+
On session start inside tmux/screen, the startup block prints a short reminder
|
|
28
|
+
of these fallbacks.
|
|
29
|
+
|
|
30
|
+
### Image paste notes
|
|
31
|
+
|
|
32
|
+
- `/attach` with **no path** reads an image from the **system** clipboard (same
|
|
33
|
+
path as `Ctrl+Shift+V` / `Alt+V`). This is the most reliable option under
|
|
34
|
+
plain tmux.
|
|
35
|
+
- Clipboard image reading uses host tools independent of tmux:
|
|
36
|
+
- **macOS:** `osascript` (built-in), or `pngpaste` if installed
|
|
37
|
+
- **Linux:** `xclip` or `wl-paste`
|
|
38
|
+
- **Windows / WSL:** PowerShell clipboard APIs
|
|
39
|
+
- If Option+V types a special character (e.g. `√`) instead of pasting an image,
|
|
40
|
+
your terminal is not sending Alt as a modifier. Prefer `/attach`, or enable
|
|
41
|
+
“Option as Meta” / “Left Option key acts as +Esc” in the terminal settings.
|
|
42
|
+
|
|
43
|
+
## Optional: restore Shift+Enter in tmux
|
|
44
|
+
|
|
45
|
+
With **tmux 3.2+** and an outer terminal that supports extended keys, add to
|
|
46
|
+
`~/.tmux.conf`:
|
|
47
|
+
|
|
48
|
+
```tmux
|
|
49
|
+
set -g extended-keys always
|
|
50
|
+
set -g extended-keys-format csi-u
|
|
51
|
+
set -as terminal-features 'xterm*:extkeys'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Then reload (`tmux source-file ~/.tmux.conf`) or restart tmux.
|
|
55
|
+
|
|
56
|
+
Also make sure `default-terminal` / `terminal-overrides` match the outer
|
|
57
|
+
terminal’s `$TERM` family (`xterm-256color`, `xterm-ghostty`, etc.) so the
|
|
58
|
+
`extkeys` feature actually applies.
|
|
59
|
+
|
|
60
|
+
After that, `Shift+Enter` and similar chords often work again inside Kolega Code.
|
|
61
|
+
If they still do not, keep using the portable fallbacks above.
|
|
62
|
+
|
|
63
|
+
## Related
|
|
64
|
+
|
|
65
|
+
- [Chat Composer](../../tui/composer/) — full composer key reference
|
|
66
|
+
- [Interface Tour](../../tui/interface/) — key bindings at a glance
|
|
67
|
+
- [Slash Commands](../../tui/slash-commands/) — `/attach`, `/plan`, `/build`
|
|
@@ -13,17 +13,24 @@ multi-line input, and drives the option lists the agent shows you.
|
|
|
13
13
|
| --- | --- |
|
|
14
14
|
| `Enter` | Send the prompt |
|
|
15
15
|
| `Shift+Enter` | Insert a newline (keep typing) |
|
|
16
|
-
| `Ctrl+J` | Insert a newline (
|
|
16
|
+
| `Ctrl+J` / `Ctrl+Enter` | Insert a newline (portable alternatives; prefer these inside tmux) |
|
|
17
17
|
| `Ctrl+L` | Select all composer text |
|
|
18
18
|
| `Cmd+A` / `⌘A` | Select all composer text on macOS, when forwarded by the terminal |
|
|
19
19
|
| `Ctrl+A` | Move to the start of the current line (intentionally not select-all) |
|
|
20
20
|
| `Ctrl+U` | Delete backward to the start of the line; at line start, delete the previous line |
|
|
21
|
+
| `Ctrl+Shift+V` | Paste an image from the system clipboard |
|
|
22
|
+
| `Alt+V` | Paste an image from the system clipboard (portable alternative when Shift chords fail) |
|
|
21
23
|
|
|
22
24
|
`Ctrl+L` is the portable select-all shortcut because `Ctrl+A` is preserved for
|
|
23
25
|
terminal-style line navigation. Some macOS terminal emulators reserve `Cmd+A` for
|
|
24
26
|
terminal scrollback selection before the TUI can see it; `Ctrl+L` still works in
|
|
25
27
|
the composer.
|
|
26
28
|
|
|
29
|
+
Inside **tmux** or **screen**, Shift-modified keys often never reach the app.
|
|
30
|
+
Use `Ctrl+J` for newlines and `Alt+V` or `/attach` for images. See
|
|
31
|
+
[Terminal & tmux shortcuts](../../troubleshooting/terminal-tmux/) for optional
|
|
32
|
+
tmux config to restore Shift+Enter.
|
|
33
|
+
|
|
27
34
|
## Queuing follow-up prompts
|
|
28
35
|
|
|
29
36
|
You can keep typing while the agent is still generating. Pressing `Enter` during
|
|
@@ -45,6 +52,19 @@ If you cancel the active turn with `Ctrl+C` or `Escape`, queued follow-ups are
|
|
|
45
52
|
restored into the composer instead of being silently sent. To discard pending
|
|
46
53
|
follow-ups without stopping the active turn, run [`/queue-clear`](../slash-commands/).
|
|
47
54
|
|
|
55
|
+
## Attaching images
|
|
56
|
+
|
|
57
|
+
You can attach images for vision-capable models in several ways:
|
|
58
|
+
|
|
59
|
+
| Method | How |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| System clipboard | `Ctrl+Shift+V` or `Alt+V`, or run `/attach` with no path |
|
|
62
|
+
| File path | `/attach path/to/image.png` |
|
|
63
|
+
| File mention | `@screenshot.png` (supported image extensions only) |
|
|
64
|
+
|
|
65
|
+
Use `/detach` to clear pending attachments before sending. On a non-vision
|
|
66
|
+
model, Kolega Code warns and blocks the send until you detach or switch models.
|
|
67
|
+
|
|
48
68
|
## File mentions with `@`
|
|
49
69
|
|
|
50
70
|
Type `@` to reference a file. A fuzzy-searchable dropdown of project files appears
|
|
@@ -82,14 +82,16 @@ the turn keeps running while you look around.
|
|
|
82
82
|
|
|
83
83
|
| Keys | Action |
|
|
84
84
|
| --- | --- |
|
|
85
|
-
| `Shift+Tab` | Toggle Build ⇄ Plan mode |
|
|
85
|
+
| `Shift+Tab` | Toggle Build ⇄ Plan mode (`/plan` / `/build` if Shift is unavailable) |
|
|
86
86
|
| `Ctrl+P` | Toggle shell/edit permissions between Ask ⇄ Auto |
|
|
87
87
|
| `Ctrl+O` | Show or hide the side panel |
|
|
88
88
|
| `Ctrl+G` | Open the sub-agent inspector |
|
|
89
89
|
| `Enter` | Send the prompt |
|
|
90
90
|
| `Shift+Enter` / `Ctrl+J` | Insert a newline |
|
|
91
|
+
| `Ctrl+Shift+V` / `Alt+V` | Paste an image from the system clipboard (`/attach` also works) |
|
|
91
92
|
| `Ctrl+C` / `Escape` | Cancel the current generation |
|
|
92
93
|
| `Ctrl+Q` | Save the session and quit |
|
|
93
94
|
|
|
94
95
|
A complete composer-and-completion key reference is in
|
|
95
|
-
[Chat Composer](../composer/).
|
|
96
|
+
[Chat Composer](../composer/). If Shift chords fail inside tmux, see
|
|
97
|
+
[Terminal & tmux shortcuts](../../troubleshooting/terminal-tmux/).
|
|
@@ -34,6 +34,8 @@ These control the app and your session.
|
|
|
34
34
|
| --- | --- |
|
|
35
35
|
| `/skills` | List available Agent Skills |
|
|
36
36
|
| `/init` | Create or update `AGENTS.md` for this repository |
|
|
37
|
+
| `/attach` | Attach an image: clipboard if no path, or `/attach <path>` for a file |
|
|
38
|
+
| `/detach` | Remove pending image attachments |
|
|
37
39
|
| `/plan` | Switch to [Plan mode](../modes/) |
|
|
38
40
|
| `/build` | Switch to [Build mode](../modes/) |
|
|
39
41
|
| `/sidebar` | Show or hide the side panel |
|
|
@@ -88,6 +88,23 @@ without running the script. Required keys: `name`, `description`. Optional `phas
|
|
|
88
88
|
|
|
89
89
|
### Quality patterns to compose
|
|
90
90
|
|
|
91
|
+
- Surface map: before a broad run, map the real work surface — files, modules,
|
|
92
|
+
services, risks, unknowns, owner boundaries, or test targets — then fan out over
|
|
93
|
+
that map instead of guessing stages from the user's wording.
|
|
94
|
+
- Shard-and-sweep: split a large surface by package/module/service/concern, send
|
|
95
|
+
focused agents across the shards, then deduplicate and synthesize.
|
|
96
|
+
- Cross-cut matrix: review the same target set across dimensions such as correctness,
|
|
97
|
+
security, performance, UX, compatibility, test coverage, and migration risk.
|
|
98
|
+
- Research funnel: map unknowns → research in parallel → compare options → produce
|
|
99
|
+
a decision-ready plan. In plan mode this is the main workflow shape.
|
|
100
|
+
- Hypothesis tournament: generate several plausible explanations or approaches,
|
|
101
|
+
gather evidence for each, score them with parallel judges, then choose.
|
|
102
|
+
- Implementation pipeline: map disjoint workstreams → implement with coder agents →
|
|
103
|
+
verify each stream → integrate and run final checks yourself.
|
|
104
|
+
- Migration factory: inventory affected areas → classify risk → batch independent
|
|
105
|
+
edits → run targeted checks → compatibility review.
|
|
106
|
+
- Failure triage loop: collect failures → cluster by likely root cause → investigate
|
|
107
|
+
clusters → fix isolated causes → rerun targeted tests.
|
|
91
108
|
- Adversarial verify: for each finding, spawn N skeptics prompted to REFUTE it; keep it
|
|
92
109
|
only if a majority fail to refute. Prevents plausible-but-wrong findings surviving.
|
|
93
110
|
- Loop-until-dry: for unknown-size discovery, keep spawning finders until K consecutive
|
|
@@ -96,6 +113,8 @@ without running the script. Required keys: `name`, `description`. Optional `phas
|
|
|
96
113
|
judges, synthesize from the winner.
|
|
97
114
|
- Loop-until-budget: `while budget.total and budget.remaining() > 50_000: ...` to scale
|
|
98
115
|
depth to the token ceiling.
|
|
116
|
+
- Synthesis gate: after any broad fan-out, merge duplicates, rank confidence, identify
|
|
117
|
+
unresolved gaps, and decide whether another loop is worth the remaining budget.
|
|
99
118
|
|
|
100
119
|
### Implementing a plan (build mode)
|
|
101
120
|
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import re
|
|
2
4
|
from dataclasses import dataclass
|
|
3
|
-
from typing import Callable
|
|
5
|
+
from typing import TYPE_CHECKING, Callable, Optional
|
|
4
6
|
|
|
5
7
|
from .base_tool import BaseTool
|
|
6
8
|
from .edit_preview import build_diff_preview, build_head_preview
|
|
7
9
|
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from kolega_code.services.lsp import LspManager
|
|
12
|
+
from kolega_code.services.snapshots import SnapshotService
|
|
13
|
+
|
|
8
14
|
|
|
9
15
|
_BLOCK_PATTERN = re.compile(r"<<<<<<< SEARCH\r?\n(.*?)\r?\n=======\r?\n(.*?)\r?\n>>>>>>> REPLACE", re.DOTALL)
|
|
10
16
|
_SMART_PUNCTUATION_TRANSLATION = str.maketrans(
|
|
@@ -38,6 +44,17 @@ class ResolvedReplacement:
|
|
|
38
44
|
|
|
39
45
|
|
|
40
46
|
class EditTool(BaseTool):
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
*args,
|
|
50
|
+
lsp_manager: Optional["LspManager"] = None,
|
|
51
|
+
snapshot_service: Optional["SnapshotService"] = None,
|
|
52
|
+
**kwargs,
|
|
53
|
+
) -> None:
|
|
54
|
+
super().__init__(*args, **kwargs)
|
|
55
|
+
self._lsp_manager = lsp_manager
|
|
56
|
+
self._snapshot_service = snapshot_service
|
|
57
|
+
|
|
41
58
|
async def edit(self, path: str, block: str) -> str:
|
|
42
59
|
"""
|
|
43
60
|
Edit a file using a single search and replace block.
|
|
@@ -54,7 +71,11 @@ class EditTool(BaseTool):
|
|
|
54
71
|
error_msg = "Multiple search and replace blocks provided. Use multi_edit for multiple blocks."
|
|
55
72
|
await self.log_error(error_msg, sender=self.caller.agent_name)
|
|
56
73
|
raise ValueError(error_msg)
|
|
57
|
-
|
|
74
|
+
result = await self._edit_blocks(path, parsed_blocks, tool_name="edit")
|
|
75
|
+
lsp_diags = await self._maybe_append_lsp_diagnostics(path)
|
|
76
|
+
if lsp_diags:
|
|
77
|
+
result += lsp_diags
|
|
78
|
+
return result
|
|
58
79
|
|
|
59
80
|
async def multi_edit(self, path: str, blocks: str) -> str:
|
|
60
81
|
"""
|
|
@@ -71,7 +92,11 @@ class EditTool(BaseTool):
|
|
|
71
92
|
A short summary of the update
|
|
72
93
|
"""
|
|
73
94
|
parsed_blocks = self._parse_blocks(blocks)
|
|
74
|
-
|
|
95
|
+
result = await self._edit_blocks(path, parsed_blocks, tool_name="multi_edit")
|
|
96
|
+
lsp_diags = await self._maybe_append_lsp_diagnostics(path)
|
|
97
|
+
if lsp_diags:
|
|
98
|
+
result += lsp_diags
|
|
99
|
+
return result
|
|
75
100
|
|
|
76
101
|
async def write(self, path: str, content: str) -> str:
|
|
77
102
|
"""
|
|
@@ -98,8 +123,6 @@ class EditTool(BaseTool):
|
|
|
98
123
|
old_content = None
|
|
99
124
|
|
|
100
125
|
parent_dir = self.filesystem.get_parent(path)
|
|
101
|
-
if parent_dir and parent_dir != "." and not self.filesystem.exists(parent_dir):
|
|
102
|
-
self.filesystem.create_directory(parent_dir)
|
|
103
126
|
|
|
104
127
|
# Preserve the file's dominant line ending on overwrite; new files
|
|
105
128
|
# keep the line endings the caller provided (typically LF).
|
|
@@ -107,7 +130,17 @@ class EditTool(BaseTool):
|
|
|
107
130
|
line_ending = self._detect_dominant_line_ending(path, old_content)
|
|
108
131
|
content = self._normalize_line_endings(content, line_ending)
|
|
109
132
|
|
|
110
|
-
|
|
133
|
+
def _write() -> None:
|
|
134
|
+
if parent_dir and parent_dir != "." and not self.filesystem.exists(parent_dir):
|
|
135
|
+
self.filesystem.create_directory(parent_dir)
|
|
136
|
+
self.filesystem.write_text(path, content)
|
|
137
|
+
|
|
138
|
+
self._record_snapshot_mutation(
|
|
139
|
+
tool_name="write",
|
|
140
|
+
reason=f"write {path}",
|
|
141
|
+
paths=self._snapshot_paths_for_write(path),
|
|
142
|
+
mutate=_write,
|
|
143
|
+
)
|
|
111
144
|
|
|
112
145
|
preview = (
|
|
113
146
|
build_diff_preview(old_content, content, path)
|
|
@@ -119,7 +152,11 @@ class EditTool(BaseTool):
|
|
|
119
152
|
tool_call_id=getattr(self.caller, "current_tool_execution_id", None),
|
|
120
153
|
tool_name="write",
|
|
121
154
|
)
|
|
122
|
-
|
|
155
|
+
result = f"Wrote {path}"
|
|
156
|
+
lsp_diags = await self._maybe_append_lsp_diagnostics(path)
|
|
157
|
+
if lsp_diags:
|
|
158
|
+
result += lsp_diags
|
|
159
|
+
return result
|
|
123
160
|
except PermissionError:
|
|
124
161
|
error_msg = f"Permission denied when writing to file: {path}"
|
|
125
162
|
await self.log_error(error_msg, sender=self.caller.agent_name)
|
|
@@ -159,7 +196,12 @@ class EditTool(BaseTool):
|
|
|
159
196
|
blocked_msg = self._enforce_vibe_edit_policy(path)
|
|
160
197
|
if blocked_msg:
|
|
161
198
|
return blocked_msg
|
|
162
|
-
self.
|
|
199
|
+
self._record_snapshot_mutation(
|
|
200
|
+
tool_name=tool_name,
|
|
201
|
+
reason=f"{tool_name} {path}",
|
|
202
|
+
paths=[path],
|
|
203
|
+
mutate=lambda: self.filesystem.write_text(path, normalized_updated),
|
|
204
|
+
)
|
|
163
205
|
|
|
164
206
|
await self.send_edit_preview(
|
|
165
207
|
build_diff_preview(original_content, normalized_updated, path),
|
|
@@ -202,6 +244,33 @@ class EditTool(BaseTool):
|
|
|
202
244
|
)
|
|
203
245
|
return parsed_blocks
|
|
204
246
|
|
|
247
|
+
def _record_snapshot_mutation(
|
|
248
|
+
self,
|
|
249
|
+
*,
|
|
250
|
+
tool_name: str,
|
|
251
|
+
reason: str,
|
|
252
|
+
paths: list[str],
|
|
253
|
+
mutate: Callable[[], None],
|
|
254
|
+
) -> None:
|
|
255
|
+
if self._snapshot_service is None or not self._snapshot_service.can_snapshot_paths(paths):
|
|
256
|
+
mutate()
|
|
257
|
+
return
|
|
258
|
+
self._snapshot_service.record_mutation(
|
|
259
|
+
tool_name=tool_name,
|
|
260
|
+
tool_call_id=getattr(self.caller, "current_tool_execution_id", None),
|
|
261
|
+
reason=reason,
|
|
262
|
+
paths=paths,
|
|
263
|
+
mutate=mutate,
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
def _snapshot_paths_for_write(self, path: str) -> list[str]:
|
|
267
|
+
paths = [path]
|
|
268
|
+
parent = self.filesystem.get_parent(path)
|
|
269
|
+
while parent and parent != "." and not self.filesystem.exists(parent):
|
|
270
|
+
paths.append(parent)
|
|
271
|
+
parent = self.filesystem.get_parent(parent)
|
|
272
|
+
return paths
|
|
273
|
+
|
|
205
274
|
def _resolve_replacement(self, content: str, block: SearchReplaceBlock) -> ResolvedReplacement:
|
|
206
275
|
passes: list[tuple[str, Callable[[str, str], list[tuple[int, int]]]]] = [
|
|
207
276
|
("exact", self._exact_spans),
|
|
@@ -379,3 +448,35 @@ class EditTool(BaseTool):
|
|
|
379
448
|
if target == "\n":
|
|
380
449
|
return text
|
|
381
450
|
return text.replace("\n", target)
|
|
451
|
+
|
|
452
|
+
async def _maybe_append_lsp_diagnostics(self, path: str) -> str:
|
|
453
|
+
"""Query LSP diagnostics for *path* and format them for appending to the tool result.
|
|
454
|
+
|
|
455
|
+
Returns an empty string if LSP is unavailable, disabled, or produces no diagnostics.
|
|
456
|
+
"""
|
|
457
|
+
if self._lsp_manager is None or not self._lsp_manager.enabled:
|
|
458
|
+
return ""
|
|
459
|
+
|
|
460
|
+
if not self._lsp_manager._config.auto_diagnostics_on_edit:
|
|
461
|
+
return ""
|
|
462
|
+
|
|
463
|
+
if not self._lsp_manager._initialized:
|
|
464
|
+
await self._lsp_manager.initialize()
|
|
465
|
+
|
|
466
|
+
server_name = self._lsp_manager.server_for_path(path)
|
|
467
|
+
if server_name is None:
|
|
468
|
+
return ""
|
|
469
|
+
|
|
470
|
+
try:
|
|
471
|
+
diagnostics = await self._lsp_manager.get_fresh_diagnostics(path)
|
|
472
|
+
except Exception:
|
|
473
|
+
return ""
|
|
474
|
+
|
|
475
|
+
if not diagnostics:
|
|
476
|
+
return ""
|
|
477
|
+
|
|
478
|
+
from kolega_code.services.lsp import format_diagnostics
|
|
479
|
+
|
|
480
|
+
# Blank-line separator so the diagnostics block reads as a distinct section
|
|
481
|
+
# after the result line (e.g. "Edited foo.py\n\nLSP diagnostics (...)").
|
|
482
|
+
return "\n\n" + format_diagnostics(diagnostics, path, source=server_name)
|