kolega-code 0.28.4__tar.gz → 0.29.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.28.4 → kolega_code-0.29.0}/CHANGELOG.md +24 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/PKG-INFO +1 -1
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/__init__.py +3 -2
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/baseagent.py +3 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/context.py +5 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/terminal_tool.py +3 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +3 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/config.py +276 -17
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/main.py +51 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/messages.py +9 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/model_connection.py +6 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/provider_registry.py +35 -2
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/settings.py +62 -1
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/onboarding_screen.py +7 -1
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/settings_panel.py +343 -10
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/settings_screen.py +92 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/config.py +102 -2
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/client.py +30 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/instrumented_client.py +6 -2
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/models.py +4 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/anthropic.py +1 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/openai.py +12 -3
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/responses_common.py +9 -5
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/__init__.py +16 -0
- kolega_code-0.29.0/kolega_code/llm/specs/custom_endpoints.py +156 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/thinking.py +27 -1
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/usage.py +20 -4
- {kolega_code-0.28.4 → kolega_code-0.29.0}/pyproject.toml +1 -1
- {kolega_code-0.28.4 → kolega_code-0.29.0}/.gitignore +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/MIGRATION.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/README.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/RELEASING.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/command_handlers.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/events.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.28.4 → kolega_code-0.29.0}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,30 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.29.0 - 2026-08-13
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Custom endpoints: use models from any OpenAI Chat Completions, OpenAI
|
|
14
|
+
Responses, or Anthropic Messages-compatible server (LM Studio, Ollama, vLLM,
|
|
15
|
+
...). Define endpoints under `custom_endpoints` in settings.json or via the
|
|
16
|
+
`--custom-endpoints` / `--endpoint-url` flags and `KOLEGA_CODE_CUSTOM_ENDPOINTS`
|
|
17
|
+
/ `KOLEGA_CODE_ENDPOINT_*` environment variables (never persisted), then select
|
|
18
|
+
them as `custom:<id>` anywhere a provider is chosen. Supports thinking-effort
|
|
19
|
+
modes per wire dialect and native reasoning replay.
|
|
20
|
+
|
|
21
|
+
- Custom endpoints accept a `temperature` field (per endpoint, or per model in
|
|
22
|
+
its `models` map; default 1.0), exposed in the TUI endpoint editor, via
|
|
23
|
+
`--endpoint-temperature`, and via `KOLEGA_CODE_ENDPOINT_TEMPERATURE`. Sent on
|
|
24
|
+
Chat Completions and Anthropic requests; ignored by Responses-style endpoints.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Together models (e.g. Kimi K2.7-Code) now replay prior reasoning through the
|
|
29
|
+
native `reasoning` field instead of visible `*Thinking:*` text, avoiding a full
|
|
30
|
+
re-derivation of the chain-of-thought on every turn. Reasoning models without a
|
|
31
|
+
declared thinking-effort spec now resolve their provider's replay field.
|
|
32
|
+
|
|
9
33
|
## 0.28.4 - 2026-08-12
|
|
10
34
|
|
|
11
35
|
### Fixed
|
|
@@ -22,7 +22,7 @@ from .agent.errors import AgentError, MaxAgentIterationsExceeded
|
|
|
22
22
|
from .events import AgentEventEmitter
|
|
23
23
|
|
|
24
24
|
# Configuration
|
|
25
|
-
from .config import AgentConfig, ModelConfig, ModelProvider, RateLimitConfig
|
|
25
|
+
from .config import AgentConfig, CustomEndpointConfig, ModelConfig, ModelProvider, RateLimitConfig
|
|
26
26
|
|
|
27
27
|
# Events and connection management
|
|
28
28
|
from .events import AgentConnectionManager
|
|
@@ -108,6 +108,7 @@ __all__ = [
|
|
|
108
108
|
"AgentEventEmitter",
|
|
109
109
|
# Configuration
|
|
110
110
|
"AgentConfig",
|
|
111
|
+
"CustomEndpointConfig",
|
|
111
112
|
"ModelConfig",
|
|
112
113
|
"ModelProvider",
|
|
113
114
|
"RateLimitConfig",
|
|
@@ -173,4 +174,4 @@ __all__ = [
|
|
|
173
174
|
"parse_git_status_output",
|
|
174
175
|
]
|
|
175
176
|
|
|
176
|
-
__version__ = "0.
|
|
177
|
+
__version__ = "0.29.0"
|
|
@@ -1741,6 +1741,7 @@ class BaseAgent(LogMixin):
|
|
|
1741
1741
|
|
|
1742
1742
|
from kolega_code.llm.client import LLMClient
|
|
1743
1743
|
|
|
1744
|
+
endpoint = self.config.custom_endpoint_for(model_config)
|
|
1744
1745
|
client = LLMClient(
|
|
1745
1746
|
provider=model_config.provider.value,
|
|
1746
1747
|
api_key=self.config.get_api_key(model_config.provider) or "",
|
|
@@ -1751,6 +1752,8 @@ class BaseAgent(LogMixin):
|
|
|
1751
1752
|
token_manager=self.config.get_chatgpt_token_manager(),
|
|
1752
1753
|
usage_ledger=self.usage_ledger,
|
|
1753
1754
|
trace_sink=self.llm_trace_sink,
|
|
1755
|
+
base_url=endpoint.base_url if endpoint else None,
|
|
1756
|
+
api_style=endpoint.api_style if endpoint else None,
|
|
1754
1757
|
)
|
|
1755
1758
|
with llm_call_origin(helper_origin("hook_prompt")):
|
|
1756
1759
|
response = await client.generate(
|
|
@@ -113,6 +113,7 @@ class AgentContext:
|
|
|
113
113
|
itself is still passed per call.
|
|
114
114
|
"""
|
|
115
115
|
model_config = self.config.model_config_for_agent(agent_name)
|
|
116
|
+
endpoint = self.config.custom_endpoint_for(model_config)
|
|
116
117
|
|
|
117
118
|
if self.telemetry.langfuse_client:
|
|
118
119
|
return InstrumentedLLMClient(
|
|
@@ -135,6 +136,8 @@ class AgentContext:
|
|
|
135
136
|
trace_sink=self.telemetry.llm_trace_sink,
|
|
136
137
|
context_window_tokens=self.config.context_window_tokens,
|
|
137
138
|
max_output_tokens=self.config.max_output_tokens,
|
|
139
|
+
base_url=endpoint.base_url if endpoint else None,
|
|
140
|
+
api_style=endpoint.api_style if endpoint else None,
|
|
138
141
|
)
|
|
139
142
|
|
|
140
143
|
return LLMClient(
|
|
@@ -149,4 +152,6 @@ class AgentContext:
|
|
|
149
152
|
trace_sink=self.telemetry.llm_trace_sink,
|
|
150
153
|
context_window_tokens=self.config.context_window_tokens,
|
|
151
154
|
max_output_tokens=self.config.max_output_tokens,
|
|
155
|
+
base_url=endpoint.base_url if endpoint else None,
|
|
156
|
+
api_style=endpoint.api_style if endpoint else None,
|
|
152
157
|
)
|
|
@@ -97,6 +97,7 @@ class TerminalTool(BaseTool):
|
|
|
97
97
|
provider = self.config.fast_config.provider
|
|
98
98
|
api_key = self.config.get_api_key(provider)
|
|
99
99
|
rate_limits = self.config.fast_config.rate_limits
|
|
100
|
+
endpoint = self.config.custom_endpoint_for(self.config.fast_config)
|
|
100
101
|
|
|
101
102
|
client = LLMClient(
|
|
102
103
|
provider=provider.value,
|
|
@@ -108,6 +109,8 @@ class TerminalTool(BaseTool):
|
|
|
108
109
|
token_manager=self.config.get_chatgpt_token_manager(),
|
|
109
110
|
usage_ledger=getattr(self.caller, "usage_ledger", None),
|
|
110
111
|
trace_sink=getattr(self.caller, "llm_trace_sink", None),
|
|
112
|
+
base_url=endpoint.base_url if endpoint else None,
|
|
113
|
+
api_style=endpoint.api_style if endpoint else None,
|
|
111
114
|
)
|
|
112
115
|
|
|
113
116
|
try:
|
|
@@ -146,6 +146,7 @@ class WebFetchTool(StreamingTool):
|
|
|
146
146
|
def _build_client(self) -> LLMClient:
|
|
147
147
|
provider = self.config.fast_config.provider
|
|
148
148
|
rate_limits = self.config.fast_config.rate_limits
|
|
149
|
+
endpoint = self.config.custom_endpoint_for(self.config.fast_config)
|
|
149
150
|
client_kwargs = {
|
|
150
151
|
"provider": provider.value,
|
|
151
152
|
"api_key": self.config.get_api_key(provider),
|
|
@@ -156,6 +157,8 @@ class WebFetchTool(StreamingTool):
|
|
|
156
157
|
"token_manager": self.config.get_chatgpt_token_manager(),
|
|
157
158
|
"usage_ledger": getattr(self.caller, "usage_ledger", None),
|
|
158
159
|
"trace_sink": getattr(self.caller, "llm_trace_sink", None),
|
|
160
|
+
"base_url": endpoint.base_url if endpoint else None,
|
|
161
|
+
"api_style": endpoint.api_style if endpoint else None,
|
|
159
162
|
}
|
|
160
163
|
caller_llm = getattr(self.caller, "llm", None)
|
|
161
164
|
if isinstance(caller_llm, InstrumentedLLMClient):
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import os
|
|
6
7
|
from dataclasses import dataclass
|
|
7
8
|
from pathlib import Path
|
|
@@ -10,12 +11,29 @@ from typing import Any, Mapping, NoReturn, Optional
|
|
|
10
11
|
from pydantic import ValidationError
|
|
11
12
|
|
|
12
13
|
from kolega_code.auth.tokens import ChatGPTTokenManager, OAuthTokens
|
|
13
|
-
from kolega_code.config import
|
|
14
|
+
from kolega_code.config import (
|
|
15
|
+
AgentConfig,
|
|
16
|
+
AgentRole,
|
|
17
|
+
CustomEndpointConfig,
|
|
18
|
+
EditProtocol,
|
|
19
|
+
ModelConfig,
|
|
20
|
+
ModelProvider,
|
|
21
|
+
RateLimitConfig,
|
|
22
|
+
)
|
|
14
23
|
from kolega_code.llm.specs import MODEL_SPECS, get_model_specs, model_is_known, normalize_thinking_effort
|
|
24
|
+
from kolega_code.llm.specs.custom_endpoints import (
|
|
25
|
+
API_STYLES,
|
|
26
|
+
CUSTOM_PROVIDER_PREFIX,
|
|
27
|
+
CUSTOM_THINKING_PRESETS,
|
|
28
|
+
REASONING_REPLAY_VALUES,
|
|
29
|
+
custom_endpoint_id,
|
|
30
|
+
is_custom_provider,
|
|
31
|
+
sync_custom_endpoint_specs,
|
|
32
|
+
)
|
|
15
33
|
from kolega_code.mcp.config import load_mcp_config
|
|
16
34
|
from kolega_code.services.lsp.config import LspConfig
|
|
17
35
|
|
|
18
|
-
from .provider_registry import default_model_for_provider
|
|
36
|
+
from .provider_registry import default_model_for_provider, rebuild_ui_model_options, set_custom_provider_labels
|
|
19
37
|
from .settings import (
|
|
20
38
|
COMPRESSION_THRESHOLD_MAX_PERCENT,
|
|
21
39
|
COMPRESSION_THRESHOLD_MIN_PERCENT,
|
|
@@ -86,6 +104,21 @@ SEARCH_BACKEND_KEY_ENV = {
|
|
|
86
104
|
"tavily": "TAVILY_API_KEY",
|
|
87
105
|
}
|
|
88
106
|
|
|
107
|
+
# Custom-endpoint definition layers: full JSON object, or flat fields describing
|
|
108
|
+
# one ephemeral endpoint under the id below. Never persisted to settings.json.
|
|
109
|
+
CUSTOM_ENDPOINTS_ENV = "KOLEGA_CODE_CUSTOM_ENDPOINTS"
|
|
110
|
+
ENDPOINT_URL_ENV = "KOLEGA_CODE_ENDPOINT_URL"
|
|
111
|
+
ENDPOINT_STYLE_ENV = "KOLEGA_CODE_ENDPOINT_STYLE"
|
|
112
|
+
ENDPOINT_API_KEY_ENV = "KOLEGA_CODE_ENDPOINT_API_KEY"
|
|
113
|
+
ENDPOINT_CONTEXT_ENV = "KOLEGA_CODE_ENDPOINT_CONTEXT"
|
|
114
|
+
ENDPOINT_MAX_OUTPUT_ENV = "KOLEGA_CODE_ENDPOINT_MAX_OUTPUT"
|
|
115
|
+
ENDPOINT_VISION_ENV = "KOLEGA_CODE_ENDPOINT_VISION"
|
|
116
|
+
ENDPOINT_THINKING_ENV = "KOLEGA_CODE_ENDPOINT_THINKING"
|
|
117
|
+
ENDPOINT_REASONING_ENV = "KOLEGA_CODE_ENDPOINT_REASONING"
|
|
118
|
+
ENDPOINT_TEMPERATURE_ENV = "KOLEGA_CODE_ENDPOINT_TEMPERATURE"
|
|
119
|
+
CLI_ENDPOINT_ID = "cli"
|
|
120
|
+
CLI_ENDPOINT_PROVIDER = f"{CUSTOM_PROVIDER_PREFIX}{CLI_ENDPOINT_ID}"
|
|
121
|
+
|
|
89
122
|
|
|
90
123
|
class CliConfigError(ValueError):
|
|
91
124
|
"""Raised when CLI configuration is incomplete or invalid."""
|
|
@@ -121,6 +154,19 @@ class CliConfigOverrides:
|
|
|
121
154
|
# validated as a pair in _strict_context_budget. Never persisted.
|
|
122
155
|
context_window_tokens: Optional[str] = None
|
|
123
156
|
max_output_tokens: Optional[str] = None
|
|
157
|
+
# Custom endpoint definition layers. --custom-endpoints carries the full JSON
|
|
158
|
+
# object; the --endpoint-* flags define one ephemeral endpoint "custom:cli".
|
|
159
|
+
# Neither is ever persisted.
|
|
160
|
+
custom_endpoints_json: Optional[str] = None
|
|
161
|
+
endpoint_url: Optional[str] = None
|
|
162
|
+
endpoint_style: Optional[str] = None
|
|
163
|
+
endpoint_api_key: Optional[str] = None
|
|
164
|
+
endpoint_context: Optional[str] = None
|
|
165
|
+
endpoint_max_output: Optional[str] = None
|
|
166
|
+
endpoint_vision: bool = False
|
|
167
|
+
endpoint_thinking: Optional[str] = None
|
|
168
|
+
endpoint_reasoning: Optional[str] = None
|
|
169
|
+
endpoint_temperature: Optional[str] = None
|
|
124
170
|
|
|
125
171
|
|
|
126
172
|
def load_cli_env(project_path: Path, env: Optional[Mapping[str, str]] = None) -> dict[str, str]:
|
|
@@ -134,6 +180,108 @@ def load_cli_env(project_path: Path, env: Optional[Mapping[str, str]] = None) ->
|
|
|
134
180
|
return dict(env if env is not None else os.environ)
|
|
135
181
|
|
|
136
182
|
|
|
183
|
+
def _parse_endpoints_json(raw: str, source: str) -> dict[str, dict]:
|
|
184
|
+
try:
|
|
185
|
+
parsed = json.loads(raw)
|
|
186
|
+
except json.JSONDecodeError as exc:
|
|
187
|
+
raise CliConfigError(f"{source} must be valid JSON: {exc.msg}") from exc
|
|
188
|
+
if not isinstance(parsed, dict) or not all(
|
|
189
|
+
isinstance(endpoint_id, str) and isinstance(entry, dict) for endpoint_id, entry in parsed.items()
|
|
190
|
+
):
|
|
191
|
+
raise CliConfigError(f"{source} must be a JSON object of endpoint definitions.")
|
|
192
|
+
return dict(parsed)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _flat_endpoint_fields(env: Mapping[str, str], overrides: CliConfigOverrides) -> dict[str, str]:
|
|
196
|
+
fields: dict[str, str] = {}
|
|
197
|
+
for name, env_key, value in (
|
|
198
|
+
("api_style", ENDPOINT_STYLE_ENV, overrides.endpoint_style),
|
|
199
|
+
("api_key", ENDPOINT_API_KEY_ENV, overrides.endpoint_api_key),
|
|
200
|
+
("context_length", ENDPOINT_CONTEXT_ENV, overrides.endpoint_context),
|
|
201
|
+
("max_output_tokens", ENDPOINT_MAX_OUTPUT_ENV, overrides.endpoint_max_output),
|
|
202
|
+
("thinking", ENDPOINT_THINKING_ENV, overrides.endpoint_thinking),
|
|
203
|
+
("reasoning_replay", ENDPOINT_REASONING_ENV, overrides.endpoint_reasoning),
|
|
204
|
+
("temperature", ENDPOINT_TEMPERATURE_ENV, overrides.endpoint_temperature),
|
|
205
|
+
):
|
|
206
|
+
resolved = value or env.get(env_key)
|
|
207
|
+
if resolved:
|
|
208
|
+
fields[name] = resolved
|
|
209
|
+
return fields
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _cli_endpoint(url: str, env: Mapping[str, str], overrides: CliConfigOverrides) -> dict[str, Any]:
|
|
213
|
+
"""Build the ephemeral `custom:cli` endpoint from --endpoint-url and friends."""
|
|
214
|
+
if not url.strip():
|
|
215
|
+
raise CliConfigError("--endpoint-url/KOLEGA_CODE_ENDPOINT_URL must not be empty.")
|
|
216
|
+
if not url.startswith(("http://", "https://")):
|
|
217
|
+
raise CliConfigError(f"--endpoint-url must be an http(s) URL, got '{url}'.")
|
|
218
|
+
flat = _flat_endpoint_fields(env, overrides)
|
|
219
|
+
api_style = flat.get("api_style", "openai_chat")
|
|
220
|
+
if api_style not in API_STYLES:
|
|
221
|
+
raise CliConfigError(f"Unsupported endpoint style '{api_style}'. Valid styles: {', '.join(API_STYLES)}")
|
|
222
|
+
entry: dict[str, Any] = {"api_style": api_style, "base_url": url.rstrip("/")}
|
|
223
|
+
if flat.get("api_key"):
|
|
224
|
+
entry["api_key"] = flat["api_key"]
|
|
225
|
+
for key, flag in (("context_length", "context"), ("max_output_tokens", "max-output")):
|
|
226
|
+
raw = flat.get(key)
|
|
227
|
+
if raw is None:
|
|
228
|
+
continue
|
|
229
|
+
try:
|
|
230
|
+
value = int(raw)
|
|
231
|
+
except ValueError:
|
|
232
|
+
value = 0
|
|
233
|
+
if value <= 0:
|
|
234
|
+
raise CliConfigError(f"--endpoint-{flag} must be a positive integer, got '{raw}'.")
|
|
235
|
+
entry[key] = value
|
|
236
|
+
raw_temperature = flat.get("temperature")
|
|
237
|
+
if raw_temperature is not None:
|
|
238
|
+
try:
|
|
239
|
+
temperature = float(raw_temperature)
|
|
240
|
+
except ValueError:
|
|
241
|
+
temperature = 0.0
|
|
242
|
+
if not (0 < temperature <= 2):
|
|
243
|
+
raise CliConfigError(f"--endpoint-temperature must be between 0 and 2, got '{raw_temperature}'.")
|
|
244
|
+
entry["temperature"] = temperature
|
|
245
|
+
thinking = flat.get("thinking")
|
|
246
|
+
if thinking:
|
|
247
|
+
if thinking not in CUSTOM_THINKING_PRESETS:
|
|
248
|
+
valid = ", ".join(sorted(CUSTOM_THINKING_PRESETS))
|
|
249
|
+
raise CliConfigError(f"Unsupported --endpoint-thinking '{thinking}'. Valid modes: {valid}")
|
|
250
|
+
preset = CUSTOM_THINKING_PRESETS[thinking]
|
|
251
|
+
if preset["budgets_required"]:
|
|
252
|
+
raise CliConfigError(
|
|
253
|
+
f"--endpoint-thinking {thinking} needs per-effort budgets; define it with --custom-endpoints JSON."
|
|
254
|
+
)
|
|
255
|
+
entry["thinking"] = {"mode": thinking, "options": list(preset["options"]), "default": preset["default"]}
|
|
256
|
+
reasoning = flat.get("reasoning_replay")
|
|
257
|
+
if reasoning:
|
|
258
|
+
if reasoning not in REASONING_REPLAY_VALUES:
|
|
259
|
+
valid = ", ".join(REASONING_REPLAY_VALUES)
|
|
260
|
+
raise CliConfigError(f"Unsupported --endpoint-reasoning '{reasoning}'. Valid values: {valid}")
|
|
261
|
+
entry["reasoning_replay"] = reasoning
|
|
262
|
+
if overrides.endpoint_vision or env.get(ENDPOINT_VISION_ENV):
|
|
263
|
+
entry["supports_vision"] = True
|
|
264
|
+
return entry
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def _merged_custom_endpoints(
|
|
268
|
+
env: Mapping[str, str],
|
|
269
|
+
overrides: CliConfigOverrides,
|
|
270
|
+
settings: Optional[CliSettings],
|
|
271
|
+
) -> dict[str, dict]:
|
|
272
|
+
"""Custom endpoints from settings.json overlaid with env JSON then flag JSON (per id)."""
|
|
273
|
+
merged: dict[str, dict] = dict(settings.custom_endpoints) if settings else {}
|
|
274
|
+
env_json = env.get(CUSTOM_ENDPOINTS_ENV)
|
|
275
|
+
if env_json:
|
|
276
|
+
merged.update(_parse_endpoints_json(env_json, CUSTOM_ENDPOINTS_ENV))
|
|
277
|
+
if overrides.custom_endpoints_json:
|
|
278
|
+
merged.update(_parse_endpoints_json(overrides.custom_endpoints_json, "--custom-endpoints"))
|
|
279
|
+
endpoint_url = overrides.endpoint_url or env.get(ENDPOINT_URL_ENV)
|
|
280
|
+
if endpoint_url:
|
|
281
|
+
merged[CLI_ENDPOINT_ID] = _cli_endpoint(endpoint_url, env, overrides)
|
|
282
|
+
return merged
|
|
283
|
+
|
|
284
|
+
|
|
137
285
|
def _provider(value: str) -> ModelProvider:
|
|
138
286
|
try:
|
|
139
287
|
return ModelProvider(value.lower())
|
|
@@ -197,6 +345,13 @@ def _ensure_explicit_model_supported(
|
|
|
197
345
|
provider_source: Optional[str],
|
|
198
346
|
) -> None:
|
|
199
347
|
"""Raise a targeted error when an explicit model is paired with the wrong provider."""
|
|
348
|
+
if is_custom_provider(provider) and not model_is_known(provider, model):
|
|
349
|
+
# A custom provider resolves any model only through its endpoint's
|
|
350
|
+
# wildcard; its absence here means the endpoint is not defined.
|
|
351
|
+
raise CliConfigError(
|
|
352
|
+
f"Custom endpoint '{custom_endpoint_id(provider)}' is not defined. Add it under custom_endpoints in "
|
|
353
|
+
"settings.json, or via --custom-endpoints/--endpoint-url for this session."
|
|
354
|
+
)
|
|
200
355
|
if model_is_known(provider, model):
|
|
201
356
|
return
|
|
202
357
|
|
|
@@ -226,7 +381,13 @@ def _api_key_for_provider(
|
|
|
226
381
|
provider: ModelProvider,
|
|
227
382
|
env: Mapping[str, str],
|
|
228
383
|
settings: Optional[CliSettings],
|
|
384
|
+
custom_endpoints: Optional[Mapping[str, Any]] = None,
|
|
229
385
|
) -> Optional[str]:
|
|
386
|
+
endpoint_id = custom_endpoint_id(provider)
|
|
387
|
+
if endpoint_id is not None:
|
|
388
|
+
merged = custom_endpoints or _merged_custom_endpoints(env, CliConfigOverrides(), settings)
|
|
389
|
+
entry = merged.get(endpoint_id) or {}
|
|
390
|
+
return entry.get("api_key") or None
|
|
230
391
|
env_name = API_KEY_ENV.get(provider)
|
|
231
392
|
if env_name and env.get(env_name):
|
|
232
393
|
return env[env_name]
|
|
@@ -451,16 +612,20 @@ def _validate_strict_context_budget_limits(
|
|
|
451
612
|
)
|
|
452
613
|
|
|
453
614
|
|
|
454
|
-
def _coerce_known_model(provider: ModelProvider, model: Optional[str]) -> str:
|
|
615
|
+
def _coerce_known_model(provider: ModelProvider, model: Optional[str]) -> Optional[str]:
|
|
455
616
|
"""Return ``model`` if it's a known spec for ``provider``, else the default.
|
|
456
617
|
|
|
457
618
|
Guards against a settings.json that points at a model which has since been
|
|
458
619
|
renamed or removed (e.g. an old ChatGPT slug): without this, config building
|
|
459
620
|
raises and the TUI disables the composer, locking the user out. Wildcard-
|
|
460
|
-
addressed models (Tinker checkpoint paths) count as known
|
|
621
|
+
addressed models (Tinker checkpoint paths, custom endpoints) count as known
|
|
622
|
+
and are kept. A custom provider whose endpoint was deleted has no default:
|
|
623
|
+
return None so the caller degrades to unconfigured.
|
|
461
624
|
"""
|
|
462
625
|
if model and model_is_known(provider, model):
|
|
463
626
|
return model
|
|
627
|
+
if is_custom_provider(provider):
|
|
628
|
+
return None
|
|
464
629
|
return default_model_for_provider(provider)
|
|
465
630
|
|
|
466
631
|
|
|
@@ -468,6 +633,7 @@ def _active_provider_model(
|
|
|
468
633
|
env: Mapping[str, str],
|
|
469
634
|
overrides: CliConfigOverrides,
|
|
470
635
|
settings: Optional[CliSettings],
|
|
636
|
+
default_custom_provider: Optional[str] = None,
|
|
471
637
|
) -> tuple[Optional[ModelProvider], Optional[str]]:
|
|
472
638
|
provider_value, provider_source = _explicit_value(overrides.provider, env, "KOLEGA_CODE_PROVIDER", "--provider")
|
|
473
639
|
model_value, model_source = _explicit_value(overrides.model, env, "KOLEGA_CODE_MODEL", "--model")
|
|
@@ -475,7 +641,11 @@ def _active_provider_model(
|
|
|
475
641
|
if provider_value or model_value:
|
|
476
642
|
if not provider_value:
|
|
477
643
|
assert model_value is not None
|
|
478
|
-
|
|
644
|
+
if default_custom_provider:
|
|
645
|
+
provider_value = default_custom_provider
|
|
646
|
+
provider_source = None
|
|
647
|
+
else:
|
|
648
|
+
_require_provider_for_model(model_value, model_source, "--provider or KOLEGA_CODE_PROVIDER")
|
|
479
649
|
if not model_value:
|
|
480
650
|
_require_model_for_provider(provider_value, provider_source, "--model or KOLEGA_CODE_MODEL")
|
|
481
651
|
provider = _provider(provider_value)
|
|
@@ -492,7 +662,10 @@ def _active_provider_model(
|
|
|
492
662
|
provider = _provider(settings.active_provider)
|
|
493
663
|
except CliConfigError:
|
|
494
664
|
return None, None
|
|
495
|
-
|
|
665
|
+
model = _coerce_known_model(provider, settings.active_model)
|
|
666
|
+
if model is None:
|
|
667
|
+
return None, None
|
|
668
|
+
return provider, model
|
|
496
669
|
|
|
497
670
|
return None, None
|
|
498
671
|
|
|
@@ -506,6 +679,7 @@ def _slot_provider_model(
|
|
|
506
679
|
active_provider: ModelProvider,
|
|
507
680
|
active_model: str,
|
|
508
681
|
saved: Optional[Mapping[str, str]] = None,
|
|
682
|
+
default_custom_provider: Optional[str] = None,
|
|
509
683
|
) -> tuple[ModelProvider, str]:
|
|
510
684
|
"""Resolve one operational slot: CLI flag > env var > saved slot > active model.
|
|
511
685
|
|
|
@@ -531,7 +705,11 @@ def _slot_provider_model(
|
|
|
531
705
|
if provider_value and not model_value:
|
|
532
706
|
_require_model_for_provider(provider_value, provider_source, f"{model_flag} or {model_env_key}")
|
|
533
707
|
if model_value and not provider_value:
|
|
534
|
-
|
|
708
|
+
if default_custom_provider:
|
|
709
|
+
provider_value = default_custom_provider
|
|
710
|
+
provider_source = None
|
|
711
|
+
else:
|
|
712
|
+
_require_provider_for_model(model_value, model_source, f"{provider_flag} or {provider_env_key}")
|
|
535
713
|
|
|
536
714
|
if provider_value:
|
|
537
715
|
assert model_value is not None
|
|
@@ -549,18 +727,42 @@ def _slot_provider_model(
|
|
|
549
727
|
if saved_provider and saved_model:
|
|
550
728
|
provider = _provider(saved_provider)
|
|
551
729
|
if not model_is_known(provider, saved_model):
|
|
730
|
+
if is_custom_provider(provider):
|
|
731
|
+
# Endpoint deleted from settings: drop the override, inherit the active.
|
|
732
|
+
return active_provider, active_model
|
|
552
733
|
saved_model = default_model_for_provider(provider)
|
|
553
734
|
return provider, saved_model
|
|
554
735
|
|
|
555
736
|
return active_provider, active_model
|
|
556
737
|
|
|
557
738
|
|
|
558
|
-
def _model_config(
|
|
739
|
+
def _model_config(
|
|
740
|
+
provider: ModelProvider,
|
|
741
|
+
model: str,
|
|
742
|
+
thinking_effort: Optional[str] = None,
|
|
743
|
+
custom_endpoints: Optional[Mapping[str, Any]] = None,
|
|
744
|
+
) -> ModelConfig:
|
|
745
|
+
endpoint_id = custom_endpoint_id(provider)
|
|
746
|
+
if endpoint_id is not None and endpoint_id not in (custom_endpoints or {}):
|
|
747
|
+
raise CliConfigError(
|
|
748
|
+
f"Custom endpoint '{endpoint_id}' is not defined. Add it under custom_endpoints in settings.json, "
|
|
749
|
+
"or via --custom-endpoints/--endpoint-url for this session."
|
|
750
|
+
)
|
|
559
751
|
try:
|
|
560
|
-
get_model_specs(provider, model)
|
|
752
|
+
specs = get_model_specs(provider, model)
|
|
561
753
|
resolved_thinking_effort = normalize_thinking_effort(provider, model, thinking_effort)
|
|
562
754
|
except ValueError as exc:
|
|
563
755
|
raise CliConfigError(str(exc)) from exc
|
|
756
|
+
if endpoint_id is not None:
|
|
757
|
+
thinking_spec = specs.get("thinking_effort")
|
|
758
|
+
if thinking_spec is not None and thinking_spec.mode == "anthropic_budget":
|
|
759
|
+
cap = specs["max_completion_tokens"]
|
|
760
|
+
over = [f"{option}={budget}" for option, budget in thinking_spec.budgets.items() if budget >= cap]
|
|
761
|
+
if over:
|
|
762
|
+
raise CliConfigError(
|
|
763
|
+
f"Custom endpoint '{endpoint_id}': anthropic_budget budgets must stay below max_output_tokens "
|
|
764
|
+
f"({cap}); over-limit: {', '.join(over)}."
|
|
765
|
+
)
|
|
564
766
|
|
|
565
767
|
return ModelConfig(
|
|
566
768
|
provider=provider,
|
|
@@ -602,6 +804,7 @@ def _agent_role_env_keys(role: AgentRole) -> tuple[str, str, str]:
|
|
|
602
804
|
def _agent_model_overrides(
|
|
603
805
|
env: Mapping[str, str],
|
|
604
806
|
settings: Optional[CliSettings],
|
|
807
|
+
custom_endpoints: Optional[Mapping[str, Any]] = None,
|
|
605
808
|
) -> dict[str, ModelConfig]:
|
|
606
809
|
"""Resolve per-agent-role model overrides from env vars over saved settings.
|
|
607
810
|
|
|
@@ -640,8 +843,13 @@ def _agent_model_overrides(
|
|
|
640
843
|
provider_source=provider_key if provider_env_value else None,
|
|
641
844
|
)
|
|
642
845
|
elif not model_is_known(provider, model_value):
|
|
846
|
+
if is_custom_provider(provider):
|
|
847
|
+
# Endpoint deleted from settings: drop the override, role inherits.
|
|
848
|
+
continue
|
|
643
849
|
model_value = default_model_for_provider(provider)
|
|
644
|
-
overrides[role.value] = _model_config(
|
|
850
|
+
overrides[role.value] = _model_config(
|
|
851
|
+
provider, model_value, thinking_effort=effort_value, custom_endpoints=custom_endpoints
|
|
852
|
+
)
|
|
645
853
|
return overrides
|
|
646
854
|
|
|
647
855
|
|
|
@@ -663,7 +871,18 @@ def build_agent_config(
|
|
|
663
871
|
if "KOLEGA_CODE_THINKING_TOKENS" in loaded_env:
|
|
664
872
|
raise CliConfigError(DEPRECATED_THINKING_TOKENS_MESSAGE)
|
|
665
873
|
|
|
666
|
-
|
|
874
|
+
if not (overrides.endpoint_url or loaded_env.get(ENDPOINT_URL_ENV)) and (
|
|
875
|
+
_flat_endpoint_fields(loaded_env, overrides) or overrides.endpoint_vision
|
|
876
|
+
):
|
|
877
|
+
raise CliConfigError("--endpoint-* flags require --endpoint-url or KOLEGA_CODE_ENDPOINT_URL.")
|
|
878
|
+
|
|
879
|
+
merged_endpoints = _merged_custom_endpoints(loaded_env, overrides, settings)
|
|
880
|
+
sync_custom_endpoint_specs(merged_endpoints)
|
|
881
|
+
default_custom_provider = CLI_ENDPOINT_PROVIDER if CLI_ENDPOINT_ID in merged_endpoints else None
|
|
882
|
+
|
|
883
|
+
active_provider, active_model = _active_provider_model(
|
|
884
|
+
loaded_env, overrides, settings, default_custom_provider=default_custom_provider
|
|
885
|
+
)
|
|
667
886
|
if active_provider is None or active_model is None:
|
|
668
887
|
raise CliConfigError(MISSING_MODEL_SELECTION_MESSAGE)
|
|
669
888
|
|
|
@@ -675,6 +894,7 @@ def build_agent_config(
|
|
|
675
894
|
overrides.model,
|
|
676
895
|
active_provider,
|
|
677
896
|
active_model,
|
|
897
|
+
default_custom_provider=default_custom_provider,
|
|
678
898
|
)
|
|
679
899
|
fast_provider, fast_model = _slot_provider_model(
|
|
680
900
|
loaded_env,
|
|
@@ -694,7 +914,7 @@ def build_agent_config(
|
|
|
694
914
|
settings,
|
|
695
915
|
)
|
|
696
916
|
|
|
697
|
-
agent_model_overrides = _agent_model_overrides(loaded_env, settings)
|
|
917
|
+
agent_model_overrides = _agent_model_overrides(loaded_env, settings, custom_endpoints=merged_endpoints)
|
|
698
918
|
web_search_backend, web_search_api_key, web_search_base_url = _search_config(loaded_env, settings)
|
|
699
919
|
web_search_mode = _web_search_mode(loaded_env, settings, overrides.web_search_mode)
|
|
700
920
|
compression_threshold = _compression_threshold(loaded_env, settings, overrides.compression_threshold)
|
|
@@ -709,12 +929,13 @@ def build_agent_config(
|
|
|
709
929
|
|
|
710
930
|
required_providers = {long_provider, fast_provider}
|
|
711
931
|
required_providers.update(override.provider for override in agent_model_overrides.values())
|
|
712
|
-
# API-key providers: env/settings key required. OAuth
|
|
713
|
-
#
|
|
932
|
+
# API-key providers: env/settings key required. OAuth, local, and custom
|
|
933
|
+
# endpoint providers are exempt (endpoint keys are optional).
|
|
714
934
|
missing_keys = [
|
|
715
935
|
API_KEY_ENV[provider]
|
|
716
936
|
for provider in sorted(required_providers, key=lambda item: item.value)
|
|
717
937
|
if provider != ModelProvider.LLAMA
|
|
938
|
+
and not is_custom_provider(provider)
|
|
718
939
|
and provider not in OAUTH_PROVIDERS
|
|
719
940
|
and not _api_key_for_provider(provider, loaded_env, settings)
|
|
720
941
|
]
|
|
@@ -752,9 +973,15 @@ def build_agent_config(
|
|
|
752
973
|
thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
|
|
753
974
|
environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
|
|
754
975
|
edit_protocol=edit_protocol,
|
|
755
|
-
long_context_config=_model_config(
|
|
756
|
-
|
|
976
|
+
long_context_config=_model_config(
|
|
977
|
+
long_provider, long_model, thinking_effort=active_thinking_effort, custom_endpoints=merged_endpoints
|
|
978
|
+
),
|
|
979
|
+
fast_config=_model_config(fast_provider, fast_model, custom_endpoints=merged_endpoints),
|
|
757
980
|
agent_models=agent_model_overrides,
|
|
981
|
+
custom_endpoints={
|
|
982
|
+
endpoint_id: CustomEndpointConfig.model_validate(entry)
|
|
983
|
+
for endpoint_id, entry in merged_endpoints.items()
|
|
984
|
+
},
|
|
758
985
|
web_search_mode=web_search_mode,
|
|
759
986
|
web_search_backend=web_search_backend,
|
|
760
987
|
web_search_api_key=web_search_api_key,
|
|
@@ -790,6 +1017,13 @@ def build_agent_config(
|
|
|
790
1017
|
# to settings.json (only possible when a store is supplied by the caller).
|
|
791
1018
|
if chatgpt_tokens is not None and settings is not None and settings_store is not None:
|
|
792
1019
|
config.attach_chatgpt_token_manager(_build_chatgpt_token_manager(chatgpt_tokens, settings, settings_store))
|
|
1020
|
+
|
|
1021
|
+
# Keep the UI picker registry in sync with the endpoints resolved for this
|
|
1022
|
+
# process (includes env/flag-defined ones for the session).
|
|
1023
|
+
set_custom_provider_labels(
|
|
1024
|
+
{endpoint_id: endpoint.label or endpoint_id for endpoint_id, endpoint in config.custom_endpoints.items()}
|
|
1025
|
+
)
|
|
1026
|
+
rebuild_ui_model_options()
|
|
793
1027
|
return config
|
|
794
1028
|
|
|
795
1029
|
|
|
@@ -798,6 +1032,19 @@ def key_status(provider: str, project_path: Path, settings: Optional[CliSettings
|
|
|
798
1032
|
provider_value = _provider(provider)
|
|
799
1033
|
if provider_value == ModelProvider.LLAMA:
|
|
800
1034
|
return "not required for the local provider"
|
|
1035
|
+
endpoint_id = custom_endpoint_id(provider_value)
|
|
1036
|
+
if endpoint_id is not None:
|
|
1037
|
+
env = load_cli_env(project_path)
|
|
1038
|
+
merged = _merged_custom_endpoints(env, CliConfigOverrides(), settings)
|
|
1039
|
+
entry = merged.get(endpoint_id) or {}
|
|
1040
|
+
if endpoint_id not in merged:
|
|
1041
|
+
return "endpoint not defined"
|
|
1042
|
+
if entry.get("api_key"):
|
|
1043
|
+
saved_entry = (settings.custom_endpoints if settings else {}).get(endpoint_id) or {}
|
|
1044
|
+
if saved_entry.get("api_key") == entry["api_key"]:
|
|
1045
|
+
return "present in local settings"
|
|
1046
|
+
return "present via environment override"
|
|
1047
|
+
return "key not set (optional)"
|
|
801
1048
|
if provider_value in OAUTH_PROVIDERS:
|
|
802
1049
|
if settings and settings.has_oauth_token(provider_value.value):
|
|
803
1050
|
token = settings.get_oauth_token(provider_value.value) or {}
|
|
@@ -842,6 +1089,14 @@ def active_model_override_message(
|
|
|
842
1089
|
"""Describe an explicit CLI/process-env active-model override, if one is in effect."""
|
|
843
1090
|
overrides = overrides or CliConfigOverrides()
|
|
844
1091
|
loaded_env = load_cli_env(project_path, env)
|
|
1092
|
+
endpoint_override = any(
|
|
1093
|
+
(
|
|
1094
|
+
overrides.custom_endpoints_json,
|
|
1095
|
+
overrides.endpoint_url,
|
|
1096
|
+
loaded_env.get(CUSTOM_ENDPOINTS_ENV),
|
|
1097
|
+
loaded_env.get(ENDPOINT_URL_ENV),
|
|
1098
|
+
)
|
|
1099
|
+
)
|
|
845
1100
|
explicit_active_override = any(
|
|
846
1101
|
(
|
|
847
1102
|
overrides.provider,
|
|
@@ -850,14 +1105,18 @@ def active_model_override_message(
|
|
|
850
1105
|
loaded_env.get("KOLEGA_CODE_MODEL"),
|
|
851
1106
|
)
|
|
852
1107
|
)
|
|
853
|
-
if not explicit_active_override:
|
|
1108
|
+
if not explicit_active_override and not endpoint_override:
|
|
854
1109
|
return None
|
|
855
1110
|
if not settings or not (settings.active_provider and settings.active_model):
|
|
1111
|
+
if endpoint_override and is_custom_provider(config.long_context_config.provider):
|
|
1112
|
+
return "CLI/environment-defined custom endpoints apply to this session."
|
|
856
1113
|
return None
|
|
857
1114
|
|
|
858
1115
|
effective_provider = config.long_context_config.provider.value
|
|
859
1116
|
effective_model = config.long_context_config.model
|
|
860
1117
|
if settings.active_provider == effective_provider and settings.active_model == effective_model:
|
|
1118
|
+
if endpoint_override and is_custom_provider(config.long_context_config.provider):
|
|
1119
|
+
return "CLI/environment-defined custom endpoints apply to this session."
|
|
861
1120
|
return None
|
|
862
1121
|
|
|
863
1122
|
return (
|