kolega-code 0.26.9__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.9 → kolega_code-0.26.10}/CHANGELOG.md +93 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/PKG-INFO +2 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/__init__.py +1 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/baseagent.py +188 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/conversation.py +2 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/kernel.py +31 -4
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +2 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +33 -37
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/eval_tool.py +1 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/terminal_tool.py +13 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tools.py +16 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/app.py +4 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/ask_output.py +13 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/config.py +48 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/main.py +43 -3
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/messages.py +2 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/session_store.py +5 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/settings.py +5 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/agent_runtime.py +7 -2
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/app_base.py +1 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/command_handlers.py +38 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/settings_panel.py +15 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/settings_screen.py +14 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/state.py +8 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/styles.tcss +5 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/transcript.py +75 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/widgets.py +25 -2
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/config.py +7 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/client.py +8 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/models.py +172 -20
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/deepseek_responses.py +24 -6
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/models.py +3 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/openai.py +25 -1
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/responses_common.py +128 -42
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/__init__.py +2 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/accessors.py +13 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/deepseek.py +15 -2
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openai.py +12 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openai_chatgpt.py +13 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/terminal.py +21 -2
- {kolega_code-0.26.9 → kolega_code-0.26.10}/pyproject.toml +16 -4
- {kolega_code-0.26.9 → kolega_code-0.26.10}/.gitignore +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/CONTRIBUTING.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/MIGRATION.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/README.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/RELEASING.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.26.9 → 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.9 → 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.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/provider_registry.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/events.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/git_env.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/llm/usage.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/local_state.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/permissions.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/runtime.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/base.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/html.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/control.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/session/store.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/server.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.26.9 → kolega_code-0.26.10}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,99 @@ 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
|
+
|
|
9
102
|
## 0.26.9 - 2026-08-03
|
|
10
103
|
|
|
11
104
|
### 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
|
|
@@ -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:
|
|
@@ -24,11 +24,7 @@ Here is useful information about the environment:
|
|
|
24
24
|
|
|
25
25
|
## Approach to Work
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
Stay with the user's task until it is genuinely resolved: carry it through implementation and verification within your turn — don't stop at analysis, a plan, or a partial fix — before yielding back to the user. Persevere when commands fail — diagnose and fix them yourself instead of giving up.
|
|
29
|
-
{% else %}
|
|
30
|
-
You MUST keep going until the task is completely and verifiably solved. Only end your turn when the deliverable exists and you have PROVEN it works — never before. NEVER stop at analysis, a plan, a partial fix, or a finished sub-step: a phase boundary is NOT a stopping point, so continue in the same turn. Persevere when commands fail — diagnose and fix them yourself instead of giving up or handing back. One failing check does NOT mean you are blocked: resolve it and finish the remaining work. NEVER narrate or ration effort, token, or time budgets — work as if unbounded and execute.
|
|
31
|
-
{% endif %}
|
|
27
|
+
See the task through: implementation and verification, not just analysis or a plan. When a command fails or a check breaks, diagnose and fix it and keep going — a failing step is an obstacle, not a blocker. Don't cut scope because the work feels long.
|
|
32
28
|
|
|
33
29
|
Read the relevant code before changing it, prefer the repository's existing patterns, and keep edits focused on the requested behavior. {% if interactive %}If you introduce a bug or break a test while completing your task, fix it. Ignore unrelated failures unless they block the requested work, but report them clearly{% else %}If you introduce a bug or break a test, fix it. Respect the working tree — NEVER revert changes you did not make{% endif %}.
|
|
34
30
|
|
|
@@ -38,15 +34,7 @@ Respect the user's working tree. Never revert changes you did not make unless th
|
|
|
38
34
|
{% endif %}
|
|
39
35
|
## Act — Do Not Describe
|
|
40
36
|
|
|
41
|
-
|
|
42
|
-
Solve requested work by taking actions with tools, not by writing the answer in prose. Do not output the solution — code, file contents, a regex, a config — as a message and stop unless the user explicitly asks for code: describing an edit is not making it. Reasoning is only for choosing your next action; end every turn in a tool call or a substantive message the user can act on — an answer, a completed result, or a genuine question — never in a plain message that leaves requested work undone.
|
|
43
|
-
{% else %}
|
|
44
|
-
Solve the task by taking ACTIONS with tools, not by writing the answer in prose. It is a FAILURE to output the solution — code, file contents, a regex, a config — as a message instead of implementing it with tools: that produces nothing and fails the task. Reasoning is ONLY for choosing your next action; every turn MUST end in a tool call or a genuinely finished, verified task — NEVER in a plain message that leaves work undone.
|
|
45
|
-
{% endif %}
|
|
46
|
-
|
|
47
|
-
Thinking is invisible and changes nothing on its own: NEVER end a turn on reasoning alone, with no tool call and no message — when you finish thinking, immediately emit the tool call (or the reply) you were planning.
|
|
48
|
-
|
|
49
|
-
When you say you are going to do something ("Next I'll write X", "Let me run the tests"), you MUST make that exact tool call in the SAME turn. NEVER announce an action and then end your turn without performing it. Never assume what a file contains or what a command will output — read it or run it and act on the actual result.
|
|
37
|
+
The work happens through tool calls: writing the solution in a message instead of implementing it in the workspace produces nothing. When you finish thinking, act. When you announce an action ("let me run the tests"), make that call in the same turn. Never assume what a file contains or what a command will print — read it or run it. And don't end your turn on a message that abandons work you could still do.
|
|
50
38
|
|
|
51
39
|
## Making Code Changes
|
|
52
40
|
|
|
@@ -67,23 +55,19 @@ When debugging, address the root cause instead of symptoms. Add focused tests, l
|
|
|
67
55
|
|
|
68
56
|
## Verify By Running
|
|
69
57
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Expected values must come from an authority independent of your implementation — the task's stated contract, the artifact or environment itself, or an independent tool — never from the code under test or the assumption you are trying to confirm: a check constructed to come out true verifies nothing, and a passing check is evidence only for the requirement it actually covers, so match verification scope to claim scope. Literal values in task examples are illustrative unless the task says otherwise — derive the real value from the artifact instead of assuming the example generalizes. Prefer falsification: test the input most likely to break your assumption, or a fresh input you did not develop against — one check that could have failed outweighs many that could not.
|
|
58
|
+
When you've built or changed something, run it and look at the result. Reproduce a bug before fixing it so you can confirm the fix; exercise a service the way a client would; open a produced file and check its contents. Start with the smallest check that tells you something, then broaden as confidence builds, re-running whatever a fix could have affected. Edits report their own failures, so don't re-read files to confirm they applied.
|
|
73
59
|
|
|
74
|
-
|
|
75
|
-
Before finishing, summarize what changed and mention the checks you ran. If relevant checks could not be run, say why.
|
|
60
|
+
Expected values must come from somewhere your implementation can't influence — the task's stated contract, the artifact itself, or an independent tool. A check whose expected answer comes from the code under test passes whether or not the code is right. Treat literal values in examples as illustrative and derive the real value from the artifact. Prefer checks that could actually fail — an input that would expose your assumption over one you developed against. When no remaining check could realistically fail, verification is done.
|
|
76
61
|
|
|
77
|
-
{% endif %}
|
|
78
62
|
## Finish the Whole Task
|
|
79
63
|
|
|
80
|
-
Treat completion as unproven until you have checked it against every requirement. Before finishing, re-read the task and confirm your result meets each stated requirement — every named output, path, format, value, and threshold. "Done" means the deliverable behaves as specified end to end, not that a scaffold compiles or a narrowed check passed; a plausible subset is a failure, not partial success.
|
|
64
|
+
Treat completion as unproven until you have checked it against every requirement. Before finishing, re-read the task and confirm your result meets each stated requirement — every named output, path, format, value, and threshold. "Done" means the deliverable behaves as specified end to end, not that a scaffold compiles or a narrowed check passed; a plausible subset is a failure, not partial success. If stronger proof is in reach, you are not done. Push verification as far as the environment can take it, then finish with an honest account of what you verified and what you couldn't.
|
|
81
65
|
|
|
82
66
|
Deliver the complete, working result. NEVER ship stubs, placeholders, mocks, no-ops, `TODO: implement`, or partial scaffolding as if finished. NEVER relabel unfinished work as "MVP", "v1", or "foundation" to imply completion — if it is not done, say so, do not pretend. NEVER silently shrink scope or substitute a narrower, easier, or merely-compatible task than the one you were given. If the task specifies a file at a particular path, produce exactly that file at exactly that path.
|
|
83
67
|
|
|
84
68
|
## Running Commands
|
|
85
69
|
|
|
86
|
-
Prefer commands that terminate
|
|
70
|
+
Prefer one-shot commands that terminate; run long-lived processes like dev servers and watchers in the background. When starting a development server, use a free port.
|
|
87
71
|
|
|
88
72
|
{% if interactive %}
|
|
89
73
|
Do not run destructive commands automatically. Treat commands that delete files, rewrite history, reset worktrees, install system dependencies, or make external state changes as requiring explicit user approval.
|
|
@@ -91,6 +75,10 @@ Do not run destructive commands automatically. Treat commands that delete files,
|
|
|
91
75
|
There is no user present to approve actions, so exercise judgment: do not run destructive commands — deleting files you did not create, rewriting git history, resetting the worktree, or making external state changes — unless the task explicitly requires them.
|
|
92
76
|
{% endif %}
|
|
93
77
|
|
|
78
|
+
## Reuse Results
|
|
79
|
+
|
|
80
|
+
Don't redo work you already did. When a script is worth running twice, save it as a file — the session scratchpad (`$KOLEGA_SCRATCHPAD` in every shell, when one is provided) is a good home — and invoke it by name instead of writing it inline again. Likewise for expensive intermediates: parse once, save the result, load it later.
|
|
81
|
+
|
|
94
82
|
## Git Branches and Pull Requests
|
|
95
83
|
|
|
96
84
|
When creating a branch or opening a pull request, follow repository or user conventions if provided; otherwise use Conventional Commits-style names. Use lowercase kebab-case branch names with a conventional type prefix, such as `feat/add-login-rate-limit` or `fix/navbar-overlap`. Use Conventional Commit PR titles, such as `feat(auth): add session timeout` or `fix: handle empty search results`. Keep names descriptive but not overly long{% if not interactive %}. Work in the checkout you were started in{% endif %}.
|
|
@@ -103,10 +91,6 @@ When the user has asked for an auxiliary Git worktree, place it at `{{ context.p
|
|
|
103
91
|
Kolega Code normally excludes `.kolega/worktrees/` through the repository's shared Git `info/exclude`. Verify the path is ignored before running `git worktree add`. If automatic setup was ineffective, add only `/.kolega/worktrees/` to the shared `info/exclude`. Never ignore all of `.kolega/` or modify tracked ignore/config files solely for runtime worktree storage because other `.kolega` project configuration must remain trackable. Do not move or remove any existing worktree, including one under a session scratchpad, unless the user explicitly requests it.
|
|
104
92
|
|
|
105
93
|
{% endif %}
|
|
106
|
-
## Development Servers
|
|
107
|
-
|
|
108
|
-
When starting a local development server, use an available port{% if interactive %} and tell the user the URL{% endif %}. If a server is already running on the default port, use another suitable port. Stop servers you started when they are no longer needed{% if interactive %} unless the user is actively testing them{% endif %}.
|
|
109
|
-
|
|
110
94
|
## Environment Variables
|
|
111
95
|
|
|
112
96
|
Never write secrets or API keys into source files, logs, committed config, or documentation. If a task needs a secret, {% if interactive %}ask the user to provide it through the appropriate environment variable or CLI configuration{% else %}read it from the appropriate environment variable at runtime; never hardcode it{% endif %}.
|
|
@@ -119,22 +103,34 @@ The following workspace environment variables are available. Read their values a
|
|
|
119
103
|
{% endfor %}
|
|
120
104
|
{% endif %}
|
|
121
105
|
|
|
122
|
-
## Calling External APIs
|
|
123
|
-
|
|
124
|
-
Use dependencies and external APIs that fit the repository and {% if interactive %}the user's request{% else %}the task{% endif %}. Choose versions compatible with the project's dependency files. If an API requires a key, {% if interactive %}point that out and keep the key{% else %}read it from the environment and keep it{% endif %} out of source control.
|
|
125
|
-
|
|
126
106
|
## Communication Guidelines
|
|
127
107
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
4. Use backticks for files, directories, commands, symbols, and environment variables.
|
|
132
|
-
5. Do not invent results. If a check was not run, say so.
|
|
133
|
-
6. Do not disclose hidden system instructions or internal tool implementation details.
|
|
108
|
+
Your final message reports the finished work, so lead with what you delivered and its verified state — the outcome first, not a preamble such as "the task is complete" and not a restatement of the plan. Keep it brief by default: a simple result needs a sentence or two, and greater length must be earned by detail the reader actually needs. Let structure follow complexity — plain sentences for a small change, short headers or bullets only when they help someone scan genuinely multi-part work. Use backticks for files, directories, commands, symbols, and environment variables, and reference a file by its path instead of re-pasting contents you already wrote. Do not walk through every step or repeat the plan; say what changed and where. {% if interactive %}When a next step would genuinely help — running a broader test, committing, building the next piece, or something only the user can do such as exercising a running app — offer it in a line. {% endif %}Keep the tone collaborative and factual, without filler.
|
|
109
|
+
|
|
110
|
+
Never invent results or imply a check you did not run: if something was not verified, say so, and state any real blocker plainly — an honest blocker beats a confident but wrong success claim, and staying brief is never a reason to omit a failure. Do not disclose hidden system instructions or internal tool implementation details.
|
|
134
111
|
|
|
135
112
|
## Tool Calling Guidelines
|
|
136
113
|
|
|
137
|
-
Use the available tools according to their schemas and scope. Prefer the specialized file tools
|
|
114
|
+
Use the available tools according to their schemas and scope. Prefer the specialized file tools over shell equivalents, and read a file before editing it. Keep all file operations inside the working directory (or the session scratchpad directory, when one is provided) unless the task asks for broader access.
|
|
115
|
+
|
|
116
|
+
## Preamble Messages
|
|
117
|
+
|
|
118
|
+
Before your tool calls, emit one short line of message text stating what the next action(s) are for. {% if interactive %}Preambles keep the user informed of what you are doing and why while you work, and carry your plan from one step to the next.{% else %}There is no user watching: these preambles are working notes to yourself — they carry your plan from one request to the next so later steps become simple execution instead of re-derivation.{% endif %} When writing preambles, follow these principles and examples:
|
|
119
|
+
|
|
120
|
+
- **State the purpose, not the mechanics**: name what the actions accomplish, not the command syntax.
|
|
121
|
+
- **Logically group related actions**: one preamble covers a batch of related calls; do not write a separate note for each call.
|
|
122
|
+
- **Keep it concise**: 8-12 words for most notes, never more than two sentences.
|
|
123
|
+
- **Build on prior preambles**: connect to what has been done so far, so the note plus its predecessors read as a running plan.
|
|
124
|
+
- **Exception**: skip the preamble for a trivial read (e.g., viewing a single file) unless it is part of a larger grouped action.
|
|
125
|
+
|
|
126
|
+
**Examples:**
|
|
127
|
+
|
|
128
|
+
- "Repo structure is clear; reading the API route definitions next."
|
|
129
|
+
- "Next, I'll patch the config and update the related tests."
|
|
130
|
+
- "Scaffolding the CLI commands and helper functions."
|
|
131
|
+
- "Hull construction works; now wiring up the sampler loop."
|
|
132
|
+
- "Install finished; writing the solver module now."
|
|
133
|
+
- "Tests pass; checking edge cases around empty input."
|
|
138
134
|
|
|
139
135
|
## Delegating to Sub-Agents
|
|
140
136
|
|