kolega-code 0.29.0__tar.gz → 0.30.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kolega_code-0.29.0 → kolega_code-0.30.1}/CHANGELOG.md +47 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/PKG-INFO +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/__init__.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/baseagent.py +45 -18
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/compression.py +80 -35
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/agent_tool.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tools.py +0 -6
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/utils/commands.py +3 -3
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/config.py +11 -2
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/main.py +75 -14
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/model_catalog.py +5 -2
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/provider_registry.py +9 -2
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/slash_commands.py +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/theme.py +18 -18
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/agent_runtime.py +21 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/command_handlers.py +15 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/settings_panel.py +7 -2
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/config.py +5 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/client.py +18 -24
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/exceptions.py +59 -28
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/models.py +89 -25
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/anthropic.py +5 -5
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/deepseek_responses.py +5 -6
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/models.py +3 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/openai.py +4 -2
- kolega_code-0.30.1/kolega_code/llm/providers/perplexity_responses.py +107 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/responses_common.py +98 -4
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/__init__.py +3 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/deepseek.py +5 -4
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/google.py +13 -0
- kolega_code-0.30.1/kolega_code/llm/specs/catalog/perplexity_agent.py +616 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/xai.py +12 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/zai.py +12 -0
- kolega_code-0.30.1/kolega_code/llm/specs/perplexity_catalog.py +267 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/thinking.py +1 -11
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/usage.py +1 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/config.py +49 -7
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/service.py +103 -3
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/tools.py +29 -12
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/async_filesystem.py +0 -3
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/filesystem.py +0 -3
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/serializer.py +4 -13
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/terminal.py +10 -72
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/utils.py +0 -4
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/file_system.py +1 -4
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/html.py +0 -19
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/manager.py +5 -5
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/registry.py +0 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/pyproject.toml +1 -1
- {kolega_code-0.29.0 → kolega_code-0.30.1}/.gitignore +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/CONTRIBUTING.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/MIGRATION.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/README.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/RELEASING.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/messages.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/settings_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/events.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/extensions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/git_env.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/local_state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/permissions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/base.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/control.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/store.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/server.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,53 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.30.1 - 2026-08-17
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Compaction now uses the primary model's thinking setting instead of
|
|
14
|
+
omitting it. Empty or reasoning-only helper completions are retried,
|
|
15
|
+
then can still take the zero-tail recovery path instead of being
|
|
16
|
+
treated as a final `llm_error`.
|
|
17
|
+
|
|
18
|
+
## 0.30.0 - 2026-08-14
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- Added Google Gemini 3.7 Flash (`gemini-3.7-flash`): 1M-token context, 64K
|
|
23
|
+
output, vision and function calling, and `low`/`medium`/`high` thinking
|
|
24
|
+
levels. It omits Google's deprecated temperature parameter and is now the
|
|
25
|
+
default Google model.
|
|
26
|
+
- DeepSeek V4-Pro now routes to the Responses API by default (joining V4-Flash),
|
|
27
|
+
removing the model-name carve-out. Both DeepSeek models support `none`, `low`,
|
|
28
|
+
`high`, and `max` reasoning effort (`low` is new; `none` disables reasoning).
|
|
29
|
+
Hosted web search is now available on V4-Pro as well as V4-Flash.
|
|
30
|
+
- Added support for xAI Grok 4.6 (`grok-4.6`): 500K-token context, vision input,
|
|
31
|
+
and `low`/`medium`/`high`/`xhigh` reasoning effort. Selectable in the Settings
|
|
32
|
+
UI, `/model` picker, CLI flags, and env vars.
|
|
33
|
+
- Added support for Z.AI GLM-5.3 (`glm-5.3`) on the GLM Coding Plan provider:
|
|
34
|
+
1M-token context, 128K max output, and `high`/`max` thinking effort. GLM-5.3
|
|
35
|
+
is now the Z.AI default model.
|
|
36
|
+
- Added the Perplexity Agent API provider (`perplexity_agent`): one
|
|
37
|
+
`PERPLEXITY_API_KEY` reaches OpenAI, Anthropic, Google, xAI, and Perplexity
|
|
38
|
+
models through Perplexity's Responses-compatible Agent API, with optional
|
|
39
|
+
hosted search tools.
|
|
40
|
+
- `/plan` accepts an optional prompt: `/plan <task>` switches to plan mode and
|
|
41
|
+
starts that planning turn. Bare `/plan` still only switches mode.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- Google Gemini models no longer reject builtin tool calls with a 400 about
|
|
46
|
+
`additionalProperties` in function-declaration schemas.
|
|
47
|
+
- Quitting the TUI no longer waits up to 30s for an unresponsive language
|
|
48
|
+
server to acknowledge shutdown.
|
|
49
|
+
- The Z.AI context-window gauge now counts tokens locally (Z.AI's count
|
|
50
|
+
endpoint reports 0 for GLM-5.3) and residual usage calibrates from
|
|
51
|
+
multi-provider response billing.
|
|
52
|
+
- MCP tools whose names contain invalid characters or exceed provider length
|
|
53
|
+
limits are sanitized at collection time, and provider 400 details are shown
|
|
54
|
+
in the turn error instead of a generic failure.
|
|
55
|
+
|
|
9
56
|
## 0.29.0 - 2026-08-13
|
|
10
57
|
|
|
11
58
|
### Added
|
|
@@ -521,6 +521,8 @@ class BaseAgent(LogMixin):
|
|
|
521
521
|
# gate reads client_web_tools_enabled, the stream call reads
|
|
522
522
|
# hosted_web_search_active.
|
|
523
523
|
self.supports_hosted_web_search = bool(model_specs.get("supports_hosted_web_search", False))
|
|
524
|
+
# Spec-declared server-side tools; _apply_web_search_state derives the live list.
|
|
525
|
+
self._model_server_tools: List[str] = [str(tool) for tool in model_specs.get("server_tools") or []]
|
|
524
526
|
self.web_search_mode = getattr(self.config, "web_search_mode", "auto") or "auto"
|
|
525
527
|
self._apply_web_search_state()
|
|
526
528
|
|
|
@@ -731,22 +733,27 @@ class BaseAgent(LogMixin):
|
|
|
731
733
|
initialize()
|
|
732
734
|
|
|
733
735
|
def _apply_web_search_state(self) -> None:
|
|
734
|
-
"""Resolve web_search_mode + model capability into the
|
|
736
|
+
"""Resolve web_search_mode + model capability into the live gates.
|
|
735
737
|
|
|
736
738
|
``hosted_web_search_active`` — request the provider's server-side
|
|
737
739
|
web_search tool on main-loop stream calls. ``client_web_tools_enabled``
|
|
738
740
|
— register the client-side web_search/web_fetch tools (read by the
|
|
739
|
-
ToolCollection gate).
|
|
740
|
-
|
|
741
|
+
ToolCollection gate). ``server_tools`` — the spec-declared server-side
|
|
742
|
+
tools (e.g. the Perplexity Agent API's). One setting gates all of it:
|
|
743
|
+
auto/hosted request the server-side tooling, client defers to the
|
|
744
|
+
client-side web tools, off disables web tooling entirely. Active
|
|
745
|
+
server-side web tooling always excludes the client tools: two search
|
|
746
|
+
paths confuse the model and waste schema tokens.
|
|
741
747
|
"""
|
|
742
748
|
mode = (self.web_search_mode or "auto").lower()
|
|
743
749
|
supported = self.supports_hosted_web_search
|
|
750
|
+
server_web_tooling = supported or "web_search" in self._model_server_tools
|
|
744
751
|
if mode == "off":
|
|
745
752
|
hosted, client = False, False
|
|
746
753
|
elif mode == "client":
|
|
747
754
|
hosted, client = False, True
|
|
748
755
|
elif mode == "hosted":
|
|
749
|
-
if not
|
|
756
|
+
if not server_web_tooling:
|
|
750
757
|
provider = self.primary_model_config.provider
|
|
751
758
|
logger.warning(
|
|
752
759
|
"web_search_mode=hosted, but %s/%s has no hosted web search; falling back to the client tools",
|
|
@@ -758,6 +765,9 @@ class BaseAgent(LogMixin):
|
|
|
758
765
|
hosted, client = supported, not supported
|
|
759
766
|
self.hosted_web_search_active = hosted
|
|
760
767
|
self.client_web_tools_enabled = client
|
|
768
|
+
self.server_tools = list(self._model_server_tools) if mode in ("auto", "hosted") else []
|
|
769
|
+
if "web_search" in self.server_tools:
|
|
770
|
+
self.client_web_tools_enabled = False
|
|
761
771
|
|
|
762
772
|
def apply_web_search_mode(self, mode: str) -> None:
|
|
763
773
|
"""Change the web tool mode mid-session (TUI ``/web-search``).
|
|
@@ -770,31 +780,36 @@ class BaseAgent(LogMixin):
|
|
|
770
780
|
self._apply_web_search_state()
|
|
771
781
|
|
|
772
782
|
async def _emit_hosted_tool_call(self, delta: Dict[str, Any]) -> None:
|
|
773
|
-
"""Render a completed hosted
|
|
783
|
+
"""Render a completed hosted/server-side tool call as a tool_call/tool_result pair.
|
|
774
784
|
|
|
775
785
|
The call executed on the provider's servers; there is no local tool
|
|
776
|
-
invocation
|
|
777
|
-
injected into the model's context
|
|
778
|
-
|
|
786
|
+
invocation. For OpenAI/DeepSeek web_search the searched content never
|
|
787
|
+
reaches the client (it is injected into the model's context
|
|
788
|
+
server-side); Perplexity Agent API result items (search_results /
|
|
789
|
+
fetch_url_results) carry their results client-side via the delta's
|
|
790
|
+
item_type/payload. The shared item id correlates the pair in every
|
|
791
|
+
transcript consumer.
|
|
779
792
|
"""
|
|
780
793
|
block = WebSearchCallBlock(
|
|
781
794
|
item_id=delta.get("id") or None,
|
|
782
795
|
status=delta.get("status"),
|
|
783
796
|
action=delta.get("action") or {},
|
|
797
|
+
item_type=str(delta.get("item_type") or "web_search_call"),
|
|
798
|
+
payload=delta.get("payload"),
|
|
784
799
|
)
|
|
785
800
|
tool_call_id = block.item_id or str(uuid.uuid4())
|
|
786
801
|
await self.send_chat_message(
|
|
787
802
|
message_type="tool_call",
|
|
788
|
-
content=f"Calling {
|
|
803
|
+
content=f"Calling {block.tool_label}: {block.label()}",
|
|
789
804
|
is_streaming=False,
|
|
790
|
-
tool_description=
|
|
805
|
+
tool_description=block.tool_label,
|
|
791
806
|
tool_call_id=tool_call_id,
|
|
792
807
|
)
|
|
793
808
|
await self.send_chat_message(
|
|
794
809
|
message_type="tool_result",
|
|
795
810
|
content=block.result_summary(),
|
|
796
811
|
is_streaming=False,
|
|
797
|
-
tool_description=
|
|
812
|
+
tool_description=block.tool_label,
|
|
798
813
|
tool_call_id=tool_call_id,
|
|
799
814
|
)
|
|
800
815
|
|
|
@@ -1130,7 +1145,15 @@ class BaseAgent(LogMixin):
|
|
|
1130
1145
|
if new_calls:
|
|
1131
1146
|
self._context_residual_tokens += self.HOSTED_SEARCH_PROVISIONAL_TOKENS * new_calls
|
|
1132
1147
|
return
|
|
1133
|
-
billed = (
|
|
1148
|
+
billed = (
|
|
1149
|
+
assistant_message.usage.input_tokens
|
|
1150
|
+
if assistant_message.usage and assistant_message.usage.reported
|
|
1151
|
+
else (
|
|
1152
|
+
(assistant_message.usage_metadata or {}).get("prompt_tokens")
|
|
1153
|
+
or (assistant_message.usage_metadata or {}).get("input_tokens")
|
|
1154
|
+
or (assistant_message.usage_metadata or {}).get("prompt_token_count")
|
|
1155
|
+
)
|
|
1156
|
+
)
|
|
1134
1157
|
counted = self._last_raw_context_count
|
|
1135
1158
|
if not isinstance(billed, int) or counted is None:
|
|
1136
1159
|
return
|
|
@@ -1201,9 +1224,10 @@ class BaseAgent(LogMixin):
|
|
|
1201
1224
|
llm=self.llm,
|
|
1202
1225
|
model=self.primary_model_config.model,
|
|
1203
1226
|
temperature=self.model_default_temperature,
|
|
1204
|
-
#
|
|
1205
|
-
#
|
|
1206
|
-
thinking
|
|
1227
|
+
# Same thinking setting as the primary request. Omitting it is not a
|
|
1228
|
+
# disable: some endpoints default to reasoning-on, and some reject a
|
|
1229
|
+
# missing effort. A None effort (no thinking spec) still omits the field.
|
|
1230
|
+
thinking=self.primary_model_config.thinking_effort,
|
|
1207
1231
|
on_info=on_info,
|
|
1208
1232
|
on_error=on_error,
|
|
1209
1233
|
system_prompt_text=compaction_system_prompt,
|
|
@@ -2425,9 +2449,11 @@ class BaseAgent(LogMixin):
|
|
|
2425
2449
|
# at the model (llm_error — the provider client already applied
|
|
2426
2450
|
# its retry policy, so another summarization request buys
|
|
2427
2451
|
# nothing) or hit the minimum-history guard (too_few — a zero
|
|
2428
|
-
# tail must not weaken it).
|
|
2429
|
-
#
|
|
2430
|
-
#
|
|
2452
|
+
# tail must not weaken it). An empty_summary or
|
|
2453
|
+
# nothing_to_summarize result MAY proceed: empty completions
|
|
2454
|
+
# already exhausted in-pass retries, and with no retained tail
|
|
2455
|
+
# the safe boundary can advance past the previous one even
|
|
2456
|
+
# when the six-message tail could not.
|
|
2431
2457
|
if token_count.input_tokens > self.model_max_input_tokens and result.reason not in (
|
|
2432
2458
|
"llm_error",
|
|
2433
2459
|
"too_few",
|
|
@@ -2488,6 +2514,7 @@ class BaseAgent(LogMixin):
|
|
|
2488
2514
|
tools=self.tool_collection.get_tool_list(),
|
|
2489
2515
|
thinking=self.primary_model_config.thinking_effort,
|
|
2490
2516
|
hosted_web_search=self.hosted_web_search_active,
|
|
2517
|
+
server_tools=self.server_tools or None,
|
|
2491
2518
|
# The strict per-run budget rechecks this request inside
|
|
2492
2519
|
# the client; hand it the count already taken for the
|
|
2493
2520
|
# gauge (same history) so it is not counted twice.
|
|
@@ -23,7 +23,7 @@ LogCallback = Callable[[str], Awaitable[None]]
|
|
|
23
23
|
class CompactionResult:
|
|
24
24
|
"""Outcome of a compaction attempt, surfaced to callers and the UI.
|
|
25
25
|
|
|
26
|
-
``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "llm_error".
|
|
26
|
+
``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "empty_summary" | "llm_error".
|
|
27
27
|
``message`` is a human-readable line for the command output / logs.
|
|
28
28
|
"""
|
|
29
29
|
|
|
@@ -117,6 +117,37 @@ def _bundles_tool_results(message: Message) -> bool:
|
|
|
117
117
|
return isinstance(message.content, list) and any(isinstance(block, ToolResult) for block in message.content)
|
|
118
118
|
|
|
119
119
|
|
|
120
|
+
async def _stream_summary(
|
|
121
|
+
llm,
|
|
122
|
+
messages: MessageHistory,
|
|
123
|
+
system: Message,
|
|
124
|
+
temperature: float,
|
|
125
|
+
model: str,
|
|
126
|
+
thinking,
|
|
127
|
+
) -> Message:
|
|
128
|
+
"""Issue the compaction helper request and return the completed message.
|
|
129
|
+
|
|
130
|
+
Stream and consume events rather than calling ``generate()``: the Anthropic
|
|
131
|
+
SDK rejects non-streaming requests whose max_tokens is large enough to risk
|
|
132
|
+
a >10-minute response. The helper origin spans the whole request because
|
|
133
|
+
providers may sample and emit their trace record at context entry or
|
|
134
|
+
final-message time, not at ``stream()``.
|
|
135
|
+
"""
|
|
136
|
+
with llm_call_origin(helper_origin("compression")):
|
|
137
|
+
stream_cm = await llm.stream(
|
|
138
|
+
messages=messages,
|
|
139
|
+
system=system,
|
|
140
|
+
temperature=temperature,
|
|
141
|
+
model=model,
|
|
142
|
+
max_completion_tokens=HistoryCompressor.SUMMARY_MAX_TOKENS,
|
|
143
|
+
thinking=thinking,
|
|
144
|
+
)
|
|
145
|
+
async with stream_cm as stream:
|
|
146
|
+
async for _event in stream:
|
|
147
|
+
pass
|
|
148
|
+
return await stream.get_final_message()
|
|
149
|
+
|
|
150
|
+
|
|
120
151
|
class HistoryCompressor:
|
|
121
152
|
"""Summarizes a conversation non-destructively when it crosses the budget threshold."""
|
|
122
153
|
|
|
@@ -131,6 +162,9 @@ class HistoryCompressor:
|
|
|
131
162
|
# summary. A generous ceiling gives reasoning headroom while still staying
|
|
132
163
|
# well under the model's full completion budget.
|
|
133
164
|
SUMMARY_MAX_TOKENS = 8192
|
|
165
|
+
# Completed-but-empty summaries (reasoning-only, whitespace, no text) are
|
|
166
|
+
# retried on the same fitted request before the pass is reported unusable.
|
|
167
|
+
SUMMARY_EMPTY_ATTEMPTS = 3
|
|
134
168
|
# Attempts at widening the omission gap per budget rung.
|
|
135
169
|
MAX_FIT_ATTEMPTS = 6
|
|
136
170
|
|
|
@@ -254,13 +288,6 @@ class HistoryCompressor:
|
|
|
254
288
|
head_end, tail_start = new_head, new_tail
|
|
255
289
|
messages = build_request(head_end, tail_start)
|
|
256
290
|
|
|
257
|
-
# Stream and drain rather than calling generate(): the Anthropic SDK
|
|
258
|
-
# rejects non-streaming requests whose max_tokens is large enough to risk
|
|
259
|
-
# a >10-minute response, which the model's full completion budget triggers.
|
|
260
|
-
#
|
|
261
|
-
# The helper origin spans the whole request: providers may sample and
|
|
262
|
-
# emit their trace record at context entry or final-message time, not
|
|
263
|
-
# at stream().
|
|
264
291
|
response = None
|
|
265
292
|
last_error: Optional[LLMContextWindowExceededError] = None
|
|
266
293
|
dispatched_gap: Optional[tuple[int, int]] = None
|
|
@@ -273,19 +300,14 @@ class HistoryCompressor:
|
|
|
273
300
|
# re-sending it would only be rejected again.
|
|
274
301
|
continue
|
|
275
302
|
try:
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
)
|
|
285
|
-
async with stream_cm as stream:
|
|
286
|
-
async for _event in stream:
|
|
287
|
-
pass
|
|
288
|
-
response = await stream.get_final_message()
|
|
303
|
+
response = await _stream_summary(
|
|
304
|
+
llm,
|
|
305
|
+
messages=messages,
|
|
306
|
+
system=system_message,
|
|
307
|
+
temperature=temperature,
|
|
308
|
+
model=model,
|
|
309
|
+
thinking=thinking,
|
|
310
|
+
)
|
|
289
311
|
break
|
|
290
312
|
except LLMContextWindowExceededError as exc:
|
|
291
313
|
if max_input_tokens is None:
|
|
@@ -297,22 +319,45 @@ class HistoryCompressor:
|
|
|
297
319
|
assert last_error is not None
|
|
298
320
|
raise last_error
|
|
299
321
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if
|
|
304
|
-
|
|
322
|
+
last_empty_message = "Compression produced an empty summary; history left unchanged."
|
|
323
|
+
for attempt in range(1, self.SUMMARY_EMPTY_ATTEMPTS + 1):
|
|
324
|
+
summary_text = response.get_text_content()
|
|
325
|
+
if summary_text and summary_text.strip():
|
|
326
|
+
folded = split - prior_through
|
|
327
|
+
conversation.apply_compaction(summary_text, split)
|
|
328
|
+
done = f"Compressed {folded} older message(s) into a summary; kept the latest turns verbatim."
|
|
329
|
+
if on_info:
|
|
330
|
+
await on_info(done)
|
|
331
|
+
return CompactionResult(ok=True, reason="ok", summarized_messages=folded, message=done)
|
|
332
|
+
|
|
333
|
+
stop = getattr(response, "stop_reason", None)
|
|
334
|
+
stop_note = f" (stop_reason={stop})" if stop else ""
|
|
335
|
+
last_empty_message = f"Compression produced an empty summary{stop_note}; history left unchanged."
|
|
336
|
+
if attempt >= self.SUMMARY_EMPTY_ATTEMPTS:
|
|
337
|
+
break
|
|
338
|
+
retry_msg = (
|
|
339
|
+
f"Compression produced an empty summary{stop_note}; "
|
|
340
|
+
f"retrying ({attempt + 1}/{self.SUMMARY_EMPTY_ATTEMPTS})."
|
|
341
|
+
)
|
|
342
|
+
if on_info:
|
|
343
|
+
await on_info(retry_msg)
|
|
305
344
|
else:
|
|
306
|
-
logger.
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
345
|
+
logger.info(retry_msg)
|
|
346
|
+
# Same fitted request: empty completions are not a budget-fit failure.
|
|
347
|
+
response = await _stream_summary(
|
|
348
|
+
llm,
|
|
349
|
+
messages=messages,
|
|
350
|
+
system=system_message,
|
|
351
|
+
temperature=temperature,
|
|
352
|
+
model=model,
|
|
353
|
+
thinking=thinking,
|
|
354
|
+
)
|
|
311
355
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
356
|
+
if on_error:
|
|
357
|
+
await on_error(last_empty_message)
|
|
358
|
+
else:
|
|
359
|
+
logger.error(last_empty_message)
|
|
360
|
+
return CompactionResult(ok=False, reason="empty_summary", message=last_empty_message)
|
|
316
361
|
|
|
317
362
|
except Exception as e:
|
|
318
363
|
# Never swallow into a fake success: log the full traceback and surface
|
|
@@ -399,7 +399,7 @@ class AgentTool(BaseTool):
|
|
|
399
399
|
agent.session_recorder = scoped_recorder
|
|
400
400
|
|
|
401
401
|
# Track messages and their sequence
|
|
402
|
-
last_saved_index = -1
|
|
402
|
+
last_saved_index = -1
|
|
403
403
|
streamed_messages = {} # Track messages by UUID for assembly
|
|
404
404
|
|
|
405
405
|
# Process the task and stream messages
|
|
@@ -302,16 +302,13 @@ class ToolCollection(LogMixin):
|
|
|
302
302
|
self.workspace_id = workspace_id
|
|
303
303
|
self.thread_id = thread_id
|
|
304
304
|
|
|
305
|
-
# Convert string path to Path object if needed
|
|
306
305
|
self.project_path = Path(project_path) if isinstance(project_path, str) else project_path
|
|
307
306
|
|
|
308
|
-
# Create filesystem instance if not provided
|
|
309
307
|
if filesystem is None:
|
|
310
308
|
self.filesystem = LocalFileSystem(root_path=self.project_path)
|
|
311
309
|
else:
|
|
312
310
|
self.filesystem = filesystem
|
|
313
311
|
|
|
314
|
-
# Create terminal manager instance if not provided
|
|
315
312
|
if terminal_manager is None:
|
|
316
313
|
self.terminal_manager = LocalTerminalManager(
|
|
317
314
|
workspace_id, thread_id, connection_manager, default_workdir=self.project_path
|
|
@@ -319,7 +316,6 @@ class ToolCollection(LogMixin):
|
|
|
319
316
|
else:
|
|
320
317
|
self.terminal_manager = terminal_manager
|
|
321
318
|
|
|
322
|
-
# Create browser manager instance if not provided
|
|
323
319
|
if browser_manager is None:
|
|
324
320
|
self.browser_manager = PlaywrightBrowserManager()
|
|
325
321
|
else:
|
|
@@ -388,7 +384,6 @@ class ToolCollection(LogMixin):
|
|
|
388
384
|
}
|
|
389
385
|
self.tool_exclusions.extend(tool_config.tool_exclusions)
|
|
390
386
|
|
|
391
|
-
# Initialize tool backends
|
|
392
387
|
self._initialize_tools()
|
|
393
388
|
self._register_tool_extensions()
|
|
394
389
|
|
|
@@ -619,7 +614,6 @@ class ToolCollection(LogMixin):
|
|
|
619
614
|
browser_manager=self.browser_manager,
|
|
620
615
|
)
|
|
621
616
|
|
|
622
|
-
# Build tool
|
|
623
617
|
self.build_tool = BuildTool(
|
|
624
618
|
self.project_path,
|
|
625
619
|
self.workspace_id,
|
|
@@ -58,9 +58,9 @@ class CommandProcessor:
|
|
|
58
58
|
f"Compressed history: {result.summarized_messages} older message(s) summarized. "
|
|
59
59
|
f"Context {pct(before)}% → {pct(after)}% of the input budget."
|
|
60
60
|
)
|
|
61
|
-
if result.reason
|
|
62
|
-
return f"
|
|
63
|
-
return f"
|
|
61
|
+
if result.reason in ("too_few", "nothing_to_summarize"):
|
|
62
|
+
return f"Nothing to compress. {result.message} (context {pct(before)}% of the input budget)."
|
|
63
|
+
return f"Compression failed: {result.message}"
|
|
64
64
|
|
|
65
65
|
async def _handle_clear(self) -> str:
|
|
66
66
|
"""Handle the /clear command."""
|
|
@@ -74,6 +74,7 @@ API_KEY_ENV = {
|
|
|
74
74
|
ModelProvider.THINKING_MACHINES: "TINKER_API_KEY",
|
|
75
75
|
# Native Tinker sampling authenticates with the same key.
|
|
76
76
|
ModelProvider.TINKER: "TINKER_API_KEY",
|
|
77
|
+
ModelProvider.PERPLEXITY_AGENT: "PERPLEXITY_API_KEY",
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
DEFAULT_WEB_SEARCH_BACKEND = "duckduckgo"
|
|
@@ -780,13 +781,20 @@ def _resolve_active_thinking_effort(
|
|
|
780
781
|
settings: Optional[CliSettings],
|
|
781
782
|
) -> Optional[str]:
|
|
782
783
|
explicit_effort = overrides.thinking_effort or env.get("KOLEGA_CODE_THINKING_EFFORT")
|
|
784
|
+
saved_effort: Optional[str] = None
|
|
783
785
|
if explicit_effort is None and settings:
|
|
784
786
|
settings_model_matches = settings.active_provider == provider.value and settings.active_model == model
|
|
785
787
|
if settings_model_matches:
|
|
786
|
-
|
|
788
|
+
saved_effort = settings.active_thinking_effort
|
|
787
789
|
try:
|
|
788
|
-
return normalize_thinking_effort(
|
|
790
|
+
return normalize_thinking_effort(
|
|
791
|
+
provider, model, explicit_effort if explicit_effort is not None else saved_effort
|
|
792
|
+
)
|
|
789
793
|
except ValueError as exc:
|
|
794
|
+
if saved_effort is not None and explicit_effort is None:
|
|
795
|
+
# A saved effort can outlive a catalog change; fall back to the default
|
|
796
|
+
# instead of locking startup. Explicit requests still error.
|
|
797
|
+
return normalize_thinking_effort(provider, model, None)
|
|
790
798
|
raise CliConfigError(str(exc)) from exc
|
|
791
799
|
|
|
792
800
|
|
|
@@ -971,6 +979,7 @@ def build_agent_config(
|
|
|
971
979
|
ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
|
|
972
980
|
openrouter_api_key=_api_key_for_provider(ModelProvider.OPENROUTER, loaded_env, settings),
|
|
973
981
|
thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
|
|
982
|
+
perplexity_api_key=_api_key_for_provider(ModelProvider.PERPLEXITY_AGENT, loaded_env, settings),
|
|
974
983
|
environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
|
|
975
984
|
edit_protocol=edit_protocol,
|
|
976
985
|
long_context_config=_model_config(
|