kolega-code 0.35.1__tar.gz → 0.36.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.35.1 → kolega_code-0.36.0}/CHANGELOG.md +27 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/PKG-INFO +1 -1
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/__init__.py +1 -1
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/main.py +19 -1
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/provider_registry.py +1 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/settings_panel.py +128 -2
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/settings_screen.py +20 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/bridge.py +35 -7
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/openai.py +15 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +17 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/mcp/config.py +73 -2
- kolega_code-0.36.0/kolega_code/mcp/oauth.py +403 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/mcp/service.py +22 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/mcp/state.py +12 -1
- {kolega_code-0.35.1 → kolega_code-0.36.0}/pyproject.toml +1 -1
- kolega_code-0.35.1/kolega_code/mcp/oauth.py +0 -241
- {kolega_code-0.35.1 → kolega_code-0.36.0}/.gitignore +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/MIGRATION.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/README.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/RELEASING.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/agent_factory.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/bridge.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/diffs.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/permissions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/plans.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/questions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/server.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/session.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/acp/usage.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/baseagent.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/handoff.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/session_metadata.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/acp.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/config.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/gateway.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/messages.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/peer_messaging.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/prompt_history.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/command_handlers.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/config.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/events.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/access.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/adapters/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/adapters/base.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/adapters/echo.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/adapters/telegram/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/adapters/telegram/adapter.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/adapters/telegram/formatting.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/commands.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/config.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/control_relay.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/daemon.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/event_router.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/questions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/redaction.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/router.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/service.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/sessions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/gateway/stt.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/client.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/groq.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/llm/usage.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/inbox.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/tools/ask_user.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.35.1 → kolega_code-0.36.0}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,33 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.36.0 - 2026-09-07
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **GPT-6 Astra.** OpenAI's new flagship model is available on both the API
|
|
14
|
+
and ChatGPT-subscription providers: 1M-token context with 128K output,
|
|
15
|
+
vision, hosted web search, `codex_apply_patch` editing, and
|
|
16
|
+
`low`–`max` reasoning effort levels (default `medium`). The
|
|
17
|
+
ChatGPT-subscription route keeps the conservative 400K input budget until
|
|
18
|
+
Astra's larger window is verified on the Codex backend.
|
|
19
|
+
- **Pre-registered OAuth credentials for remote MCP servers.** Servers that
|
|
20
|
+
don't implement Dynamic Client Registration (HubSpot, Slack, GitHub
|
|
21
|
+
Copilot, enterprise IdPs) can now be connected with a pre-registered
|
|
22
|
+
client: new `--oauth-client-id`, `--oauth-client-secret`,
|
|
23
|
+
`--oauth-client-secret-env`, and `--oauth-auth-method` flags on
|
|
24
|
+
`kolega-code mcp add`, matching OAuth controls on the MCP page in TUI
|
|
25
|
+
settings, preserved explicit redirect ports/hosts, actionable diagnostics
|
|
26
|
+
when registration fails, and PBKDF2-salted OAuth cache fingerprints with
|
|
27
|
+
refresh tokens preserved across reconnects.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **Gateway (Telegram):** the typing indicator now stays alive for the whole
|
|
32
|
+
turn. Telegram expires typing actions after ~5 seconds, so it previously
|
|
33
|
+
vanished during exactly the stretches where feedback matters — model
|
|
34
|
+
thinking before the first chunk and long-running tool calls.
|
|
35
|
+
|
|
9
36
|
## 0.35.1 - 2026-09-03
|
|
10
37
|
|
|
11
38
|
### Fixed
|
|
@@ -796,6 +796,14 @@ def _build_subcommand_parser() -> argparse.ArgumentParser:
|
|
|
796
796
|
add.add_argument("--env", action="append", default=[], help="Environment variable as NAME=VALUE (repeatable).")
|
|
797
797
|
add.add_argument("--cwd", help="Working directory for stdio command; relative paths resolve under project.")
|
|
798
798
|
add.add_argument("--oauth", action="store_true", help="Enable OAuth for this HTTP MCP server.")
|
|
799
|
+
add.add_argument("--oauth-client-id", help="Pre-registered OAuth client ID.")
|
|
800
|
+
add.add_argument("--oauth-client-secret", help="Pre-registered OAuth client secret.")
|
|
801
|
+
add.add_argument("--oauth-client-secret-env", help="Environment variable name holding the OAuth client secret.")
|
|
802
|
+
add.add_argument(
|
|
803
|
+
"--oauth-auth-method",
|
|
804
|
+
choices=["client_secret_post", "client_secret_basic", "none"],
|
|
805
|
+
help="Token endpoint authentication method.",
|
|
806
|
+
)
|
|
799
807
|
add.add_argument("--oauth-scope", help="OAuth scopes to request.")
|
|
800
808
|
add.add_argument("--redirect-uri", help="OAuth redirect URI; defaults to an ephemeral localhost callback.")
|
|
801
809
|
add.add_argument("--disabled", action="store_true", help="Add the server disabled.")
|
|
@@ -2697,6 +2705,12 @@ def _mcp_mutation_target(args: argparse.Namespace, project_path: Path, state_dir
|
|
|
2697
2705
|
def _server_config_from_add_args(args: argparse.Namespace) -> MCPServerConfig:
|
|
2698
2706
|
headers = _parse_key_value_options(getattr(args, "header", []) or [], "--header")
|
|
2699
2707
|
env = _parse_key_value_options(getattr(args, "env", []) or [], "--env")
|
|
2708
|
+
oauth_client_id = getattr(args, "oauth_client_id", None)
|
|
2709
|
+
oauth_client_secret = getattr(args, "oauth_client_secret", None)
|
|
2710
|
+
oauth_client_secret_env = getattr(args, "oauth_client_secret_env", None)
|
|
2711
|
+
oauth_auth_method = getattr(args, "oauth_auth_method", None)
|
|
2712
|
+
oauth_enabled = bool(args.oauth) or bool(oauth_client_id or oauth_client_secret or oauth_client_secret_env)
|
|
2713
|
+
|
|
2700
2714
|
payload: dict[str, Any] = {
|
|
2701
2715
|
"id": args.server_id,
|
|
2702
2716
|
"name": args.name,
|
|
@@ -2709,9 +2723,13 @@ def _server_config_from_add_args(args: argparse.Namespace) -> MCPServerConfig:
|
|
|
2709
2723
|
"env": env,
|
|
2710
2724
|
"cwd": args.cwd,
|
|
2711
2725
|
"oauth": {
|
|
2712
|
-
"enabled":
|
|
2726
|
+
"enabled": oauth_enabled,
|
|
2713
2727
|
"scope": args.oauth_scope,
|
|
2714
2728
|
"redirect_uri": args.redirect_uri,
|
|
2729
|
+
"client_id": oauth_client_id,
|
|
2730
|
+
"client_secret": oauth_client_secret,
|
|
2731
|
+
"client_secret_env": oauth_client_secret_env,
|
|
2732
|
+
"token_endpoint_auth_method": oauth_auth_method,
|
|
2715
2733
|
},
|
|
2716
2734
|
}
|
|
2717
2735
|
return MCPServerConfig.model_validate(payload)
|
|
@@ -90,6 +90,7 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
90
90
|
"claude-opus-4-5-20251101": "Claude Opus 4.5",
|
|
91
91
|
"claude-haiku-4-5-20251001": "Claude Haiku 4.5",
|
|
92
92
|
# OpenAI (shared labels across the API and ChatGPT-subscription providers)
|
|
93
|
+
"gpt-6-astra": "GPT-6 Astra",
|
|
93
94
|
"gpt-5.6-sol": "GPT-5.6 Sol",
|
|
94
95
|
"gpt-5.6-terra": "GPT-5.6 Terra",
|
|
95
96
|
"gpt-5.6-luna": "GPT-5.6 Luna",
|
|
@@ -104,6 +104,12 @@ MCP_TRANSPORT_OPTIONS = [
|
|
|
104
104
|
("stdio command", "stdio"),
|
|
105
105
|
]
|
|
106
106
|
MCP_ENABLED_OPTIONS = [("Enabled", "true"), ("Disabled", "false")]
|
|
107
|
+
MCP_OAUTH_AUTH_METHOD_OPTIONS = [
|
|
108
|
+
("Auto (POST if secret, none if public)", "auto"),
|
|
109
|
+
("client_secret_post", "client_secret_post"),
|
|
110
|
+
("client_secret_basic", "client_secret_basic"),
|
|
111
|
+
("none (public client / PKCE)", "none"),
|
|
112
|
+
]
|
|
107
113
|
MCP_STATUS_MESSAGE_MAX = 96
|
|
108
114
|
MCP_STATUS_NAME_MAX = 34
|
|
109
115
|
# Compression threshold select: "default" maps to None (the agent's built-in 95%).
|
|
@@ -417,6 +423,16 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
417
423
|
self._update_mcp_transport_fields(str(event.value))
|
|
418
424
|
return
|
|
419
425
|
|
|
426
|
+
if select_id == "mcp_oauth_select":
|
|
427
|
+
transport = "streamable_http"
|
|
428
|
+
try:
|
|
429
|
+
transport = str(self._settings_query_one("#mcp_transport_select", Select).value)
|
|
430
|
+
except NoMatches:
|
|
431
|
+
pass
|
|
432
|
+
http = transport in {"streamable_http", "sse"}
|
|
433
|
+
self._update_mcp_oauth_fields(http and str(event.value) == "true")
|
|
434
|
+
return
|
|
435
|
+
|
|
420
436
|
row = _row_for_widget(select_id)
|
|
421
437
|
if row is not None and select_id == row.provider_id:
|
|
422
438
|
provider = str(event.value)
|
|
@@ -1477,6 +1493,12 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1477
1493
|
set_input("mcp_url_input", "")
|
|
1478
1494
|
set_input("mcp_headers_input", "")
|
|
1479
1495
|
set_select("mcp_oauth_select", "false")
|
|
1496
|
+
set_input("mcp_oauth_client_id_input", "")
|
|
1497
|
+
set_input("mcp_oauth_client_secret_input", "")
|
|
1498
|
+
set_input("mcp_oauth_client_secret_env_input", "")
|
|
1499
|
+
set_input("mcp_oauth_redirect_uri_input", "")
|
|
1500
|
+
set_input("mcp_oauth_scope_input", "")
|
|
1501
|
+
set_select("mcp_oauth_auth_method_select", "auto")
|
|
1480
1502
|
set_input("mcp_command_input", "")
|
|
1481
1503
|
set_input("mcp_args_input", "")
|
|
1482
1504
|
set_input("mcp_env_input", "")
|
|
@@ -1491,6 +1513,12 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1491
1513
|
set_input("mcp_url_input", server.url or "")
|
|
1492
1514
|
set_input("mcp_headers_input", json.dumps(server.headers, sort_keys=True) if server.headers else "")
|
|
1493
1515
|
set_select("mcp_oauth_select", "true" if server.oauth.enabled else "false")
|
|
1516
|
+
set_input("mcp_oauth_client_id_input", server.oauth.client_id or "")
|
|
1517
|
+
set_input("mcp_oauth_client_secret_input", server.oauth.client_secret or "")
|
|
1518
|
+
set_input("mcp_oauth_client_secret_env_input", server.oauth.client_secret_env or "")
|
|
1519
|
+
set_input("mcp_oauth_redirect_uri_input", server.oauth.redirect_uri or "")
|
|
1520
|
+
set_input("mcp_oauth_scope_input", server.oauth.scope or "")
|
|
1521
|
+
set_select("mcp_oauth_auth_method_select", server.oauth.token_endpoint_auth_method or "auto")
|
|
1494
1522
|
set_input("mcp_command_input", server.command or "")
|
|
1495
1523
|
set_input("mcp_args_input", " ".join(shlex.quote(arg) for arg in server.args))
|
|
1496
1524
|
set_input("mcp_env_input", json.dumps(server.env, sort_keys=True) if server.env else "")
|
|
@@ -1503,6 +1531,26 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1503
1531
|
self._set_mcp_source_hint("This server is stored in your global MCP config.")
|
|
1504
1532
|
self._update_mcp_transport_fields(server.transport)
|
|
1505
1533
|
|
|
1534
|
+
def _update_mcp_oauth_fields(self, visible: bool) -> None:
|
|
1535
|
+
for widget_id in (
|
|
1536
|
+
"mcp_oauth_client_id_label",
|
|
1537
|
+
"mcp_oauth_client_id_input",
|
|
1538
|
+
"mcp_oauth_client_secret_label",
|
|
1539
|
+
"mcp_oauth_client_secret_input",
|
|
1540
|
+
"mcp_oauth_client_secret_env_label",
|
|
1541
|
+
"mcp_oauth_client_secret_env_input",
|
|
1542
|
+
"mcp_oauth_redirect_uri_label",
|
|
1543
|
+
"mcp_oauth_redirect_uri_input",
|
|
1544
|
+
"mcp_oauth_scope_label",
|
|
1545
|
+
"mcp_oauth_scope_input",
|
|
1546
|
+
"mcp_oauth_auth_method_label",
|
|
1547
|
+
"mcp_oauth_auth_method_select",
|
|
1548
|
+
):
|
|
1549
|
+
try:
|
|
1550
|
+
self._settings_query_one(f"#{widget_id}").display = visible
|
|
1551
|
+
except NoMatches:
|
|
1552
|
+
pass
|
|
1553
|
+
|
|
1506
1554
|
def _update_mcp_transport_fields(self, transport: str) -> None:
|
|
1507
1555
|
http = transport in {"streamable_http", "sse"}
|
|
1508
1556
|
for widget_id, visible in (
|
|
@@ -1525,6 +1573,12 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1525
1573
|
self._settings_query_one(f"#{widget_id}").display = visible
|
|
1526
1574
|
except NoMatches:
|
|
1527
1575
|
pass
|
|
1576
|
+
oauth_enabled = False
|
|
1577
|
+
try:
|
|
1578
|
+
oauth_enabled = http and str(self._settings_query_one("#mcp_oauth_select", Select).value) == "true"
|
|
1579
|
+
except NoMatches:
|
|
1580
|
+
pass
|
|
1581
|
+
self._update_mcp_oauth_fields(oauth_enabled)
|
|
1528
1582
|
try:
|
|
1529
1583
|
url_input = self._settings_query_one("#mcp_url_input", Input)
|
|
1530
1584
|
if transport == "streamable_http":
|
|
@@ -1621,7 +1675,8 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1621
1675
|
enabled = str(self._settings_query_one("#mcp_enabled_select", Select).value) == "true"
|
|
1622
1676
|
url = self._settings_query_one("#mcp_url_input", Input).value.strip() or None
|
|
1623
1677
|
headers_text = self._settings_query_one("#mcp_headers_input", Input).value.strip()
|
|
1624
|
-
|
|
1678
|
+
http = transport in {"streamable_http", "sse"}
|
|
1679
|
+
oauth_enabled = http and str(self._settings_query_one("#mcp_oauth_select", Select).value) == "true"
|
|
1625
1680
|
command = self._settings_query_one("#mcp_command_input", Input).value.strip() or None
|
|
1626
1681
|
args_text = self._settings_query_one("#mcp_args_input", Input).value.strip()
|
|
1627
1682
|
env_text = self._settings_query_one("#mcp_env_input", Input).value.strip()
|
|
@@ -1640,6 +1695,77 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1640
1695
|
else selected
|
|
1641
1696
|
)
|
|
1642
1697
|
|
|
1698
|
+
oauth_client_id = None
|
|
1699
|
+
oauth_client_secret = None
|
|
1700
|
+
oauth_client_secret_env = None
|
|
1701
|
+
oauth_redirect_uri = None
|
|
1702
|
+
oauth_scope = None
|
|
1703
|
+
oauth_auth_method: Optional[Literal["client_secret_post", "client_secret_basic", "none"]] = None
|
|
1704
|
+
|
|
1705
|
+
if http:
|
|
1706
|
+
try:
|
|
1707
|
+
oauth_client_id = self._settings_query_one("#mcp_oauth_client_id_input", Input).value.strip() or None
|
|
1708
|
+
except NoMatches:
|
|
1709
|
+
pass
|
|
1710
|
+
try:
|
|
1711
|
+
oauth_client_secret = (
|
|
1712
|
+
self._settings_query_one("#mcp_oauth_client_secret_input", Input).value.strip() or None
|
|
1713
|
+
)
|
|
1714
|
+
except NoMatches:
|
|
1715
|
+
pass
|
|
1716
|
+
try:
|
|
1717
|
+
oauth_client_secret_env = (
|
|
1718
|
+
self._settings_query_one("#mcp_oauth_client_secret_env_input", Input).value.strip() or None
|
|
1719
|
+
)
|
|
1720
|
+
except NoMatches:
|
|
1721
|
+
pass
|
|
1722
|
+
try:
|
|
1723
|
+
oauth_redirect_uri = (
|
|
1724
|
+
self._settings_query_one("#mcp_oauth_redirect_uri_input", Input).value.strip() or None
|
|
1725
|
+
)
|
|
1726
|
+
except NoMatches:
|
|
1727
|
+
pass
|
|
1728
|
+
try:
|
|
1729
|
+
oauth_scope = self._settings_query_one("#mcp_oauth_scope_input", Input).value.strip() or None
|
|
1730
|
+
except NoMatches:
|
|
1731
|
+
pass
|
|
1732
|
+
try:
|
|
1733
|
+
method_val = str(self._settings_query_one("#mcp_oauth_auth_method_select", Select).value)
|
|
1734
|
+
if method_val in {"client_secret_post", "client_secret_basic", "none"}:
|
|
1735
|
+
oauth_auth_method = cast(Literal["client_secret_post", "client_secret_basic", "none"], method_val)
|
|
1736
|
+
except NoMatches:
|
|
1737
|
+
pass
|
|
1738
|
+
|
|
1739
|
+
client_name = "Kolega Code"
|
|
1740
|
+
client_uri = None
|
|
1741
|
+
client_metadata_url = None
|
|
1742
|
+
timeout_seconds = 300.0
|
|
1743
|
+
if selected != MCP_NEW_SERVER_VALUE:
|
|
1744
|
+
try:
|
|
1745
|
+
config = self._load_mcp_config_for_ui()
|
|
1746
|
+
existing = config.servers.get(selected)
|
|
1747
|
+
if existing:
|
|
1748
|
+
client_name = existing.oauth.client_name
|
|
1749
|
+
client_uri = existing.oauth.client_uri
|
|
1750
|
+
client_metadata_url = existing.oauth.client_metadata_url
|
|
1751
|
+
timeout_seconds = existing.oauth.timeout_seconds
|
|
1752
|
+
except Exception:
|
|
1753
|
+
pass
|
|
1754
|
+
|
|
1755
|
+
oauth = MCPOAuthConfig(
|
|
1756
|
+
enabled=oauth_enabled,
|
|
1757
|
+
client_id=oauth_client_id,
|
|
1758
|
+
client_secret=oauth_client_secret,
|
|
1759
|
+
client_secret_env=oauth_client_secret_env,
|
|
1760
|
+
redirect_uri=oauth_redirect_uri,
|
|
1761
|
+
scope=oauth_scope,
|
|
1762
|
+
token_endpoint_auth_method=oauth_auth_method,
|
|
1763
|
+
client_name=client_name,
|
|
1764
|
+
client_uri=client_uri,
|
|
1765
|
+
client_metadata_url=client_metadata_url,
|
|
1766
|
+
timeout_seconds=timeout_seconds,
|
|
1767
|
+
)
|
|
1768
|
+
|
|
1643
1769
|
return MCPServerConfig(
|
|
1644
1770
|
id=server_id,
|
|
1645
1771
|
name=name,
|
|
@@ -1647,7 +1773,7 @@ class SettingsPanelMixin(tui_app_base.KolegaAppBase):
|
|
|
1647
1773
|
enabled=enabled,
|
|
1648
1774
|
url=url,
|
|
1649
1775
|
headers=headers,
|
|
1650
|
-
oauth=
|
|
1776
|
+
oauth=oauth,
|
|
1651
1777
|
command=command,
|
|
1652
1778
|
args=args,
|
|
1653
1779
|
env=env,
|
|
@@ -588,6 +588,26 @@ class SettingsScreen(ModalScreen[None]):
|
|
|
588
588
|
allow_blank=False,
|
|
589
589
|
value="false",
|
|
590
590
|
)
|
|
591
|
+
yield Label("OAuth Client ID", id="mcp_oauth_client_id_label")
|
|
592
|
+
yield Input(id="mcp_oauth_client_id_input", placeholder="e.g. client_abc123")
|
|
593
|
+
yield Label("OAuth Client Secret", id="mcp_oauth_client_secret_label")
|
|
594
|
+
yield Input(id="mcp_oauth_client_secret_input", placeholder="optional direct secret", password=True)
|
|
595
|
+
yield Label("OAuth Client Secret Env Var", id="mcp_oauth_client_secret_env_label")
|
|
596
|
+
yield Input(id="mcp_oauth_client_secret_env_input", placeholder="e.g. HUBSPOT_MCP_CLIENT_SECRET")
|
|
597
|
+
yield Label("OAuth Redirect URI", id="mcp_oauth_redirect_uri_label")
|
|
598
|
+
yield Input(
|
|
599
|
+
id="mcp_oauth_redirect_uri_input",
|
|
600
|
+
placeholder="e.g. http://127.0.0.1:33418/callback (default: ephemeral port)",
|
|
601
|
+
)
|
|
602
|
+
yield Label("OAuth Scopes", id="mcp_oauth_scope_label")
|
|
603
|
+
yield Input(id="mcp_oauth_scope_input", placeholder="e.g. read write")
|
|
604
|
+
yield Label("OAuth Token Auth Method", id="mcp_oauth_auth_method_label")
|
|
605
|
+
yield Select(
|
|
606
|
+
settings_panel.MCP_OAUTH_AUTH_METHOD_OPTIONS,
|
|
607
|
+
id="mcp_oauth_auth_method_select",
|
|
608
|
+
allow_blank=False,
|
|
609
|
+
value="auto",
|
|
610
|
+
)
|
|
591
611
|
yield Label("Command", id="mcp_command_label")
|
|
592
612
|
yield Input(id="mcp_command_input", placeholder="npx")
|
|
593
613
|
yield Label("Arguments", id="mcp_args_label")
|
|
@@ -18,7 +18,10 @@ turns:
|
|
|
18
18
|
would surface above the latest text), and the messages persist as a trail
|
|
19
19
|
of what the agent did during the turn;
|
|
20
20
|
- text is chunked at the adapter's limit; the first chunk is the edited
|
|
21
|
-
message and overflow chunks are sent as continuations on finalize
|
|
21
|
+
message and overflow chunks are sent as continuations on finalize;
|
|
22
|
+
- a typing action is re-sent every few seconds for the whole turn (chat
|
|
23
|
+
platforms expire it after ~5s), so thinking and long tool runs keep
|
|
24
|
+
showing "typing…" until the reply lands.
|
|
22
25
|
|
|
23
26
|
Chunk content is *incremental*, so the renderer appends and re-renders the
|
|
24
27
|
accumulated text — it never replaces with the last segment.
|
|
@@ -39,6 +42,10 @@ logger = logging.getLogger(__name__)
|
|
|
39
42
|
|
|
40
43
|
#: Cap on a round message's lines so a chatty turn cannot spam an unbounded edit.
|
|
41
44
|
MAX_STATUS_LINES = 8
|
|
45
|
+
#: Chat platforms expire a typing action after ~5 seconds (Telegram: "status
|
|
46
|
+
#: is set for 5 seconds or less"); refresh slightly faster so the indicator
|
|
47
|
+
#: never lapses while a turn is in progress.
|
|
48
|
+
TYPING_REFRESH_SECONDS = 4.0
|
|
42
49
|
#: Rendered status line: (icon, tool description, tool call id).
|
|
43
50
|
StatusLine = tuple[str, str, str]
|
|
44
51
|
|
|
@@ -54,6 +61,7 @@ class TurnRenderer:
|
|
|
54
61
|
event_queue: asyncio.Queue[AgentEvent],
|
|
55
62
|
chunk_limit: Optional[int] = None,
|
|
56
63
|
edit_throttle_seconds: float = 1.0,
|
|
64
|
+
typing_refresh_seconds: float = TYPING_REFRESH_SECONDS,
|
|
57
65
|
monotonic: Any = time.monotonic,
|
|
58
66
|
) -> None:
|
|
59
67
|
self._adapter = adapter
|
|
@@ -61,6 +69,7 @@ class TurnRenderer:
|
|
|
61
69
|
self._events = event_queue
|
|
62
70
|
self._chunk_limit = chunk_limit or adapter.capabilities.text_chunk_limit
|
|
63
71
|
self._edit_throttle = edit_throttle_seconds
|
|
72
|
+
self._typing_refresh = typing_refresh_seconds
|
|
64
73
|
self._monotonic = monotonic
|
|
65
74
|
# Per-segment state, mirroring the TUI's stream fold: a segment is one
|
|
66
75
|
# contiguous assistant response identified by its chunk uuid (the
|
|
@@ -92,10 +101,12 @@ class TurnRenderer:
|
|
|
92
101
|
reply stays visible.
|
|
93
102
|
"""
|
|
94
103
|
pump: Optional[asyncio.Task[None]] = None
|
|
104
|
+
typing: Optional[asyncio.Task[None]] = None
|
|
95
105
|
if self._events is not None:
|
|
96
106
|
pump = asyncio.create_task(self._event_pump(), name="gateway-turn-event-pump")
|
|
97
107
|
try:
|
|
98
108
|
await self._adapter.set_typing(self._chat_id, True)
|
|
109
|
+
typing = asyncio.create_task(self._typing_keepalive(), name="gateway-turn-typing")
|
|
99
110
|
async for chunk in chunks:
|
|
100
111
|
if chunk.get("type") != "response":
|
|
101
112
|
# Thinking chunks stay off the wire; they are reasoning, not output.
|
|
@@ -121,14 +132,31 @@ class TurnRenderer:
|
|
|
121
132
|
await self._finalize_segment()
|
|
122
133
|
return self._total_text
|
|
123
134
|
finally:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
135
|
+
for task in (pump, typing):
|
|
136
|
+
if task is not None:
|
|
137
|
+
task.cancel()
|
|
138
|
+
try:
|
|
139
|
+
await task
|
|
140
|
+
except asyncio.CancelledError:
|
|
141
|
+
pass
|
|
130
142
|
await self._adapter.set_typing(self._chat_id, False)
|
|
131
143
|
|
|
144
|
+
async def _typing_keepalive(self) -> None:
|
|
145
|
+
"""Re-send the typing action so the indicator outlives its ~5s expiry.
|
|
146
|
+
|
|
147
|
+
Covers the silent stretches of a turn — model thinking before the
|
|
148
|
+
first chunk and long-running tool calls, where no message is sent or
|
|
149
|
+
edited. Refresh only (never hides: the ``False`` call is the
|
|
150
|
+
adapter's business); a failing adapter must not end the loop, since
|
|
151
|
+
typing is cosmetic.
|
|
152
|
+
"""
|
|
153
|
+
while True:
|
|
154
|
+
await asyncio.sleep(self._typing_refresh)
|
|
155
|
+
try:
|
|
156
|
+
await self._adapter.set_typing(self._chat_id, True)
|
|
157
|
+
except Exception: # noqa: BLE001 — typing indicators are cosmetic
|
|
158
|
+
logger.debug("gateway: typing refresh failed", exc_info=True)
|
|
159
|
+
|
|
132
160
|
# -- Reply messages (one per response segment) -------------------------
|
|
133
161
|
|
|
134
162
|
async def _finalize_segment(self) -> None:
|
|
@@ -11,6 +11,21 @@ from kolega_code.llm.specs.types import ThinkingEffortSpec
|
|
|
11
11
|
# The ChatGPT-subscription backend (openai_chatgpt) carries the flag too,
|
|
12
12
|
# verified through its own OAuth transport the same day.
|
|
13
13
|
OPENAI_SPECS = {
|
|
14
|
+
("openai", "gpt-6-astra"): {
|
|
15
|
+
"context_length": 1050000,
|
|
16
|
+
"max_completion_tokens": 128000,
|
|
17
|
+
"input_budget": "window_minus_output",
|
|
18
|
+
"default_temperature": 1.0,
|
|
19
|
+
"supports_temperature": False,
|
|
20
|
+
"supports_vision": True,
|
|
21
|
+
"supports_hosted_web_search": True,
|
|
22
|
+
"preferred_edit_protocol": "codex_apply_patch",
|
|
23
|
+
"thinking_effort": ThinkingEffortSpec(
|
|
24
|
+
options=("low", "medium", "high", "xhigh", "max"),
|
|
25
|
+
default="medium",
|
|
26
|
+
mode="openai_responses_reasoning",
|
|
27
|
+
),
|
|
28
|
+
},
|
|
14
29
|
("openai", "gpt-5.6-sol"): {
|
|
15
30
|
"context_length": 1050000,
|
|
16
31
|
"max_completion_tokens": 128000,
|
|
@@ -13,6 +13,23 @@ from kolega_code.llm.specs.types import ThinkingEffortSpec
|
|
|
13
13
|
# GPT-5.5, despite the API models exposing a larger window. Keep the
|
|
14
14
|
# subscription-specific values here so compression runs before backend limits.
|
|
15
15
|
OPENAI_CHATGPT_SPECS = {
|
|
16
|
+
("openai_chatgpt", "gpt-6-astra"): {
|
|
17
|
+
# Retain the conservative subscription budget used by GPT-5.6 until
|
|
18
|
+
# Astra's larger input window is verified on the Codex backend.
|
|
19
|
+
"context_length": 400000,
|
|
20
|
+
"max_completion_tokens": 128000,
|
|
21
|
+
"input_budget": "window_minus_output",
|
|
22
|
+
"default_temperature": 1.0,
|
|
23
|
+
"supports_temperature": False,
|
|
24
|
+
"supports_vision": True,
|
|
25
|
+
"supports_hosted_web_search": True,
|
|
26
|
+
"preferred_edit_protocol": "codex_apply_patch",
|
|
27
|
+
"thinking_effort": ThinkingEffortSpec(
|
|
28
|
+
options=("low", "medium", "high", "xhigh", "max"),
|
|
29
|
+
default="medium",
|
|
30
|
+
mode="openai_responses_reasoning",
|
|
31
|
+
),
|
|
32
|
+
},
|
|
16
33
|
("openai_chatgpt", "gpt-5.6-sol"): {
|
|
17
34
|
"context_length": 400000,
|
|
18
35
|
"max_completion_tokens": 128000,
|
|
@@ -4,12 +4,14 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import hashlib
|
|
6
6
|
import json
|
|
7
|
+
import os
|
|
7
8
|
import re
|
|
8
9
|
from dataclasses import dataclass, field
|
|
9
10
|
from pathlib import Path
|
|
10
|
-
from typing import Any, Literal, Optional
|
|
11
|
+
from typing import Any, Literal, Mapping, Optional
|
|
12
|
+
from urllib.parse import urlparse
|
|
11
13
|
|
|
12
|
-
from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_validator, model_validator
|
|
13
15
|
|
|
14
16
|
from kolega_code.local_state import write_private_secret_text
|
|
15
17
|
|
|
@@ -22,6 +24,7 @@ _SERVER_ID_RE = re.compile(r"^[A-Za-z0-9_-]+$")
|
|
|
22
24
|
# least 25 chars of budget for the tool id after the ``mcp__{server}__`` prefix.
|
|
23
25
|
_SERVER_ID_MAX_LENGTH = 32
|
|
24
26
|
_SERVER_ID_PREFIX_LENGTH = 24
|
|
27
|
+
_ENV_VAR_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
|
|
25
28
|
|
|
26
29
|
|
|
27
30
|
def sanitize_mcp_server_id(value: str) -> str:
|
|
@@ -50,18 +53,78 @@ class MCPConfigError(ValueError):
|
|
|
50
53
|
class MCPOAuthConfig(BaseModel):
|
|
51
54
|
"""OAuth settings for an HTTP MCP server."""
|
|
52
55
|
|
|
56
|
+
model_config = ConfigDict(hide_input_in_errors=True)
|
|
57
|
+
|
|
53
58
|
enabled: bool = False
|
|
54
59
|
redirect_uri: Optional[str] = None
|
|
55
60
|
scope: Optional[str] = None
|
|
61
|
+
client_id: Optional[str] = None
|
|
62
|
+
client_secret: Optional[str] = None
|
|
63
|
+
client_secret_env: Optional[str] = None
|
|
64
|
+
token_endpoint_auth_method: Optional[Literal["client_secret_post", "client_secret_basic", "none"]] = None
|
|
56
65
|
client_name: str = "Kolega Code"
|
|
57
66
|
client_uri: Optional[str] = None
|
|
58
67
|
client_metadata_url: Optional[str] = None
|
|
59
68
|
timeout_seconds: float = Field(default=300.0, gt=0)
|
|
60
69
|
|
|
70
|
+
@field_validator("redirect_uri")
|
|
71
|
+
@classmethod
|
|
72
|
+
def _validate_redirect_uri(cls, value: Optional[str]) -> Optional[str]:
|
|
73
|
+
if not value:
|
|
74
|
+
return None
|
|
75
|
+
parsed = urlparse(value)
|
|
76
|
+
if parsed.scheme != "http" or parsed.hostname not in {"127.0.0.1", "localhost"}:
|
|
77
|
+
raise ValueError(
|
|
78
|
+
"MCP OAuth redirect_uri must be a localhost http URL (e.g. http://127.0.0.1:33418/callback)"
|
|
79
|
+
)
|
|
80
|
+
# Accessing port also rejects malformed and out-of-range values.
|
|
81
|
+
_ = parsed.port
|
|
82
|
+
if parsed.username is not None or parsed.password is not None or parsed.fragment:
|
|
83
|
+
raise ValueError("MCP OAuth redirect_uri must not contain credentials or a fragment")
|
|
84
|
+
return value
|
|
85
|
+
|
|
86
|
+
@field_validator("client_secret_env")
|
|
87
|
+
@classmethod
|
|
88
|
+
def _validate_client_secret_env(cls, value: Optional[str]) -> Optional[str]:
|
|
89
|
+
if not value:
|
|
90
|
+
return None
|
|
91
|
+
stripped = value.strip()
|
|
92
|
+
if not _ENV_VAR_RE.match(stripped):
|
|
93
|
+
raise ValueError("client_secret_env must be a valid environment variable name")
|
|
94
|
+
return stripped
|
|
95
|
+
|
|
96
|
+
@model_validator(mode="after")
|
|
97
|
+
def _validate_oauth_fields(self) -> "MCPOAuthConfig":
|
|
98
|
+
if (self.client_secret or self.client_secret_env) and not self.client_id:
|
|
99
|
+
raise ValueError("OAuth client_secret and client_secret_env require a client_id")
|
|
100
|
+
if self.token_endpoint_auth_method in {"client_secret_post", "client_secret_basic"}:
|
|
101
|
+
if not self.client_id or not (self.client_secret or self.client_secret_env):
|
|
102
|
+
raise ValueError("OAuth client secret authentication requires a client_id and client secret")
|
|
103
|
+
if "enabled" not in self.model_fields_set and self.client_id:
|
|
104
|
+
self.enabled = True
|
|
105
|
+
return self
|
|
106
|
+
|
|
107
|
+
def resolve_client_secret(self, env: Optional[Mapping[str, str]] = None) -> Optional[str]:
|
|
108
|
+
if self.client_secret:
|
|
109
|
+
return self.client_secret
|
|
110
|
+
if self.client_secret_env:
|
|
111
|
+
source_env = os.environ if env is None else env
|
|
112
|
+
return source_env.get(self.client_secret_env) or None
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
def resolve_auth_method(self, env: Optional[Mapping[str, str]] = None) -> str:
|
|
116
|
+
if self.token_endpoint_auth_method:
|
|
117
|
+
return self.token_endpoint_auth_method
|
|
118
|
+
if self.resolve_client_secret(env=env):
|
|
119
|
+
return "client_secret_post"
|
|
120
|
+
return "none"
|
|
121
|
+
|
|
61
122
|
|
|
62
123
|
class MCPServerConfig(BaseModel):
|
|
63
124
|
"""One configured MCP server."""
|
|
64
125
|
|
|
126
|
+
model_config = ConfigDict(hide_input_in_errors=True)
|
|
127
|
+
|
|
65
128
|
id: str
|
|
66
129
|
name: Optional[str] = None
|
|
67
130
|
transport: Literal["streamable_http", "sse", "stdio"] = "streamable_http"
|
|
@@ -130,10 +193,15 @@ class MCPServerConfig(BaseModel):
|
|
|
130
193
|
payload["headers"] = {key: "‹secret›" for key in payload["headers"]}
|
|
131
194
|
if payload.get("env"):
|
|
132
195
|
payload["env"] = {key: "‹secret›" for key in payload["env"]}
|
|
196
|
+
if payload.get("oauth") and isinstance(payload["oauth"], dict):
|
|
197
|
+
if payload["oauth"].get("client_secret"):
|
|
198
|
+
payload["oauth"]["client_secret"] = "‹secret›"
|
|
133
199
|
return payload
|
|
134
200
|
|
|
135
201
|
|
|
136
202
|
class MCPConfigFile(BaseModel):
|
|
203
|
+
model_config = ConfigDict(hide_input_in_errors=True)
|
|
204
|
+
|
|
137
205
|
schema_version: int = MCP_CONFIG_SCHEMA_VERSION
|
|
138
206
|
servers: list[MCPServerConfig] = Field(default_factory=list)
|
|
139
207
|
|
|
@@ -349,4 +417,7 @@ def mcp_secret_values(config: LoadedMCPConfig) -> list[str]:
|
|
|
349
417
|
for server in config.servers.values():
|
|
350
418
|
values.extend(value for value in server.headers.values() if value)
|
|
351
419
|
values.extend(value for value in server.env.values() if value)
|
|
420
|
+
secret = server.oauth.resolve_client_secret()
|
|
421
|
+
if secret:
|
|
422
|
+
values.append(secret)
|
|
352
423
|
return values
|