kolega-code 0.26.8__tar.gz → 0.26.10__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.26.8 → kolega_code-0.26.10}/CHANGELOG.md +143 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/PKG-INFO +13 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/README.md +11 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/__init__.py +1 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/baseagent.py +188 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/conversation.py +2 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/kernel.py +31 -4
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +2 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +33 -37
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/eval_tool.py +1 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/terminal_tool.py +13 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tools.py +16 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/app.py +8 -4
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/ask_output.py +13 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/config.py +184 -82
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/main.py +43 -3
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/messages.py +20 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/model_connection.py +21 -16
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/provider_registry.py +18 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_store.py +5 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/settings.py +35 -6
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/agent_runtime.py +7 -2
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/app_base.py +1 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/command_handlers.py +38 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/onboarding_screen.py +10 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/settings_panel.py +458 -116
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/settings_screen.py +119 -49
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/state.py +8 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/styles.tcss +16 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/transcript.py +75 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/widgets.py +25 -2
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/config.py +7 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/client.py +8 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/models.py +172 -20
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/deepseek_responses.py +24 -6
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/models.py +3 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/openai.py +25 -1
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/responses_common.py +128 -42
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/__init__.py +2 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/accessors.py +27 -8
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/deepseek.py +24 -7
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openai.py +12 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openai_chatgpt.py +13 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/terminal.py +21 -2
- {kolega_code-0.26.8 → kolega_code-0.26.10}/pyproject.toml +16 -4
- {kolega_code-0.26.8 → kolega_code-0.26.10}/.gitignore +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/CONTRIBUTING.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/MIGRATION.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/RELEASING.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/events.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/git_env.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/llm/usage.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/local_state.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/permissions.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/runtime.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/base.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/html.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/control.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/session/store.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/server.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.26.8 → kolega_code-0.26.10}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,149 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.26.10 - 2026-08-05
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Hosted (server-side) web search for Responses-API providers. On DeepSeek
|
|
14
|
+
flash and OpenAI gpt-5.x (API key or ChatGPT subscription), kolega can
|
|
15
|
+
request the provider's own
|
|
16
|
+
`{"type": "web_search"}` tool: searches and page-opens execute on the
|
|
17
|
+
provider's servers and the content is injected directly into the model's
|
|
18
|
+
context (billed as input tokens; the context gauge accounts for it from
|
|
19
|
+
usage, since the content never reaches the client). Calls render in the
|
|
20
|
+
transcript as `web_search (hosted)`. Controlled by a new web tool mode —
|
|
21
|
+
`auto` (default: hosted when the model supports it, else the client tools) /
|
|
22
|
+
`hosted` / `client` / `off` — via Settings, `KOLEGA_CODE_WEB_SEARCH_MODE`,
|
|
23
|
+
`ask --web-search`, or the TUI's `/web-search`. When hosted search is active
|
|
24
|
+
the client-side `web_search`/`web_fetch` tools are not registered; `off`
|
|
25
|
+
removes all web tools (for sandboxed/benchmark runs). Notes: provider
|
|
26
|
+
per-search fees, if any, are not modeled in cost reporting (injected tokens
|
|
27
|
+
are); sessions that used hosted search store a new `web_search_call` history
|
|
28
|
+
block that older kolega builds cannot load.
|
|
29
|
+
- LSP tools can now be forced on or off for a single launch: `--lsp on|off`
|
|
30
|
+
on both the TUI and `kolega-code ask`, plus a `KOLEGA_CODE_LSP` env var,
|
|
31
|
+
resolved flag > env > settings > default-enabled. `--lsp on` overrides a
|
|
32
|
+
persisted `lsp_enabled=false` without writing back to settings. Turning LSP
|
|
33
|
+
off now removes the `lsp`/`lsp_edit` tools from the model entirely —
|
|
34
|
+
previously they stayed registered and could only answer "LSP is not
|
|
35
|
+
available" — and the Settings LSP status notes when the launch flag is
|
|
36
|
+
forcing the mode.
|
|
37
|
+
- The per-session scratchpad directory is now exported as `KOLEGA_SCRATCHPAD`
|
|
38
|
+
to every shell command and eval kernel, so scripts and kernels can reach the
|
|
39
|
+
session's throwaway workspace by environment variable instead of hardcoding
|
|
40
|
+
a temp path.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
|
|
44
|
+
- Thinking now renders as a collapsed row in the TUI transcript — `● Thinking
|
|
45
|
+
· … · 1.2k words` while streaming (a live word counter, never the text),
|
|
46
|
+
flipping to `● Thought · 12s · 1.2k words` on completion; expand the row to
|
|
47
|
+
read the full reasoning. Long reasoning turns (DeepSeek flash especially) no
|
|
48
|
+
longer dominate the transcript with full-height thinking walls.
|
|
49
|
+
- Resumed sessions now restore reasoning as the same collapsed thinking rows,
|
|
50
|
+
in true interleaved order with tool and hosted web-search rows: Anthropic
|
|
51
|
+
thinking text, DeepSeek flash's raw chain-of-thought, and OpenAI/ChatGPT
|
|
52
|
+
reasoning summaries all render (encrypted-only reasoning items have no
|
|
53
|
+
renderable text and are skipped). Previously reasoning vanished entirely
|
|
54
|
+
from restored transcripts.
|
|
55
|
+
- The coder prompt now follows a Codex-style final-message contract: the
|
|
56
|
+
closing report leads with what was delivered and its verified state, stays
|
|
57
|
+
brief by default with structure scaled to complexity, references files by
|
|
58
|
+
path instead of re-pasting contents, and never restates the plan step by
|
|
59
|
+
step. Preambles before tool calls are tightened to a single short line
|
|
60
|
+
naming the purpose of the next action, and verification effort is bounded —
|
|
61
|
+
tool results are trusted (no re-reading a file to confirm an edit applied)
|
|
62
|
+
and verification stops once no remaining check could realistically fail.
|
|
63
|
+
|
|
64
|
+
### Fixed
|
|
65
|
+
|
|
66
|
+
- Hosted web-search calls now render in their true position in the TUI
|
|
67
|
+
transcript. Previously the rows mounted at the bottom and stayed pinned
|
|
68
|
+
there while post-search reasoning kept streaming into the thinking bubble
|
|
69
|
+
above them; the stream now closes the open thinking/response segment at
|
|
70
|
+
each hosted call, so reasoning after a search opens a new bubble below its
|
|
71
|
+
rows (think → search → think → answer). Resumed sessions now render hosted
|
|
72
|
+
`web_search (hosted)` rows from history too — previously they were dropped
|
|
73
|
+
from the restored transcript.
|
|
74
|
+
- `ask --json` no longer emits spurious synthetic message fragments when
|
|
75
|
+
hosted web search flushes response text mid-stream: the lost-text fallback
|
|
76
|
+
now applies once at end of turn, and only when the turn produced no
|
|
77
|
+
assistant message.
|
|
78
|
+
- The context gauge no longer under-reads on `deepseek-v4-flash`. DeepSeek's
|
|
79
|
+
Responses API silently re-attaches every prior round's reasoning server-side and
|
|
80
|
+
bills it as input, but the client history held none of it, so the gauge (and the
|
|
81
|
+
auto-compaction trigger) could run over 100k tokens behind the real billed
|
|
82
|
+
context on reasoning-heavy sessions. Flash's plain-text reasoning is now retained
|
|
83
|
+
in history and resent each turn — the same shape Codex replays, deduped by the
|
|
84
|
+
server so billing is unchanged — which keeps the gauge on the real number and
|
|
85
|
+
preserves chain-of-thought continuity across session restores. The retained
|
|
86
|
+
reasoning text also now appears in `ask --json` message payloads (parity with
|
|
87
|
+
Anthropic thinking text); encrypted-only reasoning from OpenAI/ChatGPT stays
|
|
88
|
+
stripped as before.
|
|
89
|
+
|
|
90
|
+
### Security
|
|
91
|
+
|
|
92
|
+
- Dependency bumps for advisories published 2026-08-03/04: `cryptography`
|
|
93
|
+
48.0.1 → 50.0.0 (PKCS#7 Bleichenbacher oracle CVE-2026-69247, a name-constraint
|
|
94
|
+
wildcard bypass CVE-2026-69248, and a path-building DoS CVE-2026-69249) and
|
|
95
|
+
`aiohttp` 3.14.1 → 3.14.3 (three parser advisories, including an out-of-bounds
|
|
96
|
+
heap read in the C response parser). Exception: Intel Macs stay on
|
|
97
|
+
`cryptography` 48.0.1 — every fixed release dropped Intel-mac wheels, and
|
|
98
|
+
upgrading would break the curl installer there with a Rust+OpenSSL source
|
|
99
|
+
build — so those three advisories are knowingly accepted on that legacy
|
|
100
|
+
platform only.
|
|
101
|
+
|
|
102
|
+
## 0.26.9 - 2026-08-03
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
|
|
106
|
+
- Settings → Model & Account gains a **Model Slots** section for pinning the fast
|
|
107
|
+
and thinking models, each with its own provider. Previously these slots were
|
|
108
|
+
reachable only through CLI flags and environment variables, so in the TUI they
|
|
109
|
+
silently inherited the active model — every `web_fetch` answering call ran on
|
|
110
|
+
the main coding model. Slots still inherit by default, and each row now shows
|
|
111
|
+
which model it currently resolves to.
|
|
112
|
+
- The README now includes a direct invitation to the Kolega Code Discord
|
|
113
|
+
community.
|
|
114
|
+
|
|
115
|
+
### Changed
|
|
116
|
+
|
|
117
|
+
- Settings gains a **Providers** category, first in the rail, holding every model
|
|
118
|
+
provider's API key and the ChatGPT sign-in, each row labelled with its live
|
|
119
|
+
credential status. **Model & Account** is renamed **Models** and keeps only what
|
|
120
|
+
runs. Keys now stage per provider, so credentials for a provider you are not
|
|
121
|
+
currently using — needed by a fast/thinking slot or an agent-role override — can be
|
|
122
|
+
entered without switching your main model and switching back. **Test Connection**
|
|
123
|
+
moves with them and probes the selected provider rather than the active model, so a
|
|
124
|
+
credential can be checked without running on that provider.
|
|
125
|
+
- **Breaking:** provider and model are now always specified together. `--provider`
|
|
126
|
+
without `--model` (and the per-role/per-slot equivalents such as
|
|
127
|
+
`KOLEGA_CODE_FAST_PROVIDER`) is an error instead of silently selecting that
|
|
128
|
+
provider's default model, and a model named without a provider is rejected rather
|
|
129
|
+
than assumed to be Anthropic's. Scripts passing only one of the pair need updating;
|
|
130
|
+
the error names the missing flag. Saved settings are unaffected — the Settings UI
|
|
131
|
+
always writes both — and a saved model that later leaves the catalog still degrades
|
|
132
|
+
to the provider's default rather than blocking startup.
|
|
133
|
+
|
|
134
|
+
### Fixed
|
|
135
|
+
|
|
136
|
+
- `deepseek-v4-flash` no longer has its reasoning truncated mid-derivation. The
|
|
137
|
+
64000-token output cap added in 0.26.8 was measured on the chat API for
|
|
138
|
+
`deepseek-v4-pro` and applied to flash by assumption; flash actually runs to
|
|
139
|
+
at least 112990 output tokens in a single Responses call. Hard tasks that
|
|
140
|
+
reason for a long time before acting were cut off at the cap and produced no
|
|
141
|
+
tool call at all. flash now uses its full published output budget, while pro
|
|
142
|
+
and the fireworks/openrouter DeepSeek routes keep the 64000 cap where their
|
|
143
|
+
measured ceilings apply.
|
|
144
|
+
|
|
145
|
+
### Removed
|
|
146
|
+
|
|
147
|
+
- The unreachable `DEFAULT_LONG_MODEL`, `DEFAULT_FAST_MODEL`, `DEFAULT_THINKING_MODEL`
|
|
148
|
+
and their provider constants. No model was ever resolved through them — an unset
|
|
149
|
+
slot inherits the active model — but they were documented as defaults, which is
|
|
150
|
+
where "what is my fast model?" became unanswerable.
|
|
151
|
+
|
|
9
152
|
## 0.26.8 - 2026-08-03
|
|
10
153
|
|
|
11
154
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.26.
|
|
3
|
+
Version: 0.26.10
|
|
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/
|
|
@@ -231,6 +231,7 @@ Requires-Python: >=3.11
|
|
|
231
231
|
Requires-Dist: anthropic==0.101.0
|
|
232
232
|
Requires-Dist: beautifulsoup4==4.14.3
|
|
233
233
|
Requires-Dist: cryptography==48.0.1; sys_platform == 'darwin' and platform_machine == 'x86_64'
|
|
234
|
+
Requires-Dist: cryptography==50.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'
|
|
234
235
|
Requires-Dist: ddgs==9.14.4
|
|
235
236
|
Requires-Dist: fastapi==0.139.2
|
|
236
237
|
Requires-Dist: filelock==3.20.3
|
|
@@ -494,6 +495,7 @@ Full documentation lives at **[kolega-ai.github.io/kolega-code](https://kolega-a
|
|
|
494
495
|
- [Contributing](CONTRIBUTING.md)
|
|
495
496
|
- [Security policy](SECURITY.md)
|
|
496
497
|
- [Issue tracker](https://github.com/kolega-ai/kolega-code/issues)
|
|
498
|
+
- [Discord community](https://discord.gg/kaS8PKKp4)
|
|
497
499
|
|
|
498
500
|
## Contributing
|
|
499
501
|
|
|
@@ -504,3 +506,13 @@ privately per [SECURITY.md](SECURITY.md).
|
|
|
504
506
|
## License
|
|
505
507
|
|
|
506
508
|
Released under the [Apache License 2.0](LICENSE).
|
|
509
|
+
|
|
510
|
+
## Join the community
|
|
511
|
+
|
|
512
|
+
Building something with Kolega Code, hit a rough edge, or want to shape where
|
|
513
|
+
Gigacode goes next? Come talk to us.
|
|
514
|
+
|
|
515
|
+
[](https://discord.gg/kaS8PKKp4)
|
|
516
|
+
|
|
517
|
+
**→ [Join the Kolega Code Discord](https://discord.gg/kaS8PKKp4)** — share workflows,
|
|
518
|
+
get help, and hear about releases first.
|
|
@@ -215,6 +215,7 @@ Full documentation lives at **[kolega-ai.github.io/kolega-code](https://kolega-a
|
|
|
215
215
|
- [Contributing](CONTRIBUTING.md)
|
|
216
216
|
- [Security policy](SECURITY.md)
|
|
217
217
|
- [Issue tracker](https://github.com/kolega-ai/kolega-code/issues)
|
|
218
|
+
- [Discord community](https://discord.gg/kaS8PKKp4)
|
|
218
219
|
|
|
219
220
|
## Contributing
|
|
220
221
|
|
|
@@ -225,3 +226,13 @@ privately per [SECURITY.md](SECURITY.md).
|
|
|
225
226
|
## License
|
|
226
227
|
|
|
227
228
|
Released under the [Apache License 2.0](LICENSE).
|
|
229
|
+
|
|
230
|
+
## Join the community
|
|
231
|
+
|
|
232
|
+
Building something with Kolega Code, hit a rough edge, or want to shape where
|
|
233
|
+
Gigacode goes next? Come talk to us.
|
|
234
|
+
|
|
235
|
+
[](https://discord.gg/kaS8PKKp4)
|
|
236
|
+
|
|
237
|
+
**→ [Join the Kolega Code Discord](https://discord.gg/kaS8PKKp4)** — share workflows,
|
|
238
|
+
get help, and hear about releases first.
|
|
@@ -43,7 +43,15 @@ from kolega_code.llm.exceptions import (
|
|
|
43
43
|
)
|
|
44
44
|
from kolega_code.llm.instrumented_client import get_output_tokens
|
|
45
45
|
from kolega_code.llm.ledger import HISTORY_ORIGIN, LlmCallOrigin, helper_origin, llm_call_origin
|
|
46
|
-
from kolega_code.llm.models import
|
|
46
|
+
from kolega_code.llm.models import (
|
|
47
|
+
ImageBlock,
|
|
48
|
+
Message,
|
|
49
|
+
MessageHistory,
|
|
50
|
+
TextBlock,
|
|
51
|
+
ToolCall,
|
|
52
|
+
ToolResult,
|
|
53
|
+
WebSearchCallBlock,
|
|
54
|
+
)
|
|
47
55
|
from kolega_code.llm.providers.models import TokenCount
|
|
48
56
|
from kolega_code.llm.specs import (
|
|
49
57
|
deepseek_output_token_cap,
|
|
@@ -461,6 +469,15 @@ class BaseAgent(LogMixin):
|
|
|
461
469
|
# tool) and used by _unsupported_attachment_message to reject image
|
|
462
470
|
# attachments for non-vision models with a clear message.
|
|
463
471
|
self.supports_vision = bool(model_specs.get("supports_vision", False))
|
|
472
|
+
# Web tool mode: whether the provider's hosted (server-side) web_search
|
|
473
|
+
# tool is requested and whether the client-side web_search/web_fetch
|
|
474
|
+
# tools are registered. Resolved from config.web_search_mode plus the
|
|
475
|
+
# model's supports_hosted_web_search catalog flag; the ToolCollection
|
|
476
|
+
# gate reads client_web_tools_enabled, the stream call reads
|
|
477
|
+
# hosted_web_search_active.
|
|
478
|
+
self.supports_hosted_web_search = bool(model_specs.get("supports_hosted_web_search", False))
|
|
479
|
+
self.web_search_mode = getattr(self.config, "web_search_mode", "auto") or "auto"
|
|
480
|
+
self._apply_web_search_state()
|
|
464
481
|
|
|
465
482
|
self.llm = context.create_llm_client(agent_name=self.agent_name)
|
|
466
483
|
|
|
@@ -487,6 +504,15 @@ class BaseAgent(LogMixin):
|
|
|
487
504
|
self._workflow_accounting: Optional["WorkflowRunAccounting"] = None
|
|
488
505
|
self._accounting_reservation: Optional["AgentReservation"] = None
|
|
489
506
|
self.total_tokens_used: int = 0
|
|
507
|
+
# Hosted web-search accounting side-channel. Searched/fetched content is
|
|
508
|
+
# injected into the model's context SERVER-side (restored on replay of
|
|
509
|
+
# web_search_call items, billed as input) and never reaches the client,
|
|
510
|
+
# so tiktoken-over-history can't see it. The residual — billed input
|
|
511
|
+
# minus the client-side count of the request actually sent — measures it
|
|
512
|
+
# and is added to the gauge in count_current_context. Updated by
|
|
513
|
+
# _update_hosted_search_residual; zeroed by compress_history.
|
|
514
|
+
self._hosted_injected_tokens: int = 0
|
|
515
|
+
self._last_raw_context_count: Optional[int] = None
|
|
490
516
|
# Set by a blocking PostToolUse hook to end the turn after the current tool batch.
|
|
491
517
|
self._hook_end_turn = False
|
|
492
518
|
self.queued_input_provider: Optional[Callable[[], Awaitable[List[QueuedUserInput]]]] = None
|
|
@@ -652,6 +678,74 @@ class BaseAgent(LogMixin):
|
|
|
652
678
|
if callable(initialize):
|
|
653
679
|
initialize()
|
|
654
680
|
|
|
681
|
+
def _apply_web_search_state(self) -> None:
|
|
682
|
+
"""Resolve web_search_mode + model capability into the two live gates.
|
|
683
|
+
|
|
684
|
+
``hosted_web_search_active`` — request the provider's server-side
|
|
685
|
+
web_search tool on main-loop stream calls. ``client_web_tools_enabled``
|
|
686
|
+
— register the client-side web_search/web_fetch tools (read by the
|
|
687
|
+
ToolCollection gate). Hosted active always excludes the client tools:
|
|
688
|
+
two search paths confuse the model and waste schema tokens.
|
|
689
|
+
"""
|
|
690
|
+
mode = (self.web_search_mode or "auto").lower()
|
|
691
|
+
supported = self.supports_hosted_web_search
|
|
692
|
+
if mode == "off":
|
|
693
|
+
hosted, client = False, False
|
|
694
|
+
elif mode == "client":
|
|
695
|
+
hosted, client = False, True
|
|
696
|
+
elif mode == "hosted":
|
|
697
|
+
if not supported:
|
|
698
|
+
provider = self.primary_model_config.provider
|
|
699
|
+
logger.warning(
|
|
700
|
+
"web_search_mode=hosted, but %s/%s has no hosted web search; falling back to the client tools",
|
|
701
|
+
getattr(provider, "value", provider),
|
|
702
|
+
self.primary_model_config.model,
|
|
703
|
+
)
|
|
704
|
+
hosted, client = supported, not supported
|
|
705
|
+
else: # auto
|
|
706
|
+
hosted, client = supported, not supported
|
|
707
|
+
self.hosted_web_search_active = hosted
|
|
708
|
+
self.client_web_tools_enabled = client
|
|
709
|
+
|
|
710
|
+
def apply_web_search_mode(self, mode: str) -> None:
|
|
711
|
+
"""Change the web tool mode mid-session (TUI ``/web-search``).
|
|
712
|
+
|
|
713
|
+
Mirrors :meth:`apply_gigacode`: the tool registry rebuilds per call and
|
|
714
|
+
the next stream call reads the hosted gate, so no cache invalidation is
|
|
715
|
+
needed. No prompt work — the tools carry their own affordances.
|
|
716
|
+
"""
|
|
717
|
+
self.web_search_mode = (mode or "auto").lower()
|
|
718
|
+
self._apply_web_search_state()
|
|
719
|
+
|
|
720
|
+
async def _emit_hosted_tool_call(self, delta: Dict[str, Any]) -> None:
|
|
721
|
+
"""Render a completed hosted web_search call as a tool_call/tool_result pair.
|
|
722
|
+
|
|
723
|
+
The call executed on the provider's servers; there is no local tool
|
|
724
|
+
invocation and the searched content never reaches the client (it is
|
|
725
|
+
injected into the model's context server-side). The shared item id
|
|
726
|
+
correlates the pair in every transcript consumer.
|
|
727
|
+
"""
|
|
728
|
+
block = WebSearchCallBlock(
|
|
729
|
+
item_id=delta.get("id") or None,
|
|
730
|
+
status=delta.get("status"),
|
|
731
|
+
action=delta.get("action") or {},
|
|
732
|
+
)
|
|
733
|
+
tool_call_id = block.item_id or str(uuid.uuid4())
|
|
734
|
+
await self.send_chat_message(
|
|
735
|
+
message_type="tool_call",
|
|
736
|
+
content=f"Calling {WebSearchCallBlock.TOOL_LABEL}: {block.label()}",
|
|
737
|
+
is_streaming=False,
|
|
738
|
+
tool_description=WebSearchCallBlock.TOOL_LABEL,
|
|
739
|
+
tool_call_id=tool_call_id,
|
|
740
|
+
)
|
|
741
|
+
await self.send_chat_message(
|
|
742
|
+
message_type="tool_result",
|
|
743
|
+
content=block.result_summary(),
|
|
744
|
+
is_streaming=False,
|
|
745
|
+
tool_description=WebSearchCallBlock.TOOL_LABEL,
|
|
746
|
+
tool_call_id=tool_call_id,
|
|
747
|
+
)
|
|
748
|
+
|
|
655
749
|
def apply_goal(self, condition: Optional[str], prompt_extension: Optional["PromptExtension"] = None) -> None:
|
|
656
750
|
"""Set, replace, or clear the active autonomous goal for this session.
|
|
657
751
|
|
|
@@ -944,12 +1038,61 @@ class BaseAgent(LogMixin):
|
|
|
944
1038
|
model=self.primary_model_config.model,
|
|
945
1039
|
tools=self.tool_collection.get_tool_list(),
|
|
946
1040
|
)
|
|
1041
|
+
# Hosted web-search content lives only in the server's copy of the
|
|
1042
|
+
# context (restored on replay of the web_search_call items, billed as
|
|
1043
|
+
# input) — the client history has nothing to count for it. Add the
|
|
1044
|
+
# residual measured from billed usage so the gauge AND the compaction
|
|
1045
|
+
# check both see the true context size. Nonzero only while un-compacted
|
|
1046
|
+
# web_search_call blocks exist (see _update_hosted_search_residual).
|
|
1047
|
+
self._last_raw_context_count = token_count.input_tokens
|
|
1048
|
+
if self._hosted_injected_tokens > 0:
|
|
1049
|
+
token_count.input_tokens += self._hosted_injected_tokens
|
|
947
1050
|
|
|
948
1051
|
# Send context update event
|
|
949
1052
|
await self._send_context_update(token_count)
|
|
950
1053
|
|
|
951
1054
|
return token_count
|
|
952
1055
|
|
|
1056
|
+
# Provisional residual bump per hosted web-search call, applied while the
|
|
1057
|
+
# search-bearing response's own billing is telescoped (a response that
|
|
1058
|
+
# searched is several internal invocations billed cumulatively, so its
|
|
1059
|
+
# billed−counted residual overstates the persistent injected size). The next
|
|
1060
|
+
# clean response replaces the estimate with the measured residual. Probe
|
|
1061
|
+
# calibration 2026-08-04 (findings/probes/hosted_web_search_probe.py):
|
|
1062
|
+
# one-call persistent overhead ≈850 (deepseek) / ≈5000 (openai) tokens —
|
|
1063
|
+
# 6000 overestimates safely, and overestimating only compacts early.
|
|
1064
|
+
HOSTED_SEARCH_PROVISIONAL_TOKENS = 6000
|
|
1065
|
+
|
|
1066
|
+
def _update_hosted_search_residual(self, assistant_message: Message) -> None:
|
|
1067
|
+
"""Track server-injected hosted-search content from billed usage.
|
|
1068
|
+
|
|
1069
|
+
Search-bearing responses bump the estimate by a provisional per-call
|
|
1070
|
+
constant (their own billing telescopes internal rounds, so the direct
|
|
1071
|
+
residual would overshoot and could trip compaction spuriously). Clean
|
|
1072
|
+
responses — single invocation, so ``billed − counted`` is exact —
|
|
1073
|
+
replace it with the measurement. No-ops for sessions that never
|
|
1074
|
+
searched, keeping the known ±tokenizer-drift band out of the gauge.
|
|
1075
|
+
"""
|
|
1076
|
+
content = assistant_message.content if isinstance(assistant_message.content, list) else []
|
|
1077
|
+
new_calls = sum(1 for block in content if isinstance(block, WebSearchCallBlock))
|
|
1078
|
+
if new_calls:
|
|
1079
|
+
self._hosted_injected_tokens += self.HOSTED_SEARCH_PROVISIONAL_TOKENS * new_calls
|
|
1080
|
+
return
|
|
1081
|
+
if self._hosted_injected_tokens <= 0 and not self._history_contains_hosted_search():
|
|
1082
|
+
return
|
|
1083
|
+
billed = (assistant_message.usage_metadata or {}).get("prompt_tokens")
|
|
1084
|
+
counted = self._last_raw_context_count
|
|
1085
|
+
if not isinstance(billed, int) or counted is None:
|
|
1086
|
+
return
|
|
1087
|
+
self._hosted_injected_tokens = max(0, billed - counted)
|
|
1088
|
+
|
|
1089
|
+
def _history_contains_hosted_search(self) -> bool:
|
|
1090
|
+
for message in self.history:
|
|
1091
|
+
content = getattr(message, "content", None)
|
|
1092
|
+
if isinstance(content, list) and any(isinstance(block, WebSearchCallBlock) for block in content):
|
|
1093
|
+
return True
|
|
1094
|
+
return False
|
|
1095
|
+
|
|
953
1096
|
async def _send_context_update(self, token_count: TokenCount) -> None:
|
|
954
1097
|
"""Send an event to update the UI about current context usage."""
|
|
955
1098
|
usage_percentage = (token_count.input_tokens / self.model_context_length) * 100
|
|
@@ -977,6 +1120,11 @@ class BaseAgent(LogMixin):
|
|
|
977
1120
|
show progress, then recounts + emits a context_update so the gauge
|
|
978
1121
|
refreshes. Returns the structured outcome.
|
|
979
1122
|
"""
|
|
1123
|
+
# Compacted-away web_search_call blocks stop being replayed, so the
|
|
1124
|
+
# server stops restoring their content. Reset the hosted-search residual
|
|
1125
|
+
# rather than carrying a stale figure; if search blocks survive in the
|
|
1126
|
+
# verbatim tail, the next clean response re-measures it.
|
|
1127
|
+
self._hosted_injected_tokens = 0
|
|
980
1128
|
|
|
981
1129
|
async def on_info(message: str) -> None:
|
|
982
1130
|
await self.log_info(message, sender=self.agent_name)
|
|
@@ -2093,6 +2241,7 @@ class BaseAgent(LogMixin):
|
|
|
2093
2241
|
model=self.primary_model_config.model,
|
|
2094
2242
|
tools=self.tool_collection.get_tool_list(),
|
|
2095
2243
|
thinking=self.primary_model_config.thinking_effort,
|
|
2244
|
+
hosted_web_search=self.hosted_web_search_active,
|
|
2096
2245
|
),
|
|
2097
2246
|
)
|
|
2098
2247
|
async with stream_cm as stream:
|
|
@@ -2135,8 +2284,46 @@ class BaseAgent(LogMixin):
|
|
|
2135
2284
|
|
|
2136
2285
|
await self.on_tool_use_start(event.tool_call_delta)
|
|
2137
2286
|
|
|
2287
|
+
elif event.type == "hosted_tool_call" and event.tool_call_delta:
|
|
2288
|
+
# A server-side web_search call completed on the
|
|
2289
|
+
# provider's infrastructure — no local execution.
|
|
2290
|
+
# Surface it as a normal tool_call/tool_result pair
|
|
2291
|
+
# so every transcript view renders it.
|
|
2292
|
+
#
|
|
2293
|
+
# Close the current thinking/response segment first
|
|
2294
|
+
# and rotate both uuids: transcript consumers key
|
|
2295
|
+
# streamed entries by uuid, so without rotation the
|
|
2296
|
+
# post-search reasoning folds into the bubble above
|
|
2297
|
+
# these rows instead of opening a new one below
|
|
2298
|
+
# them. Guards mirror the end-of-stream flushes: an
|
|
2299
|
+
# unopened thinking segment yields nothing, while
|
|
2300
|
+
# the response flush is unconditional (an empty
|
|
2301
|
+
# complete response chunk is a documented no-op for
|
|
2302
|
+
# every consumer) so a partially streamed response
|
|
2303
|
+
# entry is never stranded incomplete by rotation.
|
|
2304
|
+
if thinking_started or current_thinking:
|
|
2305
|
+
yield {
|
|
2306
|
+
"type": "thinking",
|
|
2307
|
+
"content": current_thinking,
|
|
2308
|
+
"complete": True,
|
|
2309
|
+
"uuid": thinking_uuid,
|
|
2310
|
+
}
|
|
2311
|
+
current_thinking = ""
|
|
2312
|
+
thinking_started = False
|
|
2313
|
+
thinking_uuid = str(uuid.uuid4())
|
|
2314
|
+
yield {
|
|
2315
|
+
"type": "response",
|
|
2316
|
+
"content": current_response,
|
|
2317
|
+
"complete": True,
|
|
2318
|
+
"uuid": response_uuid,
|
|
2319
|
+
}
|
|
2320
|
+
current_response = ""
|
|
2321
|
+
response_uuid = str(uuid.uuid4())
|
|
2322
|
+
await self._emit_hosted_tool_call(event.tool_call_delta)
|
|
2323
|
+
|
|
2138
2324
|
assistant_message = await stream.get_final_message()
|
|
2139
2325
|
self._normalize_freeform_tool_calls(assistant_message)
|
|
2326
|
+
self._update_hosted_search_residual(assistant_message)
|
|
2140
2327
|
assistant_message.usage_metadata["edit_protocol"] = self.edit_protocol.value
|
|
2141
2328
|
response_output_tokens = get_output_tokens(
|
|
2142
2329
|
assistant_message.usage_metadata,
|
|
@@ -22,6 +22,7 @@ from kolega_code.llm.models import (
|
|
|
22
22
|
ThinkingBlock,
|
|
23
23
|
ToolCall,
|
|
24
24
|
ToolResult,
|
|
25
|
+
WebSearchCallBlock,
|
|
25
26
|
)
|
|
26
27
|
from kolega_code.llm.specs import prior_reasoning_is_replayable
|
|
27
28
|
from kolega_code.utils import images as image_utils
|
|
@@ -336,7 +337,7 @@ def _adapt_content_blocks_for_provider(
|
|
|
336
337
|
)
|
|
337
338
|
adapted.append(adapted_block)
|
|
338
339
|
changed = changed or image_changed
|
|
339
|
-
elif isinstance(block, (ThinkingBlock, RedactedThinkingBlock, ResponsesReasoningBlock)):
|
|
340
|
+
elif isinstance(block, (ThinkingBlock, RedactedThinkingBlock, ResponsesReasoningBlock, WebSearchCallBlock)):
|
|
340
341
|
if _preserve_reasoning_block(
|
|
341
342
|
block,
|
|
342
343
|
source_provider=source_provider,
|
|
@@ -414,20 +414,36 @@ class EvalKernelManager:
|
|
|
414
414
|
thread_id: str,
|
|
415
415
|
project_path: Path,
|
|
416
416
|
config: object,
|
|
417
|
+
scratchpad_dir: Optional[Path] = None,
|
|
417
418
|
) -> "EvalKernelManager":
|
|
418
419
|
"""Shared manager for an agent session; sub-agents join the same one."""
|
|
419
420
|
key = (workspace_id, thread_id)
|
|
420
421
|
manager = cls._registry.get(key)
|
|
421
422
|
if manager is None or manager._shutdown:
|
|
422
|
-
manager = cls(
|
|
423
|
+
manager = cls(
|
|
424
|
+
workspace_id=workspace_id,
|
|
425
|
+
thread_id=thread_id,
|
|
426
|
+
project_path=project_path,
|
|
427
|
+
config=config,
|
|
428
|
+
scratchpad_dir=scratchpad_dir,
|
|
429
|
+
)
|
|
423
430
|
cls._registry[key] = manager
|
|
424
431
|
return manager
|
|
425
432
|
|
|
426
|
-
def __init__(
|
|
433
|
+
def __init__(
|
|
434
|
+
self,
|
|
435
|
+
*,
|
|
436
|
+
workspace_id: str,
|
|
437
|
+
thread_id: str,
|
|
438
|
+
project_path: Path,
|
|
439
|
+
config: object,
|
|
440
|
+
scratchpad_dir: Optional[Path] = None,
|
|
441
|
+
) -> None:
|
|
427
442
|
self.workspace_id = workspace_id
|
|
428
443
|
self.thread_id = thread_id
|
|
429
444
|
self.project_path = Path(project_path)
|
|
430
445
|
self.config = config
|
|
446
|
+
self.scratchpad_dir = Path(scratchpad_dir) if scratchpad_dir else None
|
|
431
447
|
self.session_id = uuid.uuid4().hex
|
|
432
448
|
self._kernels: Dict[str, BaseKernel] = {}
|
|
433
449
|
self._locks: Dict[str, asyncio.Lock] = {}
|
|
@@ -437,6 +453,17 @@ class EvalKernelManager:
|
|
|
437
453
|
|
|
438
454
|
# -- kernels ------------------------------------------------------------
|
|
439
455
|
|
|
456
|
+
def _kernel_child_env(self) -> Dict[str, str]:
|
|
457
|
+
"""Base env for kernel subprocesses, shared by the py and js kernels.
|
|
458
|
+
|
|
459
|
+
KOLEGA_SCRATCHPAD matches the variable injected into terminal sessions,
|
|
460
|
+
so eval cells and shell commands share one durable session location.
|
|
461
|
+
"""
|
|
462
|
+
env = build_child_env()
|
|
463
|
+
if self.scratchpad_dir is not None:
|
|
464
|
+
env["KOLEGA_SCRATCHPAD"] = str(self.scratchpad_dir)
|
|
465
|
+
return env
|
|
466
|
+
|
|
440
467
|
def _env_manager_for_thread(self) -> EvalEnvironmentManager:
|
|
441
468
|
if self._env_manager is None:
|
|
442
469
|
env_path_raw = _cfg_str(self.config, "eval_env_path")
|
|
@@ -464,7 +491,7 @@ class EvalKernelManager:
|
|
|
464
491
|
|
|
465
492
|
env_info = await self._ensure_env()
|
|
466
493
|
bridge = await ToolBridge.ensure()
|
|
467
|
-
kernel_env =
|
|
494
|
+
kernel_env = self._kernel_child_env()
|
|
468
495
|
kernel_env.update(
|
|
469
496
|
{
|
|
470
497
|
"KOLEGA_TOOL_BRIDGE_URL": bridge.url,
|
|
@@ -502,7 +529,7 @@ class EvalKernelManager:
|
|
|
502
529
|
package_json = js_home / "package.json"
|
|
503
530
|
if not package_json.exists():
|
|
504
531
|
package_json.write_text("{}\n", encoding="utf-8")
|
|
505
|
-
kernel_env =
|
|
532
|
+
kernel_env = self._kernel_child_env()
|
|
506
533
|
npm_cmd = runtime.npm_install_cmd(js_home)
|
|
507
534
|
kernel_env.update(
|
|
508
535
|
{
|
|
@@ -2,6 +2,8 @@ You have a private scratchpad working directory for this session at:
|
|
|
2
2
|
|
|
3
3
|
`{{ scratchpad_path }}`
|
|
4
4
|
|
|
5
|
+
This path is also exported as the environment variable `KOLEGA_SCRATCHPAD` in every shell command and eval kernel this session runs (login shells included), so in commands and scripts refer to it as `$KOLEGA_SCRATCHPAD` instead of re-declaring or retyping the literal path.
|
|
6
|
+
|
|
5
7
|
Use it for throwaway work that must not touch the user's working tree: one-off scripts, ad-hoc virtual environments, downloaded files, extracted archives, generated intermediates, and log captures. This is the only location outside the working directory where you may create files without asking.
|
|
6
8
|
|
|
7
9
|
Rules:
|