kolega-code 0.29.0__tar.gz → 0.30.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.29.0 → kolega_code-0.30.0}/CHANGELOG.md +38 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/PKG-INFO +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/__init__.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/baseagent.py +36 -12
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/agent_tool.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tools.py +0 -6
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/config.py +11 -2
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/main.py +75 -14
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/model_catalog.py +5 -2
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/provider_registry.py +9 -2
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/slash_commands.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/theme.py +18 -18
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/agent_runtime.py +21 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/command_handlers.py +15 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/settings_panel.py +7 -2
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/config.py +5 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/client.py +18 -24
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/exceptions.py +59 -28
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/models.py +89 -25
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/anthropic.py +5 -5
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/deepseek_responses.py +5 -6
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/models.py +3 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/openai.py +4 -2
- kolega_code-0.30.0/kolega_code/llm/providers/perplexity_responses.py +107 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/responses_common.py +98 -4
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/__init__.py +3 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/deepseek.py +5 -4
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/google.py +13 -0
- kolega_code-0.30.0/kolega_code/llm/specs/catalog/perplexity_agent.py +616 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/xai.py +12 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/zai.py +12 -0
- kolega_code-0.30.0/kolega_code/llm/specs/perplexity_catalog.py +267 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/thinking.py +1 -11
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/usage.py +1 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/config.py +49 -7
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/service.py +103 -3
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/tools.py +29 -12
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/async_filesystem.py +0 -3
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/filesystem.py +0 -3
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/serializer.py +4 -13
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/terminal.py +10 -72
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/utils.py +0 -4
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/file_system.py +1 -4
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/html.py +0 -19
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/manager.py +5 -5
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/registry.py +0 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/pyproject.toml +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.0}/.gitignore +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/MIGRATION.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/README.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/RELEASING.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/messages.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/settings_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/events.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.0}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,44 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.30.0 - 2026-08-14
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added Google Gemini 3.7 Flash (`gemini-3.7-flash`): 1M-token context, 64K
|
|
14
|
+
output, vision and function calling, and `low`/`medium`/`high` thinking
|
|
15
|
+
levels. It omits Google's deprecated temperature parameter and is now the
|
|
16
|
+
default Google model.
|
|
17
|
+
- DeepSeek V4-Pro now routes to the Responses API by default (joining V4-Flash),
|
|
18
|
+
removing the model-name carve-out. Both DeepSeek models support `none`, `low`,
|
|
19
|
+
`high`, and `max` reasoning effort (`low` is new; `none` disables reasoning).
|
|
20
|
+
Hosted web search is now available on V4-Pro as well as V4-Flash.
|
|
21
|
+
- Added support for xAI Grok 4.6 (`grok-4.6`): 500K-token context, vision input,
|
|
22
|
+
and `low`/`medium`/`high`/`xhigh` reasoning effort. Selectable in the Settings
|
|
23
|
+
UI, `/model` picker, CLI flags, and env vars.
|
|
24
|
+
- Added support for Z.AI GLM-5.3 (`glm-5.3`) on the GLM Coding Plan provider:
|
|
25
|
+
1M-token context, 128K max output, and `high`/`max` thinking effort. GLM-5.3
|
|
26
|
+
is now the Z.AI default model.
|
|
27
|
+
- Added the Perplexity Agent API provider (`perplexity_agent`): one
|
|
28
|
+
`PERPLEXITY_API_KEY` reaches OpenAI, Anthropic, Google, xAI, and Perplexity
|
|
29
|
+
models through Perplexity's Responses-compatible Agent API, with optional
|
|
30
|
+
hosted search tools.
|
|
31
|
+
- `/plan` accepts an optional prompt: `/plan <task>` switches to plan mode and
|
|
32
|
+
starts that planning turn. Bare `/plan` still only switches mode.
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- Google Gemini models no longer reject builtin tool calls with a 400 about
|
|
37
|
+
`additionalProperties` in function-declaration schemas.
|
|
38
|
+
- Quitting the TUI no longer waits up to 30s for an unresponsive language
|
|
39
|
+
server to acknowledge shutdown.
|
|
40
|
+
- The Z.AI context-window gauge now counts tokens locally (Z.AI's count
|
|
41
|
+
endpoint reports 0 for GLM-5.3) and residual usage calibrates from
|
|
42
|
+
multi-provider response billing.
|
|
43
|
+
- MCP tools whose names contain invalid characters or exceed provider length
|
|
44
|
+
limits are sanitized at collection time, and provider 400 details are shown
|
|
45
|
+
in the turn error instead of a generic failure.
|
|
46
|
+
|
|
9
47
|
## 0.29.0 - 2026-08-13
|
|
10
48
|
|
|
11
49
|
### Added
|
|
@@ -521,6 +521,8 @@ class BaseAgent(LogMixin):
|
|
|
521
521
|
# gate reads client_web_tools_enabled, the stream call reads
|
|
522
522
|
# hosted_web_search_active.
|
|
523
523
|
self.supports_hosted_web_search = bool(model_specs.get("supports_hosted_web_search", False))
|
|
524
|
+
# Spec-declared server-side tools; _apply_web_search_state derives the live list.
|
|
525
|
+
self._model_server_tools: List[str] = [str(tool) for tool in model_specs.get("server_tools") or []]
|
|
524
526
|
self.web_search_mode = getattr(self.config, "web_search_mode", "auto") or "auto"
|
|
525
527
|
self._apply_web_search_state()
|
|
526
528
|
|
|
@@ -731,22 +733,27 @@ class BaseAgent(LogMixin):
|
|
|
731
733
|
initialize()
|
|
732
734
|
|
|
733
735
|
def _apply_web_search_state(self) -> None:
|
|
734
|
-
"""Resolve web_search_mode + model capability into the
|
|
736
|
+
"""Resolve web_search_mode + model capability into the live gates.
|
|
735
737
|
|
|
736
738
|
``hosted_web_search_active`` — request the provider's server-side
|
|
737
739
|
web_search tool on main-loop stream calls. ``client_web_tools_enabled``
|
|
738
740
|
— register the client-side web_search/web_fetch tools (read by the
|
|
739
|
-
ToolCollection gate).
|
|
740
|
-
|
|
741
|
+
ToolCollection gate). ``server_tools`` — the spec-declared server-side
|
|
742
|
+
tools (e.g. the Perplexity Agent API's). One setting gates all of it:
|
|
743
|
+
auto/hosted request the server-side tooling, client defers to the
|
|
744
|
+
client-side web tools, off disables web tooling entirely. Active
|
|
745
|
+
server-side web tooling always excludes the client tools: two search
|
|
746
|
+
paths confuse the model and waste schema tokens.
|
|
741
747
|
"""
|
|
742
748
|
mode = (self.web_search_mode or "auto").lower()
|
|
743
749
|
supported = self.supports_hosted_web_search
|
|
750
|
+
server_web_tooling = supported or "web_search" in self._model_server_tools
|
|
744
751
|
if mode == "off":
|
|
745
752
|
hosted, client = False, False
|
|
746
753
|
elif mode == "client":
|
|
747
754
|
hosted, client = False, True
|
|
748
755
|
elif mode == "hosted":
|
|
749
|
-
if not
|
|
756
|
+
if not server_web_tooling:
|
|
750
757
|
provider = self.primary_model_config.provider
|
|
751
758
|
logger.warning(
|
|
752
759
|
"web_search_mode=hosted, but %s/%s has no hosted web search; falling back to the client tools",
|
|
@@ -758,6 +765,9 @@ class BaseAgent(LogMixin):
|
|
|
758
765
|
hosted, client = supported, not supported
|
|
759
766
|
self.hosted_web_search_active = hosted
|
|
760
767
|
self.client_web_tools_enabled = client
|
|
768
|
+
self.server_tools = list(self._model_server_tools) if mode in ("auto", "hosted") else []
|
|
769
|
+
if "web_search" in self.server_tools:
|
|
770
|
+
self.client_web_tools_enabled = False
|
|
761
771
|
|
|
762
772
|
def apply_web_search_mode(self, mode: str) -> None:
|
|
763
773
|
"""Change the web tool mode mid-session (TUI ``/web-search``).
|
|
@@ -770,31 +780,36 @@ class BaseAgent(LogMixin):
|
|
|
770
780
|
self._apply_web_search_state()
|
|
771
781
|
|
|
772
782
|
async def _emit_hosted_tool_call(self, delta: Dict[str, Any]) -> None:
|
|
773
|
-
"""Render a completed hosted
|
|
783
|
+
"""Render a completed hosted/server-side tool call as a tool_call/tool_result pair.
|
|
774
784
|
|
|
775
785
|
The call executed on the provider's servers; there is no local tool
|
|
776
|
-
invocation
|
|
777
|
-
injected into the model's context
|
|
778
|
-
|
|
786
|
+
invocation. For OpenAI/DeepSeek web_search the searched content never
|
|
787
|
+
reaches the client (it is injected into the model's context
|
|
788
|
+
server-side); Perplexity Agent API result items (search_results /
|
|
789
|
+
fetch_url_results) carry their results client-side via the delta's
|
|
790
|
+
item_type/payload. The shared item id correlates the pair in every
|
|
791
|
+
transcript consumer.
|
|
779
792
|
"""
|
|
780
793
|
block = WebSearchCallBlock(
|
|
781
794
|
item_id=delta.get("id") or None,
|
|
782
795
|
status=delta.get("status"),
|
|
783
796
|
action=delta.get("action") or {},
|
|
797
|
+
item_type=str(delta.get("item_type") or "web_search_call"),
|
|
798
|
+
payload=delta.get("payload"),
|
|
784
799
|
)
|
|
785
800
|
tool_call_id = block.item_id or str(uuid.uuid4())
|
|
786
801
|
await self.send_chat_message(
|
|
787
802
|
message_type="tool_call",
|
|
788
|
-
content=f"Calling {
|
|
803
|
+
content=f"Calling {block.tool_label}: {block.label()}",
|
|
789
804
|
is_streaming=False,
|
|
790
|
-
tool_description=
|
|
805
|
+
tool_description=block.tool_label,
|
|
791
806
|
tool_call_id=tool_call_id,
|
|
792
807
|
)
|
|
793
808
|
await self.send_chat_message(
|
|
794
809
|
message_type="tool_result",
|
|
795
810
|
content=block.result_summary(),
|
|
796
811
|
is_streaming=False,
|
|
797
|
-
tool_description=
|
|
812
|
+
tool_description=block.tool_label,
|
|
798
813
|
tool_call_id=tool_call_id,
|
|
799
814
|
)
|
|
800
815
|
|
|
@@ -1130,7 +1145,15 @@ class BaseAgent(LogMixin):
|
|
|
1130
1145
|
if new_calls:
|
|
1131
1146
|
self._context_residual_tokens += self.HOSTED_SEARCH_PROVISIONAL_TOKENS * new_calls
|
|
1132
1147
|
return
|
|
1133
|
-
billed = (
|
|
1148
|
+
billed = (
|
|
1149
|
+
assistant_message.usage.input_tokens
|
|
1150
|
+
if assistant_message.usage and assistant_message.usage.reported
|
|
1151
|
+
else (
|
|
1152
|
+
(assistant_message.usage_metadata or {}).get("prompt_tokens")
|
|
1153
|
+
or (assistant_message.usage_metadata or {}).get("input_tokens")
|
|
1154
|
+
or (assistant_message.usage_metadata or {}).get("prompt_token_count")
|
|
1155
|
+
)
|
|
1156
|
+
)
|
|
1134
1157
|
counted = self._last_raw_context_count
|
|
1135
1158
|
if not isinstance(billed, int) or counted is None:
|
|
1136
1159
|
return
|
|
@@ -2488,6 +2511,7 @@ class BaseAgent(LogMixin):
|
|
|
2488
2511
|
tools=self.tool_collection.get_tool_list(),
|
|
2489
2512
|
thinking=self.primary_model_config.thinking_effort,
|
|
2490
2513
|
hosted_web_search=self.hosted_web_search_active,
|
|
2514
|
+
server_tools=self.server_tools or None,
|
|
2491
2515
|
# The strict per-run budget rechecks this request inside
|
|
2492
2516
|
# the client; hand it the count already taken for the
|
|
2493
2517
|
# gauge (same history) so it is not counted twice.
|
|
@@ -399,7 +399,7 @@ class AgentTool(BaseTool):
|
|
|
399
399
|
agent.session_recorder = scoped_recorder
|
|
400
400
|
|
|
401
401
|
# Track messages and their sequence
|
|
402
|
-
last_saved_index = -1
|
|
402
|
+
last_saved_index = -1
|
|
403
403
|
streamed_messages = {} # Track messages by UUID for assembly
|
|
404
404
|
|
|
405
405
|
# Process the task and stream messages
|
|
@@ -302,16 +302,13 @@ class ToolCollection(LogMixin):
|
|
|
302
302
|
self.workspace_id = workspace_id
|
|
303
303
|
self.thread_id = thread_id
|
|
304
304
|
|
|
305
|
-
# Convert string path to Path object if needed
|
|
306
305
|
self.project_path = Path(project_path) if isinstance(project_path, str) else project_path
|
|
307
306
|
|
|
308
|
-
# Create filesystem instance if not provided
|
|
309
307
|
if filesystem is None:
|
|
310
308
|
self.filesystem = LocalFileSystem(root_path=self.project_path)
|
|
311
309
|
else:
|
|
312
310
|
self.filesystem = filesystem
|
|
313
311
|
|
|
314
|
-
# Create terminal manager instance if not provided
|
|
315
312
|
if terminal_manager is None:
|
|
316
313
|
self.terminal_manager = LocalTerminalManager(
|
|
317
314
|
workspace_id, thread_id, connection_manager, default_workdir=self.project_path
|
|
@@ -319,7 +316,6 @@ class ToolCollection(LogMixin):
|
|
|
319
316
|
else:
|
|
320
317
|
self.terminal_manager = terminal_manager
|
|
321
318
|
|
|
322
|
-
# Create browser manager instance if not provided
|
|
323
319
|
if browser_manager is None:
|
|
324
320
|
self.browser_manager = PlaywrightBrowserManager()
|
|
325
321
|
else:
|
|
@@ -388,7 +384,6 @@ class ToolCollection(LogMixin):
|
|
|
388
384
|
}
|
|
389
385
|
self.tool_exclusions.extend(tool_config.tool_exclusions)
|
|
390
386
|
|
|
391
|
-
# Initialize tool backends
|
|
392
387
|
self._initialize_tools()
|
|
393
388
|
self._register_tool_extensions()
|
|
394
389
|
|
|
@@ -619,7 +614,6 @@ class ToolCollection(LogMixin):
|
|
|
619
614
|
browser_manager=self.browser_manager,
|
|
620
615
|
)
|
|
621
616
|
|
|
622
|
-
# Build tool
|
|
623
617
|
self.build_tool = BuildTool(
|
|
624
618
|
self.project_path,
|
|
625
619
|
self.workspace_id,
|
|
@@ -74,6 +74,7 @@ API_KEY_ENV = {
|
|
|
74
74
|
ModelProvider.THINKING_MACHINES: "TINKER_API_KEY",
|
|
75
75
|
# Native Tinker sampling authenticates with the same key.
|
|
76
76
|
ModelProvider.TINKER: "TINKER_API_KEY",
|
|
77
|
+
ModelProvider.PERPLEXITY_AGENT: "PERPLEXITY_API_KEY",
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
DEFAULT_WEB_SEARCH_BACKEND = "duckduckgo"
|
|
@@ -780,13 +781,20 @@ def _resolve_active_thinking_effort(
|
|
|
780
781
|
settings: Optional[CliSettings],
|
|
781
782
|
) -> Optional[str]:
|
|
782
783
|
explicit_effort = overrides.thinking_effort or env.get("KOLEGA_CODE_THINKING_EFFORT")
|
|
784
|
+
saved_effort: Optional[str] = None
|
|
783
785
|
if explicit_effort is None and settings:
|
|
784
786
|
settings_model_matches = settings.active_provider == provider.value and settings.active_model == model
|
|
785
787
|
if settings_model_matches:
|
|
786
|
-
|
|
788
|
+
saved_effort = settings.active_thinking_effort
|
|
787
789
|
try:
|
|
788
|
-
return normalize_thinking_effort(
|
|
790
|
+
return normalize_thinking_effort(
|
|
791
|
+
provider, model, explicit_effort if explicit_effort is not None else saved_effort
|
|
792
|
+
)
|
|
789
793
|
except ValueError as exc:
|
|
794
|
+
if saved_effort is not None and explicit_effort is None:
|
|
795
|
+
# A saved effort can outlive a catalog change; fall back to the default
|
|
796
|
+
# instead of locking startup. Explicit requests still error.
|
|
797
|
+
return normalize_thinking_effort(provider, model, None)
|
|
790
798
|
raise CliConfigError(str(exc)) from exc
|
|
791
799
|
|
|
792
800
|
|
|
@@ -971,6 +979,7 @@ def build_agent_config(
|
|
|
971
979
|
ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
|
|
972
980
|
openrouter_api_key=_api_key_for_provider(ModelProvider.OPENROUTER, loaded_env, settings),
|
|
973
981
|
thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
|
|
982
|
+
perplexity_api_key=_api_key_for_provider(ModelProvider.PERPLEXITY_AGENT, loaded_env, settings),
|
|
974
983
|
environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
|
|
975
984
|
edit_protocol=edit_protocol,
|
|
976
985
|
long_context_config=_model_config(
|
|
@@ -48,17 +48,24 @@ from kolega_code.hooks import HookDispatcher, HookEvent, load_hook_config
|
|
|
48
48
|
from kolega_code.llm.exceptions import LLMBillingError, billing_error_message
|
|
49
49
|
from kolega_code.llm.models import Message, TextBlock
|
|
50
50
|
from kolega_code.mcp.config import (
|
|
51
|
+
_SERVER_ID_MAX_LENGTH,
|
|
52
|
+
LoadedMCPConfig,
|
|
51
53
|
MCPConfigError,
|
|
52
54
|
MCPServerConfig,
|
|
53
55
|
global_mcp_config_path,
|
|
54
56
|
load_mcp_config,
|
|
55
57
|
project_mcp_config_path,
|
|
56
58
|
remove_server_config,
|
|
59
|
+
sanitize_mcp_server_id,
|
|
57
60
|
server_fingerprint,
|
|
58
61
|
set_server_enabled,
|
|
59
62
|
upsert_server_config,
|
|
60
63
|
)
|
|
61
|
-
from kolega_code.mcp.service import
|
|
64
|
+
from kolega_code.mcp.service import (
|
|
65
|
+
MCP_FAILURE_MESSAGE_GENERIC,
|
|
66
|
+
MCPService,
|
|
67
|
+
mcp_tool_name_adjustment_note,
|
|
68
|
+
)
|
|
62
69
|
from kolega_code.mcp.tools import build_mcp_tool_extension
|
|
63
70
|
from kolega_code.agent.prompt_provider import AgentMode
|
|
64
71
|
from kolega_code.permissions import (
|
|
@@ -1606,6 +1613,8 @@ async def _run_ask(args: argparse.Namespace) -> int:
|
|
|
1606
1613
|
)
|
|
1607
1614
|
if mcp_extension is not None:
|
|
1608
1615
|
tool_extensions.append(mcp_extension)
|
|
1616
|
+
if mcp_config is not None:
|
|
1617
|
+
_print_mcp_tool_name_warnings(mcp_config, settings_store.root, project_path)
|
|
1609
1618
|
extension_bundle = None
|
|
1610
1619
|
if extension_selection is not None:
|
|
1611
1620
|
extension_host = KolegaExtensionHost(
|
|
@@ -2335,6 +2344,8 @@ async def _run_mcp(args: argparse.Namespace) -> int:
|
|
|
2335
2344
|
return 0
|
|
2336
2345
|
|
|
2337
2346
|
if args.mcp_command == "verify":
|
|
2347
|
+
if getattr(args, "server_id", None):
|
|
2348
|
+
args.server_id = sanitize_mcp_server_id(args.server_id)
|
|
2338
2349
|
server_ids = _mcp_verify_server_ids(args, config)
|
|
2339
2350
|
if not server_ids:
|
|
2340
2351
|
raise ValueError("No MCP servers to verify.")
|
|
@@ -2366,33 +2377,41 @@ async def _run_mcp(args: argparse.Namespace) -> int:
|
|
|
2366
2377
|
except MCPConfigError as exc:
|
|
2367
2378
|
raise ValueError(str(exc)) from exc
|
|
2368
2379
|
print(f"Saved MCP server {server.id} to {path}")
|
|
2380
|
+
if args.server_id.strip() != server.id:
|
|
2381
|
+
print(
|
|
2382
|
+
f"mcp: server id '{args.server_id}' exceeds {_SERVER_ID_MAX_LENGTH} characters; "
|
|
2383
|
+
f"saved as '{server.id}'.",
|
|
2384
|
+
file=sys.stderr,
|
|
2385
|
+
)
|
|
2369
2386
|
if source == "project" and not settings.is_mcp_project_trusted(project_path):
|
|
2370
2387
|
print("Project MCP config is not trusted yet. Re-run with --trust-mcp to enable it.", file=sys.stderr)
|
|
2371
2388
|
return 0
|
|
2372
2389
|
|
|
2373
2390
|
if args.mcp_command == "remove":
|
|
2374
2391
|
path, source = _mcp_mutation_target(args, project_path, settings_store.root)
|
|
2392
|
+
server_id = sanitize_mcp_server_id(args.server_id)
|
|
2375
2393
|
try:
|
|
2376
|
-
removed = remove_server_config(path,
|
|
2394
|
+
removed = remove_server_config(path, server_id, source=source)
|
|
2377
2395
|
except MCPConfigError as exc:
|
|
2378
2396
|
raise ValueError(str(exc)) from exc
|
|
2379
2397
|
if not removed:
|
|
2380
|
-
raise ValueError(f"MCP server not found in {path}: {
|
|
2381
|
-
service.status_store.clear(
|
|
2382
|
-
service.oauth_store.clear(
|
|
2383
|
-
print(f"Removed MCP server {
|
|
2398
|
+
raise ValueError(f"MCP server not found in {path}: {server_id}")
|
|
2399
|
+
service.status_store.clear(server_id)
|
|
2400
|
+
service.oauth_store.clear(server_id)
|
|
2401
|
+
print(f"Removed MCP server {server_id} from {path}")
|
|
2384
2402
|
return 0
|
|
2385
2403
|
|
|
2386
2404
|
if args.mcp_command in {"enable", "disable"}:
|
|
2387
2405
|
path, source = _mcp_mutation_target(args, project_path, settings_store.root)
|
|
2388
2406
|
enabled = args.mcp_command == "enable"
|
|
2407
|
+
server_id = sanitize_mcp_server_id(args.server_id)
|
|
2389
2408
|
try:
|
|
2390
|
-
changed = set_server_enabled(path,
|
|
2409
|
+
changed = set_server_enabled(path, server_id, enabled, source=source)
|
|
2391
2410
|
except MCPConfigError as exc:
|
|
2392
2411
|
raise ValueError(str(exc)) from exc
|
|
2393
2412
|
if not changed:
|
|
2394
|
-
raise ValueError(f"MCP server not found in {path}: {
|
|
2395
|
-
print(f"{'Enabled' if enabled else 'Disabled'} MCP server {
|
|
2413
|
+
raise ValueError(f"MCP server not found in {path}: {server_id}")
|
|
2414
|
+
print(f"{'Enabled' if enabled else 'Disabled'} MCP server {server_id} in {path}")
|
|
2396
2415
|
return 0
|
|
2397
2416
|
|
|
2398
2417
|
raise ValueError(f"Unknown mcp command: {args.mcp_command}")
|
|
@@ -2411,21 +2430,41 @@ def _print_mcp_list(config, service: MCPService) -> None:
|
|
|
2411
2430
|
return
|
|
2412
2431
|
print("ID\tSOURCE\tTRANSPORT\tENABLED\tOAUTH\tSTATUS\tTOOLS\tMESSAGE")
|
|
2413
2432
|
for server in config.servers.values():
|
|
2414
|
-
status_text, tool_count, message = _mcp_cli_status_parts(server, service)
|
|
2433
|
+
status_text, tool_count, message, _ = _mcp_cli_status_parts(server, service)
|
|
2415
2434
|
print(
|
|
2416
2435
|
f"{server.id}\t{server.source}\t{server.transport}\t{server.enabled}\t{server.oauth.enabled}\t"
|
|
2417
2436
|
f"{status_text}\t{tool_count}\t{message}"
|
|
2418
2437
|
)
|
|
2419
2438
|
|
|
2420
2439
|
|
|
2421
|
-
def
|
|
2440
|
+
def _print_mcp_tool_name_warnings(config: LoadedMCPConfig, state_dir: Path, project_path: Path) -> None:
|
|
2441
|
+
"""Warn on stderr when verified MCP tools get provider-adjusted wire names.
|
|
2442
|
+
|
|
2443
|
+
Mirrors the ``mcp: {diagnostic}`` startup output: the model-facing names are
|
|
2444
|
+
sanitized, and silently renaming them would be confusing.
|
|
2445
|
+
"""
|
|
2446
|
+
service = MCPService(config, state_dir=state_dir, project_path=project_path)
|
|
2447
|
+
for server in config.enabled_servers:
|
|
2448
|
+
status = service.server_status(server)
|
|
2449
|
+
if not status or status.status != "verified":
|
|
2450
|
+
continue
|
|
2451
|
+
if status.fingerprint != server_fingerprint(server):
|
|
2452
|
+
continue
|
|
2453
|
+
note = mcp_tool_name_adjustment_note(server.id, status.tools)
|
|
2454
|
+
if note:
|
|
2455
|
+
print(f"mcp: warning: server '{server.id}': {note}", file=sys.stderr)
|
|
2456
|
+
|
|
2457
|
+
|
|
2458
|
+
def _mcp_cli_status_parts(server: MCPServerConfig, service: MCPService) -> tuple[str, int, str, str]:
|
|
2422
2459
|
status = service.server_status(server)
|
|
2423
2460
|
current_fingerprint = server_fingerprint(server)
|
|
2424
2461
|
verified = bool(status and status.status == "verified" and status.fingerprint == current_fingerprint)
|
|
2425
2462
|
stale = bool(status and status.fingerprint and status.fingerprint != current_fingerprint)
|
|
2463
|
+
note = ""
|
|
2426
2464
|
if verified and status:
|
|
2427
2465
|
status_text = "verified"
|
|
2428
2466
|
tool_count = status.tool_count
|
|
2467
|
+
note = mcp_tool_name_adjustment_note(server.id, status.tools)
|
|
2429
2468
|
elif stale:
|
|
2430
2469
|
status_text = "stale"
|
|
2431
2470
|
tool_count = 0
|
|
@@ -2435,12 +2474,13 @@ def _mcp_cli_status_parts(server: MCPServerConfig, service: MCPService) -> tuple
|
|
|
2435
2474
|
else:
|
|
2436
2475
|
status_text = "unverified"
|
|
2437
2476
|
tool_count = 0
|
|
2438
|
-
return status_text, tool_count, _mcp_cli_list_message(status_text, tool_count)
|
|
2477
|
+
return status_text, tool_count, _mcp_cli_list_message(status_text, tool_count, note), note
|
|
2439
2478
|
|
|
2440
2479
|
|
|
2441
|
-
def _mcp_cli_list_message(status: str, tool_count: int) -> str:
|
|
2480
|
+
def _mcp_cli_list_message(status: str, tool_count: int, note: str = "") -> str:
|
|
2442
2481
|
if status == "verified":
|
|
2443
|
-
|
|
2482
|
+
message = f"Verified {tool_count} tool(s)."
|
|
2483
|
+
return f"{message} {note}" if note else message
|
|
2444
2484
|
if status == "stale":
|
|
2445
2485
|
return "Configuration changed since last verification. Verify again."
|
|
2446
2486
|
if status == "failed":
|
|
@@ -2586,6 +2626,27 @@ def _run_doctor(args: argparse.Namespace) -> int:
|
|
|
2586
2626
|
line("Long model", f"{summary['long_provider']}/{summary['long_model']}")
|
|
2587
2627
|
line("Fast model", f"{summary['fast_provider']}/{summary['fast_model']}")
|
|
2588
2628
|
line("Thinking effort", summary["thinking_effort"])
|
|
2629
|
+
|
|
2630
|
+
# MCP servers: offline status from config + local verification state (no network).
|
|
2631
|
+
mcp_config = load_mcp_config(
|
|
2632
|
+
project_path, settings_store.root, project_trusted=settings.is_mcp_project_trusted(project_path)
|
|
2633
|
+
)
|
|
2634
|
+
mcp_service = MCPService(mcp_config, state_dir=settings_store.root, project_path=project_path)
|
|
2635
|
+
for diagnostic in mcp_config.diagnostics:
|
|
2636
|
+
print(f"mcp: {diagnostic}", file=sys.stderr)
|
|
2637
|
+
if not mcp_config.servers:
|
|
2638
|
+
line("MCP servers", "none configured", "muted")
|
|
2639
|
+
for server in mcp_config.servers.values():
|
|
2640
|
+
status_text, tool_count, _, note = _mcp_cli_status_parts(server, mcp_service)
|
|
2641
|
+
status_style = "success" if status_text == "verified" else ("error" if status_text == "failed" else "muted")
|
|
2642
|
+
line(
|
|
2643
|
+
f"MCP {server.id}",
|
|
2644
|
+
f"{server.transport} · {'enabled' if server.enabled else 'disabled'} · {status_text} · "
|
|
2645
|
+
f"{tool_count} tool(s)",
|
|
2646
|
+
status_style,
|
|
2647
|
+
)
|
|
2648
|
+
if note:
|
|
2649
|
+
line(f"MCP {server.id} tool names", f"{note} See `kolega-code mcp list` for detail.", "warning")
|
|
2589
2650
|
return 0
|
|
2590
2651
|
|
|
2591
2652
|
|
|
@@ -23,19 +23,22 @@ from kolega_code.config import ModelProvider
|
|
|
23
23
|
from kolega_code.llm.specs import MODEL_SPECS, is_featured_model
|
|
24
24
|
from kolega_code.llm.specs import ollama_cloud_catalog as ollama_cloud
|
|
25
25
|
from kolega_code.llm.specs import openrouter_catalog as openrouter
|
|
26
|
+
from kolega_code.llm.specs import perplexity_catalog as perplexity
|
|
26
27
|
from kolega_code.llm.specs import tinker_catalog as tinker
|
|
27
28
|
from kolega_code.llm.specs.validation import validate_model_spec
|
|
28
29
|
|
|
29
30
|
from .provider_registry import PROVIDER_LABELS, get_ui_model, rebuild_ui_model_options
|
|
30
31
|
from .session_store import default_state_dir
|
|
31
32
|
|
|
32
|
-
# Overlay sources keyed by provider value. Each
|
|
33
|
+
# Overlay sources keyed by provider value. Each entry exposes PROVIDER,
|
|
33
34
|
# MODELS_URL, CACHE_FILENAME, fetch_models(), catalog_entries(), load_cache()
|
|
34
|
-
# and save_cache().
|
|
35
|
+
# and save_cache(). The Perplexity entry is a duck-typed catalog object rather
|
|
36
|
+
# than a module — same contract.
|
|
35
37
|
OVERLAY_SOURCES = {
|
|
36
38
|
ollama_cloud.PROVIDER: ollama_cloud,
|
|
37
39
|
openrouter.PROVIDER: openrouter,
|
|
38
40
|
tinker.PROVIDER: tinker,
|
|
41
|
+
perplexity.AGENT_PROVIDER: perplexity.AGENT_CATALOG,
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
# Capture the release snapshot before startup applies any runtime caches.
|
|
@@ -45,6 +45,7 @@ PROVIDER_LABELS: dict[ModelProvider, str] = {
|
|
|
45
45
|
ModelProvider.OPENROUTER: "OpenRouter",
|
|
46
46
|
ModelProvider.THINKING_MACHINES: "Thinking Machines",
|
|
47
47
|
ModelProvider.TINKER: "Tinker",
|
|
48
|
+
ModelProvider.PERPLEXITY_AGENT: "Perplexity Agent API",
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
# Friendly display names for models. Anything not listed falls back to its raw
|
|
@@ -64,6 +65,7 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
64
65
|
"deepseek-v4-pro": "DeepSeek V4 Pro",
|
|
65
66
|
"deepseek-v4-flash": "DeepSeek V4 Flash",
|
|
66
67
|
# Z.AI (GLM Coding Plan)
|
|
68
|
+
"glm-5.3": "GLM-5.3",
|
|
67
69
|
"glm-5.2": "GLM-5.2",
|
|
68
70
|
"glm-5.1": "GLM-5.1",
|
|
69
71
|
# Anthropic
|
|
@@ -86,11 +88,13 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
86
88
|
"gpt-5.4-mini": "GPT-5.4 Mini",
|
|
87
89
|
"gpt-5.3-codex-spark": "GPT-5.3 Codex Spark",
|
|
88
90
|
# Google
|
|
91
|
+
"gemini-3.7-flash": "Gemini 3.7 Flash",
|
|
89
92
|
"gemini-3.6-flash": "Gemini 3.6 Flash",
|
|
90
93
|
"gemini-3.5-flash-lite": "Gemini 3.5 Flash-Lite",
|
|
91
94
|
"gemini-3.1-pro-preview": "Gemini 3.1 Pro",
|
|
92
95
|
"gemini-3.5-flash": "Gemini 3.5 Flash",
|
|
93
96
|
# xAI
|
|
97
|
+
"grok-4.6": "Grok 4.6",
|
|
94
98
|
"grok-4.5": "Grok 4.5",
|
|
95
99
|
"grok-4.3": "Grok 4.3",
|
|
96
100
|
"grok-build-0.1": "Grok Build 0.1",
|
|
@@ -148,12 +152,12 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
148
152
|
PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
|
|
149
153
|
ModelProvider.MOONSHOT: "kimi-k3",
|
|
150
154
|
ModelProvider.DEEPSEEK: "deepseek-v4-pro",
|
|
151
|
-
ModelProvider.ZAI: "glm-5.
|
|
155
|
+
ModelProvider.ZAI: "glm-5.3",
|
|
152
156
|
ModelProvider.KIMI_CODING: "kimi-for-coding",
|
|
153
157
|
ModelProvider.ANTHROPIC: "claude-opus-5",
|
|
154
158
|
ModelProvider.OPENAI: "gpt-5.6-sol",
|
|
155
159
|
ModelProvider.OPENAI_CHATGPT: "gpt-5.6-sol",
|
|
156
|
-
ModelProvider.GOOGLE: "gemini-3.
|
|
160
|
+
ModelProvider.GOOGLE: "gemini-3.7-flash",
|
|
157
161
|
ModelProvider.XAI: "grok-4.5",
|
|
158
162
|
ModelProvider.FIREWORKS: "accounts/fireworks/models/glm-5p2",
|
|
159
163
|
ModelProvider.TOGETHER: "moonshotai/Kimi-K2.7-Code",
|
|
@@ -166,6 +170,7 @@ PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
|
|
|
166
170
|
# Cheap and renderable without the optional tinker-inkling extra, so the
|
|
167
171
|
# provider works out of the box for anyone who installs the base extras.
|
|
168
172
|
ModelProvider.TINKER: "Qwen/Qwen3-8B",
|
|
173
|
+
ModelProvider.PERPLEXITY_AGENT: "openai/gpt-5.6-sol",
|
|
169
174
|
}
|
|
170
175
|
|
|
171
176
|
UI_DEFAULT_PROVIDER = ModelProvider.MOONSHOT.value
|
|
@@ -209,6 +214,8 @@ def _api_key_env(provider: ModelProvider) -> str:
|
|
|
209
214
|
return "TINKER_API_KEY"
|
|
210
215
|
if provider == ModelProvider.TINKER:
|
|
211
216
|
return "TINKER_API_KEY"
|
|
217
|
+
if provider == ModelProvider.PERPLEXITY_AGENT:
|
|
218
|
+
return "PERPLEXITY_API_KEY"
|
|
212
219
|
return f"{provider.value.upper()}_API_KEY"
|
|
213
220
|
|
|
214
221
|
|
|
@@ -52,7 +52,7 @@ TUI_COMMAND_ENTRIES: tuple[SlashCommandEntry, ...] = (
|
|
|
52
52
|
),
|
|
53
53
|
SlashCommandEntry("detach", "Remove pending image attachments", CommandScope.TUI),
|
|
54
54
|
SlashCommandEntry("init", "Create or update AGENTS.md for this repository", CommandScope.TUI),
|
|
55
|
-
SlashCommandEntry("plan", "Switch to plan mode", CommandScope.TUI),
|
|
55
|
+
SlashCommandEntry("plan", "Switch to plan mode, optionally with a planning prompt", CommandScope.TUI),
|
|
56
56
|
SlashCommandEntry("build", "Switch to build mode", CommandScope.TUI),
|
|
57
57
|
SlashCommandEntry("sidebar", "Show or hide the side panel", CommandScope.TUI),
|
|
58
58
|
SlashCommandEntry("settings", "Open Settings", CommandScope.TUI),
|
|
@@ -36,24 +36,24 @@ class Color:
|
|
|
36
36
|
class Glyph:
|
|
37
37
|
"""Unicode glyphs used in the UI. Use g() to apply ASCII fallbacks."""
|
|
38
38
|
|
|
39
|
-
USER = "❯"
|
|
40
|
-
AGENT = "●"
|
|
41
|
-
STATUS = "●"
|
|
42
|
-
TOOL = "⏺"
|
|
43
|
-
SUB_AGENT = "◆"
|
|
44
|
-
PLAN = "◆"
|
|
39
|
+
USER = "❯"
|
|
40
|
+
AGENT = "●"
|
|
41
|
+
STATUS = "●"
|
|
42
|
+
TOOL = "⏺"
|
|
43
|
+
SUB_AGENT = "◆"
|
|
44
|
+
PLAN = "◆"
|
|
45
45
|
QUESTION = "?"
|
|
46
|
-
INSET_BAR = "│"
|
|
47
|
-
INSET_ELBOW = "└"
|
|
48
|
-
ELLIPSIS = "…"
|
|
49
|
-
BULLET_SEP = "·"
|
|
50
|
-
BAR_FILLED = "█"
|
|
51
|
-
BAR_EMPTY = "░"
|
|
52
|
-
CHECK = "✓"
|
|
53
|
-
CROSS = "✗"
|
|
54
|
-
DOWN = "↓"
|
|
55
|
-
PENDING = "○" #
|
|
56
|
-
RUNNING = "▶" #
|
|
46
|
+
INSET_BAR = "│"
|
|
47
|
+
INSET_ELBOW = "└"
|
|
48
|
+
ELLIPSIS = "…"
|
|
49
|
+
BULLET_SEP = "·"
|
|
50
|
+
BAR_FILLED = "█"
|
|
51
|
+
BAR_EMPTY = "░"
|
|
52
|
+
CHECK = "✓"
|
|
53
|
+
CROSS = "✗"
|
|
54
|
+
DOWN = "↓"
|
|
55
|
+
PENDING = "○" # phase not started
|
|
56
|
+
RUNNING = "▶" # phase in progress
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
ASCII_FALLBACKS = {
|
|
@@ -74,7 +74,7 @@ ASCII_FALLBACKS = {
|
|
|
74
74
|
Glyph.RUNNING: ">",
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
SPINNER_FRAMES = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
|
|
77
|
+
SPINNER_FRAMES = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
|
|
78
78
|
SPINNER_FRAMES_ASCII = "|/-\\"
|
|
79
79
|
SPINNER_INTERVAL = 0.25
|
|
80
80
|
|
|
@@ -34,6 +34,8 @@ from kolega_code.agent.prompts import (
|
|
|
34
34
|
from kolega_code.hooks import HookDispatcher, HookEvent, load_hook_config, project_hooks_present
|
|
35
35
|
from kolega_code.scratchpad import SCRATCHPAD_PROMPT_EXTENSION_ID, ensure_scratchpad_dir, scratchpad_dir_for
|
|
36
36
|
from kolega_code.llm.exceptions import LLMError, llm_error_message
|
|
37
|
+
from kolega_code.mcp.config import LoadedMCPConfig, server_fingerprint
|
|
38
|
+
from kolega_code.mcp.service import MCPService, mcp_tool_name_adjustment_note
|
|
37
39
|
from kolega_code.mcp.tools import build_mcp_tool_extension
|
|
38
40
|
from kolega_code.permissions import PermissionDecision
|
|
39
41
|
from kolega_code.session.runtime import deserialize_permission_request
|
|
@@ -966,6 +968,23 @@ class AgentRuntimeMixin(tui_app_base.KolegaAppBase):
|
|
|
966
968
|
if self._scheduled_loop is not None and self._scheduled_loop.is_active:
|
|
967
969
|
self._request_loop_stop(messages.LOOP_STOPPED_BY_USER.format(iterations=self._scheduled_loop.iterations))
|
|
968
970
|
|
|
971
|
+
def _log_mcp_tool_name_warnings(self, mcp_config: LoadedMCPConfig) -> None:
|
|
972
|
+
"""Warn in the log pane when verified MCP tools get provider-adjusted wire names.
|
|
973
|
+
|
|
974
|
+
Mirrors the ``mcp: {diagnostic}`` startup warnings: the model-facing names
|
|
975
|
+
are sanitized, and silently renaming them would be confusing.
|
|
976
|
+
"""
|
|
977
|
+
service = MCPService(mcp_config, state_dir=self.settings_store.root, project_path=self.active_project_path)
|
|
978
|
+
for server in mcp_config.enabled_servers:
|
|
979
|
+
status = service.server_status(server)
|
|
980
|
+
if not status or status.status != "verified":
|
|
981
|
+
continue
|
|
982
|
+
if status.fingerprint != server_fingerprint(server):
|
|
983
|
+
continue
|
|
984
|
+
note = mcp_tool_name_adjustment_note(server.id, status.tools)
|
|
985
|
+
if note:
|
|
986
|
+
self._log_status(f"mcp: warning: server '{server.id}': {note}", level="warn")
|
|
987
|
+
|
|
969
988
|
async def _ensure_agent_from_settings(self, rebuild: bool = False) -> None:
|
|
970
989
|
try:
|
|
971
990
|
config = build_agent_config(
|
|
@@ -1186,6 +1205,8 @@ class AgentRuntimeMixin(tui_app_base.KolegaAppBase):
|
|
|
1186
1205
|
)
|
|
1187
1206
|
if mcp_extension is not None:
|
|
1188
1207
|
tool_extensions.append(mcp_extension)
|
|
1208
|
+
if mcp_config is not None and self.active_project_path == self.project_path:
|
|
1209
|
+
self._log_mcp_tool_name_warnings(mcp_config)
|
|
1189
1210
|
|
|
1190
1211
|
# gigacode applies to any top-level agent and is carried across rebuilds.
|
|
1191
1212
|
# In plan mode the orchestrating agent is read-only, so its workflow
|