kolega-code 0.45.0__tar.gz → 0.46.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.45.0 → kolega_code-0.46.0}/CHANGELOG.md +60 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/PKG-INFO +5 -3
- {kolega_code-0.45.0 → kolega_code-0.46.0}/README.md +1 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/__init__.py +1 -1
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/baseagent.py +19 -16
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/context.py +3 -5
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/model_routing.py +2 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/terminal_tool.py +1 -3
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +1 -3
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/config.py +88 -4
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/messages.py +7 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/model_catalog.py +30 -2
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/model_connection.py +4 -1
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/provider_registry.py +22 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/settings.py +6 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/agent_runtime.py +2 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/onboarding_screen.py +30 -2
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/settings_panel.py +59 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/settings_screen.py +17 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/styles.tcss +2 -1
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/config.py +36 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/client.py +44 -13
- kolega_code-0.46.0/kolega_code/llm/cloudflare_workers_ai.py +82 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/exceptions.py +65 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/instrumented_client.py +11 -2
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/openai.py +32 -2
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/__init__.py +2 -0
- kolega_code-0.46.0/kolega_code/llm/specs/catalog/cloudflare_workers_ai.py +151 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/kimi_coding.py +32 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/moonshot.py +30 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +51 -3
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/openrouter.py +1299 -1231
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/tinker.py +78 -2
- kolega_code-0.46.0/kolega_code/llm/specs/cloudflare_workers_ai_catalog.py +249 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/thinking.py +11 -1
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/usage.py +1 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/security/secrets.py +1 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/pyproject.toml +15 -4
- {kolega_code-0.45.0 → kolega_code-0.46.0}/.gitignore +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/MIGRATION.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/RELEASING.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/agent_factory.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/bridge.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/diffs.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/permissions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/plans.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/questions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/server.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/session.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/acp/usage.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/handoff.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/agent_job.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/session_metadata.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/acp.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/gateway.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/main.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/peer_messaging.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/prompt_history.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/background_status.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/boot_splash.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/command_handlers.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/discovery.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/metadata.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/settings_widgets.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/shortcut_bar.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/startup.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/task_list.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/tool_presentation.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/turn_status.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/events.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/access.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/access_settings.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/adapters/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/adapters/base.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/adapters/echo.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/adapters/telegram/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/adapters/telegram/adapter.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/adapters/telegram/formatting.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/bridge.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/commands.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/config.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/control_relay.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/daemon.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/event_router.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/questions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/redaction.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/router.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/service.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/sessions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/gateway/stt.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/mistral.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/groq.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/minimax.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/mistral.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/mistral_catalog.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/background.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/inbox.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tool_subjects.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tools/ask_user.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.45.0 → kolega_code-0.46.0}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,66 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.46.0 - 2026-10-27
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Kimi K3.1 Pro support.** Moonshot's October 2026 K3.1 release is selectable
|
|
14
|
+
on both Kimi providers: `kimi-k3.1-pro` and `kimi-k3.1-pro-highspeed` on
|
|
15
|
+
`moonshot`, and `k3.1-pro` / `k3.1-pro-highspeed` on the Kimi Coding Plan.
|
|
16
|
+
All four always think and expose a `low`/`high`/`max` reasoning-effort ladder;
|
|
17
|
+
the 1M window is catalogued directly where every eligible plan has it. The
|
|
18
|
+
Coding Plan's `k3.1-pro` keeps a 256K budget because its 1M window is gated to
|
|
19
|
+
Pro-and-above plans.
|
|
20
|
+
- **Cloudflare Workers AI support.** Select `cloudflare_workers_ai` with a
|
|
21
|
+
Workers AI API token (`CLOUDFLARE_API_TOKEN` or Settings) and your account ID
|
|
22
|
+
(`CLOUDFLARE_ACCOUNT_ID`, or the new Account ID field on Settings → Providers
|
|
23
|
+
and in onboarding). The curated catalog covers tool-calling models with at
|
|
24
|
+
least a 128K window, led by GLM-5.3 (the default) plus GLM-5.3 Flash,
|
|
25
|
+
Kimi K2.7 Code, DeepSeek V4.1 Flash, GPT-OSS, and more, with Cloudflare's
|
|
26
|
+
per-model reasoning-effort ladders. `kolega-code models refresh --provider
|
|
27
|
+
cloudflare_workers_ai` discovers newer models from your account.
|
|
28
|
+
`CLOUDFLARE_AI_GATEWAY_ID` optionally routes requests through an AI Gateway.
|
|
29
|
+
Exhausted free allocations and Workers Paid-only models report a billing
|
|
30
|
+
error instead of retrying.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- Refreshed the OpenRouter, Ollama Cloud, and Tinker model catalogs from their
|
|
35
|
+
live endpoints (2026-10-27 snapshots) with newly available models, removal of
|
|
36
|
+
retired entries, updated limits and capabilities, and a refreshed OpenRouter
|
|
37
|
+
featured ordering. OpenRouter also stopped advertising `temperature` for the
|
|
38
|
+
Anthropic family, matching their adaptive thinking behavior. The Perplexity
|
|
39
|
+
Agent catalog is unchanged because its live endpoint could not be read.
|
|
40
|
+
- Updated the documentation site's undici dependency to 8.12.3.
|
|
41
|
+
|
|
42
|
+
### Security
|
|
43
|
+
|
|
44
|
+
- Updated Brotli to 1.2.1, fixing an out-of-bounds write in the decoder
|
|
45
|
+
(CVE-2026-111497, GHSA-9v8h-qqgm-4m35) reachable through compressed HTTP
|
|
46
|
+
responses.
|
|
47
|
+
- Updated filelock to 4.2.4 for three `SoftFileLock`/`ReadWriteLock`
|
|
48
|
+
advisories (Kolega Code uses neither class) and setuptools to 84.2.0
|
|
49
|
+
(GHSA-xmj3-9gf7-h52w). The dev-only virtualenv pin moves to 21.14.5 so
|
|
50
|
+
filelock 4 resolves; its remaining advisories stay an accepted risk until
|
|
51
|
+
langfuse allows the fixed release.
|
|
52
|
+
|
|
53
|
+
## 0.45.1 - 2026-10-23
|
|
54
|
+
|
|
55
|
+
### Fixed
|
|
56
|
+
|
|
57
|
+
- Healthy pauses in model responses now show "Waiting for response…" instead
|
|
58
|
+
of incorrectly reporting a connection issue. The waiting notice clears when
|
|
59
|
+
activity resumes without overwriting newer activity such as "Thinking…".
|
|
60
|
+
- Retry notices distinguish actual response timeouts from other transient
|
|
61
|
+
failures, with detailed errors retained in diagnostics.
|
|
62
|
+
|
|
63
|
+
### Security
|
|
64
|
+
|
|
65
|
+
- Updated OpenTelemetry's API to 1.45.1, fixing excessive CPU use when parsing
|
|
66
|
+
malicious trace-state headers (CVE-2026-114603), and refreshed its companion
|
|
67
|
+
packages.
|
|
68
|
+
|
|
9
69
|
## 0.45.0 - 2026-10-22
|
|
10
70
|
|
|
11
71
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.46.0
|
|
4
4
|
Summary: Multi-agent coding in the terminal
|
|
5
5
|
Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
|
|
6
6
|
Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
|
|
@@ -35,7 +35,7 @@ Requires-Dist: cryptography==48.0.1; sys_platform == 'darwin' and platform_machi
|
|
|
35
35
|
Requires-Dist: cryptography==50.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'
|
|
36
36
|
Requires-Dist: ddgs==9.14.4
|
|
37
37
|
Requires-Dist: fastapi==0.139.2
|
|
38
|
-
Requires-Dist: filelock==
|
|
38
|
+
Requires-Dist: filelock==4.2.4
|
|
39
39
|
Requires-Dist: firecrawl-py==4.28.2
|
|
40
40
|
Requires-Dist: google-genai==2.12.1
|
|
41
41
|
Requires-Dist: httpx==0.28.1
|
|
@@ -50,6 +50,7 @@ Requires-Dist: nest-asyncio==1.6.0
|
|
|
50
50
|
Requires-Dist: onnxruntime==1.19.2; sys_platform == 'darwin' and platform_machine == 'x86_64' and python_version < '3.13'
|
|
51
51
|
Requires-Dist: onnxruntime==1.27.0; python_version >= '3.14' and sys_platform != 'win32'
|
|
52
52
|
Requires-Dist: openai==2.46.0
|
|
53
|
+
Requires-Dist: opentelemetry-api==1.45.1
|
|
53
54
|
Requires-Dist: packaging==25.0
|
|
54
55
|
Requires-Dist: pathspec==1.1.1
|
|
55
56
|
Requires-Dist: pillow==13.0.0
|
|
@@ -82,7 +83,7 @@ Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
|
|
|
82
83
|
Requires-Dist: pytest==9.0.3; extra == 'dev'
|
|
83
84
|
Requires-Dist: ruff==0.15.12; extra == 'dev'
|
|
84
85
|
Requires-Dist: twine==6.2.0; extra == 'dev'
|
|
85
|
-
Requires-Dist: virtualenv==21.
|
|
86
|
+
Requires-Dist: virtualenv==21.14.5; extra == 'dev'
|
|
86
87
|
Provides-Extra: tinker
|
|
87
88
|
Requires-Dist: tinker-cookbook==0.5.4; extra == 'tinker'
|
|
88
89
|
Requires-Dist: tinker==0.25.0; extra == 'tinker'
|
|
@@ -276,6 +277,7 @@ Supported model providers:
|
|
|
276
277
|
- Z.AI / GLM Coding Plan
|
|
277
278
|
- Kimi Coding Plan
|
|
278
279
|
- Ollama Cloud
|
|
280
|
+
- Cloudflare Workers AI
|
|
279
281
|
- local Llama
|
|
280
282
|
|
|
281
283
|
With a paid **ChatGPT** plan (Plus, Pro, or Business), `/login chatgpt` runs
|
|
@@ -99,9 +99,6 @@ logger = logging.getLogger(__name__)
|
|
|
99
99
|
|
|
100
100
|
PROJECT_GUIDANCE_FILES = ("AGENTS.md", "KOLEGA.md")
|
|
101
101
|
|
|
102
|
-
#: The status strip is one narrow line, so every stall notice opens with this fixed lead.
|
|
103
|
-
STALL_NOTICE_LEAD = "Connection issue"
|
|
104
|
-
|
|
105
102
|
_STREAM_CLEANUP_TIMEOUT = 0.1
|
|
106
103
|
_STREAM_CLEANUP_TASKS: set[asyncio.Future[Any]] = set()
|
|
107
104
|
|
|
@@ -1904,7 +1901,6 @@ class BaseAgent(LogMixin):
|
|
|
1904
1901
|
|
|
1905
1902
|
from kolega_code.llm.client import LLMClient
|
|
1906
1903
|
|
|
1907
|
-
endpoint = self.config.custom_endpoint_for(model_config)
|
|
1908
1904
|
client = LLMClient(
|
|
1909
1905
|
provider=model_config.provider.value,
|
|
1910
1906
|
api_key=self.config.get_api_key(model_config.provider) or "",
|
|
@@ -1915,8 +1911,7 @@ class BaseAgent(LogMixin):
|
|
|
1915
1911
|
token_manager=self.config.get_chatgpt_token_manager(),
|
|
1916
1912
|
usage_ledger=self.usage_ledger,
|
|
1917
1913
|
trace_sink=self.llm_trace_sink,
|
|
1918
|
-
|
|
1919
|
-
api_style=endpoint.api_style if endpoint else None,
|
|
1914
|
+
**self.config.llm_client_kwargs(model_config),
|
|
1920
1915
|
)
|
|
1921
1916
|
with llm_call_origin(helper_origin("hook_prompt")):
|
|
1922
1917
|
response = await client.generate(
|
|
@@ -2160,6 +2155,7 @@ class BaseAgent(LogMixin):
|
|
|
2160
2155
|
) -> Any:
|
|
2161
2156
|
limit = self._stream_first_chunk_timeout if received == 0 else self._stream_idle_timeout
|
|
2162
2157
|
next_heartbeat = self._stream_heartbeat_seconds
|
|
2158
|
+
reported_wait = False
|
|
2163
2159
|
while True:
|
|
2164
2160
|
budget_left = self._remaining_llm_retry_budget()
|
|
2165
2161
|
if budget_left is not None and budget_left <= 0:
|
|
@@ -2173,7 +2169,10 @@ class BaseAgent(LogMixin):
|
|
|
2173
2169
|
limit_s=limit,
|
|
2174
2170
|
)
|
|
2175
2171
|
if pending.done():
|
|
2176
|
-
|
|
2172
|
+
result = pending.result()
|
|
2173
|
+
if reported_wait:
|
|
2174
|
+
await self._emit_stream_resume_status()
|
|
2175
|
+
return result
|
|
2177
2176
|
slice_s = min(self._stream_heartbeat_seconds, limit - waited)
|
|
2178
2177
|
if budget_left is not None:
|
|
2179
2178
|
slice_s = min(slice_s, budget_left)
|
|
@@ -2186,6 +2185,7 @@ class BaseAgent(LogMixin):
|
|
|
2186
2185
|
if waited >= next_heartbeat and waited < limit:
|
|
2187
2186
|
next_heartbeat = waited + self._stream_heartbeat_seconds
|
|
2188
2187
|
await self._emit_stream_wait_status(received, waited, limit)
|
|
2188
|
+
reported_wait = True
|
|
2189
2189
|
|
|
2190
2190
|
async def _finish_stream_cleanup(self, cleanup: Awaitable[Any]) -> Any:
|
|
2191
2191
|
task = asyncio.ensure_future(cleanup)
|
|
@@ -2302,7 +2302,7 @@ class BaseAgent(LogMixin):
|
|
|
2302
2302
|
try:
|
|
2303
2303
|
await self.emitter.llm_status(
|
|
2304
2304
|
"info",
|
|
2305
|
-
|
|
2305
|
+
"Waiting for response…",
|
|
2306
2306
|
stall=True,
|
|
2307
2307
|
seconds_since_data=round(waited_s, 1),
|
|
2308
2308
|
timeout_s=limit_s,
|
|
@@ -2312,18 +2312,21 @@ class BaseAgent(LogMixin):
|
|
|
2312
2312
|
# A status heartbeat must never break the turn it is describing.
|
|
2313
2313
|
pass
|
|
2314
2314
|
|
|
2315
|
-
def
|
|
2315
|
+
async def _emit_stream_resume_status(self) -> None:
|
|
2316
|
+
try:
|
|
2317
|
+
await self.emitter.llm_status("info", "Reading model response…", resumed=True)
|
|
2318
|
+
except Exception:
|
|
2319
|
+
pass
|
|
2320
|
+
|
|
2321
|
+
def _retry_status_message(self, error: Exception, *, attempt: int, cap: int, delay: float) -> str:
|
|
2316
2322
|
"""Short strip copy; the failure detail is already in the log and ``llm_error``."""
|
|
2317
|
-
|
|
2323
|
+
lead = "Response timed out — retrying" if isinstance(error, LLMTimeout) else "Retrying request"
|
|
2324
|
+
return f"{lead} ({attempt}/{cap}) in {delay:.0f}s…"
|
|
2318
2325
|
|
|
2319
2326
|
def _retry_exhausted_message(self, error: Exception, *, attempts: int, budget_used_s: float) -> str:
|
|
2320
|
-
"""Terminal message: the same one lead, plus how hard it tried and for how long."""
|
|
2321
2327
|
if isinstance(error, LLMStreamStalled):
|
|
2322
2328
|
attempt_word = "attempt" if attempts == 1 else "attempts"
|
|
2323
|
-
return (
|
|
2324
|
-
f"{STALL_NOTICE_LEAD} — no response after {attempts} {attempt_word} "
|
|
2325
|
-
f"over {self._format_wait(budget_used_s)}."
|
|
2326
|
-
)
|
|
2329
|
+
return f"Response timed out after {attempts} {attempt_word} over {self._format_wait(budget_used_s)}."
|
|
2327
2330
|
return llm_error_message(
|
|
2328
2331
|
error if isinstance(error, LLMError) else LLMError(str(error)),
|
|
2329
2332
|
model=self.primary_model_config.model,
|
|
@@ -2408,7 +2411,7 @@ class BaseAgent(LogMixin):
|
|
|
2408
2411
|
# instead of only flashing it in the status strip.
|
|
2409
2412
|
await self.emitter.llm_status(
|
|
2410
2413
|
"info",
|
|
2411
|
-
self._retry_status_message(attempt=self._consecutive_llm_retries, cap=cap, delay=delay),
|
|
2414
|
+
self._retry_status_message(error, attempt=self._consecutive_llm_retries, cap=cap, delay=delay),
|
|
2412
2415
|
retry=True,
|
|
2413
2416
|
attempt=self._consecutive_llm_retries,
|
|
2414
2417
|
cap=cap,
|
|
@@ -113,7 +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
|
-
|
|
116
|
+
connection_kwargs = self.config.llm_client_kwargs(model_config)
|
|
117
117
|
|
|
118
118
|
if self.telemetry.langfuse_client:
|
|
119
119
|
return InstrumentedLLMClient(
|
|
@@ -136,8 +136,7 @@ class AgentContext:
|
|
|
136
136
|
trace_sink=self.telemetry.llm_trace_sink,
|
|
137
137
|
context_window_tokens=self.config.context_window_tokens,
|
|
138
138
|
max_output_tokens=self.config.max_output_tokens,
|
|
139
|
-
|
|
140
|
-
api_style=endpoint.api_style if endpoint else None,
|
|
139
|
+
**connection_kwargs,
|
|
141
140
|
)
|
|
142
141
|
|
|
143
142
|
return LLMClient(
|
|
@@ -152,6 +151,5 @@ class AgentContext:
|
|
|
152
151
|
trace_sink=self.telemetry.llm_trace_sink,
|
|
153
152
|
context_window_tokens=self.config.context_window_tokens,
|
|
154
153
|
max_output_tokens=self.config.max_output_tokens,
|
|
155
|
-
|
|
156
|
-
api_style=endpoint.api_style if endpoint else None,
|
|
154
|
+
**connection_kwargs,
|
|
157
155
|
)
|
|
@@ -56,6 +56,8 @@ def provider_is_configured(config: AgentConfig, provider: ModelProvider) -> bool
|
|
|
56
56
|
return True
|
|
57
57
|
if provider == ModelProvider.OPENAI_CHATGPT:
|
|
58
58
|
return config.openai_chatgpt_tokens is not None
|
|
59
|
+
if provider == ModelProvider.CLOUDFLARE_WORKERS_AI:
|
|
60
|
+
return bool(config.get_api_key(provider)) and bool(config.cloudflare_account_id)
|
|
59
61
|
return bool(config.get_api_key(provider))
|
|
60
62
|
|
|
61
63
|
|
|
@@ -97,7 +97,6 @@ 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)
|
|
101
100
|
|
|
102
101
|
client = LLMClient(
|
|
103
102
|
provider=provider.value,
|
|
@@ -109,8 +108,7 @@ class TerminalTool(BaseTool):
|
|
|
109
108
|
token_manager=self.config.get_chatgpt_token_manager(),
|
|
110
109
|
usage_ledger=getattr(self.caller, "usage_ledger", None),
|
|
111
110
|
trace_sink=getattr(self.caller, "llm_trace_sink", None),
|
|
112
|
-
|
|
113
|
-
api_style=endpoint.api_style if endpoint else None,
|
|
111
|
+
**self.config.llm_client_kwargs(self.config.fast_config),
|
|
114
112
|
)
|
|
115
113
|
|
|
116
114
|
try:
|
|
@@ -146,7 +146,6 @@ 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)
|
|
150
149
|
client_kwargs = {
|
|
151
150
|
"provider": provider.value,
|
|
152
151
|
"api_key": self.config.get_api_key(provider),
|
|
@@ -157,8 +156,7 @@ class WebFetchTool(StreamingTool):
|
|
|
157
156
|
"token_manager": self.config.get_chatgpt_token_manager(),
|
|
158
157
|
"usage_ledger": getattr(self.caller, "usage_ledger", None),
|
|
159
158
|
"trace_sink": getattr(self.caller, "llm_trace_sink", None),
|
|
160
|
-
|
|
161
|
-
"api_style": endpoint.api_style if endpoint else None,
|
|
159
|
+
**self.config.llm_client_kwargs(self.config.fast_config),
|
|
162
160
|
}
|
|
163
161
|
caller_llm = getattr(self.caller, "llm", None)
|
|
164
162
|
if isinstance(caller_llm, InstrumentedLLMClient):
|
|
@@ -20,6 +20,7 @@ from kolega_code.config import (
|
|
|
20
20
|
ModelProvider,
|
|
21
21
|
RateLimitConfig,
|
|
22
22
|
)
|
|
23
|
+
from kolega_code.llm import cloudflare_workers_ai
|
|
23
24
|
from kolega_code.llm.specs import MODEL_SPECS, get_model_specs, model_is_known, normalize_thinking_effort
|
|
24
25
|
from kolega_code.llm.specs.custom_endpoints import (
|
|
25
26
|
API_STYLES,
|
|
@@ -72,6 +73,7 @@ API_KEY_ENV = {
|
|
|
72
73
|
ModelProvider.ZAI: "ZAI_API_KEY",
|
|
73
74
|
ModelProvider.KIMI_CODING: "KIMI_CODING_API_KEY",
|
|
74
75
|
ModelProvider.OLLAMA_CLOUD: "OLLAMA_API_KEY",
|
|
76
|
+
ModelProvider.CLOUDFLARE_WORKERS_AI: cloudflare_workers_ai.API_TOKEN_ENV,
|
|
75
77
|
ModelProvider.OPENROUTER: "OPENROUTER_API_KEY",
|
|
76
78
|
ModelProvider.THINKING_MACHINES: "TINKER_API_KEY",
|
|
77
79
|
# Native Tinker sampling authenticates with the same key.
|
|
@@ -399,6 +401,45 @@ def _api_key_for_provider(
|
|
|
399
401
|
return None
|
|
400
402
|
|
|
401
403
|
|
|
404
|
+
CLOUDFLARE_MISSING_ACCOUNT_MESSAGE = (
|
|
405
|
+
f"Missing Cloudflare account ID: set {cloudflare_workers_ai.ACCOUNT_ID_ENV} or enter it in Settings → Providers."
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def _cloudflare_account_id_source(env: Mapping[str, str], settings: Optional[CliSettings]) -> tuple[Optional[str], str]:
|
|
410
|
+
"""The raw account ID and where it came from: the environment wins over Settings."""
|
|
411
|
+
from_env = (env.get(cloudflare_workers_ai.ACCOUNT_ID_ENV) or "").strip()
|
|
412
|
+
if from_env:
|
|
413
|
+
return from_env, cloudflare_workers_ai.ACCOUNT_ID_ENV
|
|
414
|
+
return (settings.cloudflare_account_id if settings else None), "the account ID saved in Settings"
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
def _cloudflare_route_settings(
|
|
418
|
+
env: Mapping[str, str], settings: Optional[CliSettings], *, required: bool
|
|
419
|
+
) -> tuple[Optional[str], Optional[str]]:
|
|
420
|
+
"""Resolve ``(account_id, gateway_id)``.
|
|
421
|
+
|
|
422
|
+
Invalid values are fatal only when a Cloudflare route is in use; otherwise they
|
|
423
|
+
are dropped so a stale value cannot lock the user out of other providers.
|
|
424
|
+
"""
|
|
425
|
+
raw_account, account_source = _cloudflare_account_id_source(env, settings)
|
|
426
|
+
try:
|
|
427
|
+
account_id = cloudflare_workers_ai.normalize_account_id(raw_account)
|
|
428
|
+
except ValueError as exc:
|
|
429
|
+
if required:
|
|
430
|
+
raise CliConfigError(f"Invalid Cloudflare account ID from {account_source}: {exc}") from exc
|
|
431
|
+
account_id = None
|
|
432
|
+
if required and account_id is None:
|
|
433
|
+
raise CliConfigError(CLOUDFLARE_MISSING_ACCOUNT_MESSAGE)
|
|
434
|
+
try:
|
|
435
|
+
gateway_id = cloudflare_workers_ai.normalize_gateway_id(env.get(cloudflare_workers_ai.GATEWAY_ID_ENV))
|
|
436
|
+
except ValueError as exc:
|
|
437
|
+
if required:
|
|
438
|
+
raise CliConfigError(f"Invalid {cloudflare_workers_ai.GATEWAY_ID_ENV}: {exc}") from exc
|
|
439
|
+
gateway_id = None
|
|
440
|
+
return account_id, gateway_id
|
|
441
|
+
|
|
442
|
+
|
|
402
443
|
def _resolve_chatgpt_tokens(settings: Optional[CliSettings]) -> Optional[OAuthTokens]:
|
|
403
444
|
"""Load stored ChatGPT OAuth tokens from settings, if present and well-formed."""
|
|
404
445
|
if not settings:
|
|
@@ -952,6 +993,10 @@ def build_agent_config(
|
|
|
952
993
|
if missing_keys:
|
|
953
994
|
raise CliConfigError(f"Missing required API key environment variable(s): {', '.join(missing_keys)}")
|
|
954
995
|
|
|
996
|
+
cloudflare_account_id, cloudflare_ai_gateway_id = _cloudflare_route_settings(
|
|
997
|
+
loaded_env, settings, required=ModelProvider.CLOUDFLARE_WORKERS_AI in required_providers
|
|
998
|
+
)
|
|
999
|
+
|
|
955
1000
|
chatgpt_tokens = _resolve_chatgpt_tokens(settings)
|
|
956
1001
|
if ModelProvider.OPENAI_CHATGPT in required_providers and chatgpt_tokens is None:
|
|
957
1002
|
raise CliConfigError("Not signed in to ChatGPT. Run /login chatgpt to sign in with your ChatGPT subscription.")
|
|
@@ -981,6 +1026,9 @@ def build_agent_config(
|
|
|
981
1026
|
zai_api_key=_api_key_for_provider(ModelProvider.ZAI, loaded_env, settings),
|
|
982
1027
|
kimi_coding_api_key=_api_key_for_provider(ModelProvider.KIMI_CODING, loaded_env, settings),
|
|
983
1028
|
ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
|
|
1029
|
+
cloudflare_api_token=_api_key_for_provider(ModelProvider.CLOUDFLARE_WORKERS_AI, loaded_env, settings),
|
|
1030
|
+
cloudflare_account_id=cloudflare_account_id,
|
|
1031
|
+
cloudflare_ai_gateway_id=cloudflare_ai_gateway_id,
|
|
984
1032
|
openrouter_api_key=_api_key_for_provider(ModelProvider.OPENROUTER, loaded_env, settings),
|
|
985
1033
|
thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
|
|
986
1034
|
perplexity_api_key=_api_key_for_provider(ModelProvider.PERPLEXITY_AGENT, loaded_env, settings),
|
|
@@ -1068,10 +1116,19 @@ def key_status(provider: str, project_path: Path, settings: Optional[CliSettings
|
|
|
1068
1116
|
env = load_cli_env(project_path)
|
|
1069
1117
|
env_name = API_KEY_ENV.get(provider_value)
|
|
1070
1118
|
if env_name and env.get(env_name):
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1119
|
+
status = f"present via {env_name}"
|
|
1120
|
+
elif settings and settings.get_api_key(provider_value.value):
|
|
1121
|
+
status = "present in local settings"
|
|
1122
|
+
else:
|
|
1123
|
+
return "missing"
|
|
1124
|
+
if provider_value == ModelProvider.CLOUDFLARE_WORKERS_AI:
|
|
1125
|
+
raw_account, _ = _cloudflare_account_id_source(env, settings)
|
|
1126
|
+
try:
|
|
1127
|
+
if cloudflare_workers_ai.normalize_account_id(raw_account) is None:
|
|
1128
|
+
status += "; account ID missing"
|
|
1129
|
+
except ValueError:
|
|
1130
|
+
status += "; account ID invalid"
|
|
1131
|
+
return status
|
|
1075
1132
|
|
|
1076
1133
|
|
|
1077
1134
|
def resolved_api_key(provider: str, project_path: Path, settings: Optional[CliSettings] = None) -> Optional[str]:
|
|
@@ -1082,6 +1139,33 @@ def resolved_api_key(provider: str, project_path: Path, settings: Optional[CliSe
|
|
|
1082
1139
|
return _api_key_for_provider(_provider(provider), load_cli_env(project_path), settings)
|
|
1083
1140
|
|
|
1084
1141
|
|
|
1142
|
+
def resolved_cloudflare_account_id(project_path: Path, settings: Optional[CliSettings] = None) -> Optional[str]:
|
|
1143
|
+
"""The valid Cloudflare account ID a route would use (environment, then Settings), or ``None``."""
|
|
1144
|
+
raw_account, _ = _cloudflare_account_id_source(load_cli_env(project_path), settings)
|
|
1145
|
+
try:
|
|
1146
|
+
return cloudflare_workers_ai.normalize_account_id(raw_account)
|
|
1147
|
+
except ValueError:
|
|
1148
|
+
return None
|
|
1149
|
+
|
|
1150
|
+
|
|
1151
|
+
def provider_connection_kwargs(
|
|
1152
|
+
provider: str, project_path: Path, settings: Optional[CliSettings] = None
|
|
1153
|
+
) -> dict[str, Any]:
|
|
1154
|
+
"""Connection kwargs for probing a built-in provider's credential from a Settings draft.
|
|
1155
|
+
|
|
1156
|
+
Raises ``ValueError`` with user-facing copy when a Cloudflare account ID is
|
|
1157
|
+
missing or invalid; returns ``{}`` for providers with a fixed endpoint.
|
|
1158
|
+
"""
|
|
1159
|
+
if _provider(provider) != ModelProvider.CLOUDFLARE_WORKERS_AI:
|
|
1160
|
+
return {}
|
|
1161
|
+
env = load_cli_env(project_path)
|
|
1162
|
+
raw_account, _ = _cloudflare_account_id_source(env, settings)
|
|
1163
|
+
return cloudflare_workers_ai.connection_kwargs(
|
|
1164
|
+
cloudflare_workers_ai.normalize_account_id(raw_account),
|
|
1165
|
+
cloudflare_workers_ai.normalize_gateway_id(env.get(cloudflare_workers_ai.GATEWAY_ID_ENV)),
|
|
1166
|
+
)
|
|
1167
|
+
|
|
1168
|
+
|
|
1085
1169
|
def probe_token_manager(settings: Optional[CliSettings]) -> Optional[ChatGPTTokenManager]:
|
|
1086
1170
|
"""A ChatGPT token manager for credential probes, deliberately non-persisting.
|
|
1087
1171
|
|
|
@@ -297,6 +297,13 @@ PROVIDER_KEY_NOT_STORED = (
|
|
|
297
297
|
)
|
|
298
298
|
PROVIDER_KEY_REMOVAL_STAGED = "The locally stored API key will be removed when you Apply."
|
|
299
299
|
PROVIDER_TEST_RUNNING = "Testing {provider}/{model}…"
|
|
300
|
+
CLOUDFLARE_ACCOUNT_ID_PLACEHOLDER = "32-character Cloudflare account ID"
|
|
301
|
+
CLOUDFLARE_ACCOUNT_ID_HINT = (
|
|
302
|
+
"Find the account ID in the Cloudflare dashboard under Workers AI → Use REST API. "
|
|
303
|
+
"CLOUDFLARE_ACCOUNT_ID overrides this value."
|
|
304
|
+
)
|
|
305
|
+
CLOUDFLARE_API_TOKEN_PLACEHOLDER = "Cloudflare API token (Workers AI Read)"
|
|
306
|
+
CLOUDFLARE_ACCOUNT_ID_REQUIRED = "Enter your Cloudflare account ID or set CLOUDFLARE_ACCOUNT_ID."
|
|
300
307
|
MODEL_SLOT_INHERITED = "Using {provider}/{model} (inherited from the active model)."
|
|
301
308
|
MODEL_SLOT_PINNED = "Using {provider}/{model}."
|
|
302
309
|
MODEL_SLOT_HINT = (
|
|
@@ -20,7 +20,9 @@ from pathlib import Path
|
|
|
20
20
|
from typing import Any, Iterable, Optional, Sequence
|
|
21
21
|
|
|
22
22
|
from kolega_code.config import ModelProvider
|
|
23
|
+
from kolega_code.llm.cloudflare_workers_ai import normalize_account_id
|
|
23
24
|
from kolega_code.llm.specs import MODEL_SPECS, is_featured_model
|
|
25
|
+
from kolega_code.llm.specs import cloudflare_workers_ai_catalog as cloudflare_workers_ai
|
|
24
26
|
from kolega_code.llm.specs import mistral_catalog as mistral
|
|
25
27
|
from kolega_code.llm.specs import ollama_cloud_catalog as ollama_cloud
|
|
26
28
|
from kolega_code.llm.specs import openrouter_catalog as openrouter
|
|
@@ -37,13 +39,16 @@ from .settings import SettingsStore, SettingsStoreError
|
|
|
37
39
|
# and save_cache(). The Perplexity entry is a duck-typed catalog object rather
|
|
38
40
|
# than a module — same contract. An entry that publishes ``API_KEY_ENV`` is
|
|
39
41
|
# authenticated: ``models refresh`` resolves that credential and passes it to
|
|
40
|
-
# ``fetch_models(api_key=...)``; every other source is fetched anonymously.
|
|
42
|
+
# ``fetch_models(api_key=...)``; every other source is fetched anonymously. An
|
|
43
|
+
# entry that also publishes ``ACCOUNT_ID_ENV`` is account-scoped and receives
|
|
44
|
+
# ``account_id=...`` too.
|
|
41
45
|
OVERLAY_SOURCES = {
|
|
42
46
|
mistral.PROVIDER: mistral,
|
|
43
47
|
ollama_cloud.PROVIDER: ollama_cloud,
|
|
44
48
|
openrouter.PROVIDER: openrouter,
|
|
45
49
|
tinker.PROVIDER: tinker,
|
|
46
50
|
perplexity.AGENT_PROVIDER: perplexity.AGENT_CATALOG,
|
|
51
|
+
cloudflare_workers_ai.PROVIDER: cloudflare_workers_ai,
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
# Capture the release snapshot before startup applies any runtime caches.
|
|
@@ -83,6 +88,20 @@ def _overlay_api_key(provider: str, env_name: str) -> Optional[str]:
|
|
|
83
88
|
return (stored or "").strip() or None
|
|
84
89
|
|
|
85
90
|
|
|
91
|
+
def _overlay_account_id(env_name: str, setting_name: str) -> Optional[str]:
|
|
92
|
+
"""Resolve an account-scoped overlay's account ID: environment first, then Settings."""
|
|
93
|
+
value = (os.environ.get(env_name) or "").strip()
|
|
94
|
+
if not value:
|
|
95
|
+
try:
|
|
96
|
+
value = str(getattr(SettingsStore().load(), setting_name, None) or "").strip()
|
|
97
|
+
except (SettingsStoreError, OSError):
|
|
98
|
+
return None
|
|
99
|
+
try:
|
|
100
|
+
return normalize_account_id(value)
|
|
101
|
+
except ValueError:
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
|
|
86
105
|
def _overlay_fetch_kwargs(provider: str, module: Any) -> tuple[Optional[dict[str, Any]], Optional[str]]:
|
|
87
106
|
"""Return ``(fetch kwargs, error message)`` for one overlay source."""
|
|
88
107
|
env_name = getattr(module, "API_KEY_ENV", None)
|
|
@@ -91,7 +110,16 @@ def _overlay_fetch_kwargs(provider: str, module: Any) -> tuple[Optional[dict[str
|
|
|
91
110
|
api_key = _overlay_api_key(provider, str(env_name))
|
|
92
111
|
if not api_key:
|
|
93
112
|
return None, f"Refreshing the {provider} catalog needs {env_name} (or a key saved in Settings)."
|
|
94
|
-
|
|
113
|
+
kwargs: dict[str, Any] = {"api_key": api_key}
|
|
114
|
+
account_env = getattr(module, "ACCOUNT_ID_ENV", None)
|
|
115
|
+
if account_env:
|
|
116
|
+
account_id = _overlay_account_id(str(account_env), str(getattr(module, "ACCOUNT_ID_SETTING", "")))
|
|
117
|
+
if not account_id:
|
|
118
|
+
return None, (
|
|
119
|
+
f"Refreshing the {provider} catalog needs {account_env} (or an account ID saved in Settings)."
|
|
120
|
+
)
|
|
121
|
+
kwargs["account_id"] = account_id
|
|
122
|
+
return kwargs, None
|
|
95
123
|
|
|
96
124
|
|
|
97
125
|
def _catalog_env_names(catalog: str) -> tuple[str, str]:
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
-
from typing import Any, Callable, Optional
|
|
7
|
+
from typing import Any, Callable, Mapping, Optional
|
|
8
8
|
|
|
9
9
|
from kolega_code.config import ModelProvider, RateLimitConfig
|
|
10
10
|
from kolega_code.llm.client import LLMClient
|
|
@@ -49,6 +49,7 @@ async def test_model_connection(
|
|
|
49
49
|
usage_ledger: Any = None,
|
|
50
50
|
base_url: Optional[str] = None,
|
|
51
51
|
api_style: Optional[str] = None,
|
|
52
|
+
default_headers: Optional[Mapping[str, str]] = None,
|
|
52
53
|
) -> ModelConnectionResult:
|
|
53
54
|
"""Send a tiny no-tool prompt through one provider/model pair.
|
|
54
55
|
|
|
@@ -78,6 +79,8 @@ async def test_model_connection(
|
|
|
78
79
|
factory_kwargs["base_url"] = base_url
|
|
79
80
|
if api_style:
|
|
80
81
|
factory_kwargs["api_style"] = api_style
|
|
82
|
+
if default_headers:
|
|
83
|
+
factory_kwargs["default_headers"] = dict(default_headers)
|
|
81
84
|
client = client_factory(**factory_kwargs)
|
|
82
85
|
messages = MessageHistory([Message(role="user", content=[TextBlock(text="Reply with OK.")])])
|
|
83
86
|
await asyncio.wait_for(
|
|
@@ -45,6 +45,7 @@ PROVIDER_LABELS: dict[ModelProvider, str] = {
|
|
|
45
45
|
ModelProvider.TOGETHER: "Together AI",
|
|
46
46
|
ModelProvider.DASHSCOPE: "DashScope / Qwen",
|
|
47
47
|
ModelProvider.OLLAMA_CLOUD: "Ollama Cloud",
|
|
48
|
+
ModelProvider.CLOUDFLARE_WORKERS_AI: "Cloudflare Workers AI",
|
|
48
49
|
ModelProvider.OPENROUTER: "OpenRouter",
|
|
49
50
|
ModelProvider.THINKING_MACHINES: "Thinking Machines",
|
|
50
51
|
ModelProvider.TINKER: "Tinker",
|
|
@@ -63,6 +64,8 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
63
64
|
"meta-llama/llama-4-maverick-17b-128e-instruct": "Llama 4 Maverick 17B",
|
|
64
65
|
# Moonshot
|
|
65
66
|
"kimi-k3": "Kimi K3",
|
|
67
|
+
"kimi-k3.1-pro": "Kimi K3.1 Pro",
|
|
68
|
+
"kimi-k3.1-pro-highspeed": "Kimi K3.1 Pro (High-Speed)",
|
|
66
69
|
"kimi-k2.7-code": "Kimi K2.7 Code",
|
|
67
70
|
"kimi-k2.7-code-highspeed": "Kimi K2.7 Code (High-Speed)",
|
|
68
71
|
"kimi-k2.6": "Kimi K2.6",
|
|
@@ -79,6 +82,8 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
79
82
|
# Kimi Coding Plan
|
|
80
83
|
"k3": "Kimi K3 (256K)",
|
|
81
84
|
"k3-256k": "Kimi K3-256K",
|
|
85
|
+
"k3.1-pro": "Kimi K3.1 Pro (256K)",
|
|
86
|
+
"k3.1-pro-highspeed": "Kimi K3.1 Pro (HighSpeed)",
|
|
82
87
|
"kimi-for-coding": "Kimi for Coding",
|
|
83
88
|
"kimi-for-coding-highspeed": "Kimi for Coding (HighSpeed)",
|
|
84
89
|
# DeepSeek
|
|
@@ -196,6 +201,20 @@ MODEL_LABELS: dict[str, str] = {
|
|
|
196
201
|
"qwen3-coder-next": "Qwen3 Coder Next",
|
|
197
202
|
"qwen3-coder:480b": "Qwen3 Coder 480B",
|
|
198
203
|
"qwen3.5:397b": "Qwen3.5 397B",
|
|
204
|
+
# Cloudflare Workers AI
|
|
205
|
+
"@cf/zai-org/glm-5.3": "GLM-5.3",
|
|
206
|
+
"@cf/zai-org/glm-5.3-flash": "GLM-5.3 Flash",
|
|
207
|
+
"@cf/moonshotai/kimi-k2.7-code": "Kimi K2.7 Code",
|
|
208
|
+
"@cf/deepseek-ai/deepseek-v4.1-flash-1017": "DeepSeek V4.1 Flash",
|
|
209
|
+
"@cf/deepseek-ai/deepseek-v4-pro-0813": "DeepSeek V4 Pro",
|
|
210
|
+
"@cf/zai-org/glm-5.2": "GLM-5.2",
|
|
211
|
+
"@cf/moonshotai/kimi-k2.6": "Kimi K2.6",
|
|
212
|
+
"@cf/qwen/qwen3.8-27b": "Qwen 3.8 27B",
|
|
213
|
+
"@cf/google/gemma-4-26b-a4b-it": "Gemma 4 26B A4B",
|
|
214
|
+
"@cf/nvidia/nemotron-3-120b-a12b": "Nemotron 3 120B A12B",
|
|
215
|
+
"@cf/openai/gpt-oss-120b": "GPT-OSS 120B",
|
|
216
|
+
"@cf/openai/gpt-oss-20b": "GPT-OSS 20B",
|
|
217
|
+
"@cf/zai-org/glm-4.7-flash": "GLM-4.7 Flash",
|
|
199
218
|
# Thinking Machines
|
|
200
219
|
"thinkingmachines/Inkling": "Inkling",
|
|
201
220
|
"thinkingmachines/Inkling-Small": "Inkling Small",
|
|
@@ -219,6 +238,7 @@ PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
|
|
|
219
238
|
ModelProvider.TOGETHER: "moonshotai/Kimi-K2.7-Code",
|
|
220
239
|
ModelProvider.DASHSCOPE: "qwen3-coder-plus",
|
|
221
240
|
ModelProvider.OLLAMA_CLOUD: "gpt-oss:20b",
|
|
241
|
+
ModelProvider.CLOUDFLARE_WORKERS_AI: "@cf/zai-org/glm-5.3",
|
|
222
242
|
# Hardcoded on purpose: regenerating the OpenRouter catalog reorders it by
|
|
223
243
|
# live usage, and that must never silently change what new users get.
|
|
224
244
|
ModelProvider.OPENROUTER: "moonshotai/kimi-k3",
|
|
@@ -265,6 +285,8 @@ def _api_key_env(provider: ModelProvider) -> str:
|
|
|
265
285
|
return ""
|
|
266
286
|
if provider == ModelProvider.OLLAMA_CLOUD:
|
|
267
287
|
return "OLLAMA_API_KEY"
|
|
288
|
+
if provider == ModelProvider.CLOUDFLARE_WORKERS_AI:
|
|
289
|
+
return "CLOUDFLARE_API_TOKEN"
|
|
268
290
|
if provider == ModelProvider.THINKING_MACHINES:
|
|
269
291
|
# Thinking Machines documents TINKER_API_KEY, not THINKING_MACHINES_API_KEY.
|
|
270
292
|
return "TINKER_API_KEY"
|
|
@@ -311,6 +311,9 @@ class CliSettings:
|
|
|
311
311
|
# Custom model endpoints keyed by endpoint id (provider value "custom:<id>").
|
|
312
312
|
# Additive optional field — absent in older files -> empty mapping.
|
|
313
313
|
custom_endpoints: dict[str, dict] = field(default_factory=dict)
|
|
314
|
+
# Account that scopes Cloudflare Workers AI requests (not a secret; the API
|
|
315
|
+
# token lives in api_keys). Additive optional field — absent -> None.
|
|
316
|
+
cloudflare_account_id: Optional[str] = None
|
|
314
317
|
schema_version: int = SETTINGS_SCHEMA_VERSION
|
|
315
318
|
# The document this instance was loaded from, used as the merge base by
|
|
316
319
|
# SettingsStore.save(). Never serialized.
|
|
@@ -376,6 +379,8 @@ class CliSettings:
|
|
|
376
379
|
compression_threshold=_coerce_compression_threshold(data.get("compression_threshold")),
|
|
377
380
|
# Additive optional field; absent in older files -> empty mapping.
|
|
378
381
|
custom_endpoints=_coerce_custom_endpoints(data.get("custom_endpoints")),
|
|
382
|
+
# Additive optional field; absent in older files -> None.
|
|
383
|
+
cloudflare_account_id=_coerce_optional_text(data.get("cloudflare_account_id")),
|
|
379
384
|
)
|
|
380
385
|
|
|
381
386
|
def to_dict(self) -> dict:
|
|
@@ -408,6 +413,7 @@ class CliSettings:
|
|
|
408
413
|
"skills_enabled": self.skills_enabled,
|
|
409
414
|
"compression_threshold": self.compression_threshold,
|
|
410
415
|
"custom_endpoints": self.custom_endpoints,
|
|
416
|
+
"cloudflare_account_id": self.cloudflare_account_id,
|
|
411
417
|
}
|
|
412
418
|
|
|
413
419
|
def get_api_key(self, provider: str) -> Optional[str]:
|
|
@@ -1628,6 +1628,8 @@ class AgentRuntimeMixin(tui_app_base.KolegaAppBase):
|
|
|
1628
1628
|
if event.sub_agent_info:
|
|
1629
1629
|
self._note_sub_agent_status(event)
|
|
1630
1630
|
else:
|
|
1631
|
+
if event.content.get("resumed") and self._turn_status_text != "Waiting for response…":
|
|
1632
|
+
return
|
|
1631
1633
|
text = self._display_text_from_event(event)
|
|
1632
1634
|
if text:
|
|
1633
1635
|
if self.show_logs:
|