kolega-code 0.31.0__tar.gz → 0.32.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kolega_code-0.31.0 → kolega_code-0.32.0}/CHANGELOG.md +42 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/PKG-INFO +28 -1
- {kolega_code-0.31.0 → kolega_code-0.32.0}/README.md +26 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/__init__.py +1 -1
- kolega_code-0.32.0/kolega_code/acp/__init__.py +38 -0
- kolega_code-0.32.0/kolega_code/acp/agent_factory.py +425 -0
- kolega_code-0.32.0/kolega_code/acp/bridge.py +381 -0
- kolega_code-0.32.0/kolega_code/acp/diffs.py +93 -0
- kolega_code-0.32.0/kolega_code/acp/permissions.py +116 -0
- kolega_code-0.32.0/kolega_code/acp/plans.py +40 -0
- kolega_code-0.32.0/kolega_code/acp/questions.py +67 -0
- kolega_code-0.32.0/kolega_code/acp/server.py +668 -0
- kolega_code-0.32.0/kolega_code/acp/session.py +46 -0
- kolega_code-0.32.0/kolega_code/acp/usage.py +30 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/baseagent.py +29 -2
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/agent_tool.py +6 -2
- kolega_code-0.32.0/kolega_code/cli/acp.py +77 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/app.py +5 -1
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/main.py +19 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/provider_registry.py +1 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/prompt_flows.py +3 -45
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/accessors.py +1 -1
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/deepseek.py +14 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/openrouter.py +948 -925
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/projection.py +13 -4
- kolega_code-0.32.0/kolega_code/tools/ask_user.py +63 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/pyproject.toml +2 -1
- {kolega_code-0.31.0 → kolega_code-0.32.0}/.gitignore +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/MIGRATION.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/RELEASING.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/config.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/messages.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/prompt_history.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/command_handlers.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/settings_panel.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/settings_screen.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/config.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/events.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/client.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/llm/usage.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.31.0 → kolega_code-0.32.0}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,48 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.32.0 - 2026-08-24
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Editor integration over the Agent Client Protocol (ACP).** `kolega-code acp`
|
|
14
|
+
serves the full Kolega Code agent — models, tools, permissions, skills,
|
|
15
|
+
plan/build modes, sub-agent fan-out — to editors over stdio; Zed hosts it
|
|
16
|
+
natively through an `agent_servers` entry, and the new Editor Integration
|
|
17
|
+
docs page covers setup and flags (`--permission-mode`, `--acp-log`,
|
|
18
|
+
`--debug`). Each editor thread is an ordinary persisted Kolega Code session
|
|
19
|
+
that replays in the TUI, `kolega-code sessions`, exports, and `/share`.
|
|
20
|
+
Over the wire the agent server provides: TUI-faithful plan/build session
|
|
21
|
+
modes with task-list checklist rendering in the plan view and mid-turn mode
|
|
22
|
+
switching; tool approvals prompted through the editor
|
|
23
|
+
(`session/request_permission`) plus a model select and auto-approve toggle
|
|
24
|
+
as session config options; sub-agent dispatch cards with live progress and
|
|
25
|
+
per-subagent transcripts (Zed's `subagent_session_info` convention);
|
|
26
|
+
compaction shown as a collapsible thought view; advertised slash commands;
|
|
27
|
+
user questions via client elicitation; file edits rendered as diffs;
|
|
28
|
+
streamed terminal output; context-usage updates; and session load/restore so
|
|
29
|
+
clients can reopen previous threads.
|
|
30
|
+
- Added DeepSeek V4 Flash Vision (`deepseek-v4-flash-vision-exp`),
|
|
31
|
+
DeepSeek's first multimodal model (experimental): 1M-token context, image
|
|
32
|
+
input, hosted web search, and `none`/`low`/`high`/`max` reasoning effort on
|
|
33
|
+
the Responses API.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- OpenRouter catalog refreshed from the 2026-08-24 snapshots: 274 tool-capable
|
|
38
|
+
models, 20 featured.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Sub-agents launched by `dispatch_agent` now run in auto permission mode.
|
|
43
|
+
An ask-mode parent previously passed its approval callback down to the
|
|
44
|
+
sub-agent, which could hang a turn waiting for a prompt that ACP clients
|
|
45
|
+
cannot render for delegated work.
|
|
46
|
+
- Streaming consumers now receive reasoning and response text as clean,
|
|
47
|
+
ordered segments: thinking is flushed the moment prose starts (and vice
|
|
48
|
+
versa) instead of interleaving at buffer boundaries, and a lower flush
|
|
49
|
+
threshold makes streaming feel more responsive in every frontend.
|
|
50
|
+
|
|
9
51
|
## 0.31.0 - 2026-08-20
|
|
10
52
|
|
|
11
53
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.32.0
|
|
4
4
|
Summary: Multi-agent coding in the terminal
|
|
5
5
|
Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
|
|
6
6
|
Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
|
|
@@ -26,6 +26,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
26
26
|
Classifier: Topic :: Software Development
|
|
27
27
|
Classifier: Topic :: Utilities
|
|
28
28
|
Requires-Python: >=3.11
|
|
29
|
+
Requires-Dist: agent-client-protocol==0.12.0
|
|
29
30
|
Requires-Dist: anthropic==0.101.0
|
|
30
31
|
Requires-Dist: atif==1.7.0
|
|
31
32
|
Requires-Dist: beautifulsoup4==4.14.3
|
|
@@ -153,6 +154,10 @@ use Kolega Code as an ordinary terminal coding agent:
|
|
|
153
154
|
(including OAuth-enabled HTTP servers) as permission-gated tools.
|
|
154
155
|
- **Interactive or scriptable:** Textual TUI with queued follow-ups, one-shot
|
|
155
156
|
`kolega-code ask` with JSON output, session list/export/resume, `doctor`.
|
|
157
|
+
- **Editor integration:** drive the full agent from Zed or VS Code over the
|
|
158
|
+
Agent Client Protocol — streamed responses, tool cards, diffs, permission
|
|
159
|
+
prompts, plan/build approval, session restore, slash commands, and sub-agent
|
|
160
|
+
transcripts ([docs](https://kolega-ai.github.io/kolega-code/editor-integration/)).
|
|
156
161
|
- **Extensibility:** agent skills, project prompt-template overrides
|
|
157
162
|
([docs](https://kolega-ai.github.io/kolega-code/configuration/prompt-overrides/)),
|
|
158
163
|
lifecycle hooks, persistent project permission rules.
|
|
@@ -160,6 +165,28 @@ use Kolega Code as an ordinary terminal coding agent:
|
|
|
160
165
|
API-key settings stay on your machine with restrictive permissions where
|
|
161
166
|
applicable.
|
|
162
167
|
|
|
168
|
+
## Editor integration (ACP)
|
|
169
|
+
|
|
170
|
+
`kolega-code acp` serves the Agent Client Protocol, so Zed and VS Code can host
|
|
171
|
+
the full agent — including permissions, plan/build modes, and sub-agent
|
|
172
|
+
transcripts. Configure Zed with:
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
{
|
|
176
|
+
"agent_servers": {
|
|
177
|
+
"Kolega Code": {
|
|
178
|
+
"command": "/absolute/path/to/bin/kolega-code",
|
|
179
|
+
"args": ["acp", "--permission-mode", "ask"]
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Use an absolute binary path: a bare `kolega-code` resolves to whatever is on the
|
|
186
|
+
editor's `PATH`, so an installed release can shadow a dev checkout. Full setup
|
|
187
|
+
for Zed, VS Code, and other ACP clients is in the
|
|
188
|
+
[editor integration docs](https://kolega-ai.github.io/kolega-code/editor-integration/).
|
|
189
|
+
|
|
163
190
|
## Quick start
|
|
164
191
|
|
|
165
192
|
**1. Install** with the script:
|
|
@@ -70,6 +70,10 @@ use Kolega Code as an ordinary terminal coding agent:
|
|
|
70
70
|
(including OAuth-enabled HTTP servers) as permission-gated tools.
|
|
71
71
|
- **Interactive or scriptable:** Textual TUI with queued follow-ups, one-shot
|
|
72
72
|
`kolega-code ask` with JSON output, session list/export/resume, `doctor`.
|
|
73
|
+
- **Editor integration:** drive the full agent from Zed or VS Code over the
|
|
74
|
+
Agent Client Protocol — streamed responses, tool cards, diffs, permission
|
|
75
|
+
prompts, plan/build approval, session restore, slash commands, and sub-agent
|
|
76
|
+
transcripts ([docs](https://kolega-ai.github.io/kolega-code/editor-integration/)).
|
|
73
77
|
- **Extensibility:** agent skills, project prompt-template overrides
|
|
74
78
|
([docs](https://kolega-ai.github.io/kolega-code/configuration/prompt-overrides/)),
|
|
75
79
|
lifecycle hooks, persistent project permission rules.
|
|
@@ -77,6 +81,28 @@ use Kolega Code as an ordinary terminal coding agent:
|
|
|
77
81
|
API-key settings stay on your machine with restrictive permissions where
|
|
78
82
|
applicable.
|
|
79
83
|
|
|
84
|
+
## Editor integration (ACP)
|
|
85
|
+
|
|
86
|
+
`kolega-code acp` serves the Agent Client Protocol, so Zed and VS Code can host
|
|
87
|
+
the full agent — including permissions, plan/build modes, and sub-agent
|
|
88
|
+
transcripts. Configure Zed with:
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"agent_servers": {
|
|
93
|
+
"Kolega Code": {
|
|
94
|
+
"command": "/absolute/path/to/bin/kolega-code",
|
|
95
|
+
"args": ["acp", "--permission-mode", "ask"]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Use an absolute binary path: a bare `kolega-code` resolves to whatever is on the
|
|
102
|
+
editor's `PATH`, so an installed release can shadow a dev checkout. Full setup
|
|
103
|
+
for Zed, VS Code, and other ACP clients is in the
|
|
104
|
+
[editor integration docs](https://kolega-ai.github.io/kolega-code/editor-integration/).
|
|
105
|
+
|
|
80
106
|
## Quick start
|
|
81
107
|
|
|
82
108
|
**1. Install** with the script:
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""ACP agent side for kolega-code.
|
|
2
|
+
|
|
3
|
+
Makes kolega-code usable from ACP clients (Zed, JetBrains, VS Code via
|
|
4
|
+
extensions, Neovim, Emacs) by serving the Agent Client Protocol v1 over
|
|
5
|
+
stdio. The client spawns this process and owns its lifecycle.
|
|
6
|
+
|
|
7
|
+
stdout carries only ACP JSON-RPC frames (owned by the SDK transport); all
|
|
8
|
+
diagnostics go to stderr. See ``acp-implementation-plan.md`` (repo root) for
|
|
9
|
+
the full design and phases.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from kolega_code.acp.agent_factory import ACP_AGENT_MODE, ACP_PERMISSION_MODE, MODE_BUILD, MODE_PLAN, AgentFactory
|
|
15
|
+
from kolega_code.acp.bridge import TOOL_KINDS, AcpBridge
|
|
16
|
+
from kolega_code.acp.diffs import AcpDiffProvider
|
|
17
|
+
from kolega_code.acp.permissions import AcpPermissionBroker
|
|
18
|
+
from kolega_code.acp.plans import task_entries_from_markdown
|
|
19
|
+
from kolega_code.acp.server import AcpAgent
|
|
20
|
+
from kolega_code.acp.session import AcpSession
|
|
21
|
+
from kolega_code.acp.usage import build_usage_update, context_window_for
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"ACP_AGENT_MODE",
|
|
25
|
+
"ACP_PERMISSION_MODE",
|
|
26
|
+
"MODE_BUILD",
|
|
27
|
+
"MODE_PLAN",
|
|
28
|
+
"AcpAgent",
|
|
29
|
+
"AcpBridge",
|
|
30
|
+
"AcpDiffProvider",
|
|
31
|
+
"AcpPermissionBroker",
|
|
32
|
+
"AcpSession",
|
|
33
|
+
"AgentFactory",
|
|
34
|
+
"TOOL_KINDS",
|
|
35
|
+
"build_usage_update",
|
|
36
|
+
"context_window_for",
|
|
37
|
+
"task_entries_from_markdown",
|
|
38
|
+
]
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
"""Headless agent composition for ACP sessions.
|
|
2
|
+
|
|
3
|
+
Builds the same agent stack the CLI uses — settings, model config, durable
|
|
4
|
+
session recording — one ``CoderAgent`` per ACP session.
|
|
5
|
+
|
|
6
|
+
Sessions use ``AgentMode.CLI`` (the standard interactive coder template; the
|
|
7
|
+
editor thread has a human present) with an *explicit* permission mode:
|
|
8
|
+
``PermissionMode.ASK`` with a client-bound ``permission_callback`` (the
|
|
9
|
+
``session/request_permission`` bridge). The ``ASK`` agent mode is
|
|
10
|
+
deliberately not used: it is the autonomous ``ask``-CLI template whose
|
|
11
|
+
permission handling is hardcoded to auto-approve.
|
|
12
|
+
|
|
13
|
+
Expected failures (missing model config, corrupt settings, unknown session)
|
|
14
|
+
are converted to ACP JSON-RPC errors so the client gets a clean message and
|
|
15
|
+
the process keeps serving.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Awaitable, Callable, cast
|
|
23
|
+
|
|
24
|
+
from acp.exceptions import RequestError
|
|
25
|
+
from acp.schema import (
|
|
26
|
+
SessionConfigOptionBoolean,
|
|
27
|
+
SessionConfigOptionSelect,
|
|
28
|
+
SessionConfigSelectGroup,
|
|
29
|
+
SessionConfigSelectOption,
|
|
30
|
+
SessionInfo,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
from kolega_code.acp.questions import build_question_extension
|
|
34
|
+
from kolega_code.acp.session import AcpSession
|
|
35
|
+
from kolega_code.agent import CoderAgent, PromptExtension, ToolExtension
|
|
36
|
+
from kolega_code.agent.planningagent import PlanningAgent
|
|
37
|
+
from kolega_code.agent.prompt_provider import AgentMode
|
|
38
|
+
from kolega_code.agent.prompts import BUILD_QUESTION_PROMPT, PLANNING_QUESTION_PROMPT
|
|
39
|
+
from kolega_code.agent.tool_definitions import tool_description_asset
|
|
40
|
+
from kolega_code.agent.volatile_context import VolatileSection
|
|
41
|
+
from kolega_code.cli.config import CliConfigOverrides, build_agent_config, config_summary
|
|
42
|
+
from kolega_code.cli.connection import CliConnectionManager
|
|
43
|
+
from kolega_code.cli.provider_registry import PROVIDER_LABELS, ui_model_options
|
|
44
|
+
from kolega_code.cli.session_event_store import FileArtifactStore, FileSessionEventStore
|
|
45
|
+
from kolega_code.cli.session_store import SessionRecord, SessionStore, SessionStoreError
|
|
46
|
+
from kolega_code.cli.settings import CliSettings, SettingsStore
|
|
47
|
+
from kolega_code.permissions import PermissionDecision, PermissionMode, PermissionRequest, normalize_permission_mode
|
|
48
|
+
from kolega_code.session.recording import RecordingConnectionManager
|
|
49
|
+
|
|
50
|
+
logger = logging.getLogger(__name__)
|
|
51
|
+
|
|
52
|
+
ACP_AGENT_MODE = AgentMode.CLI
|
|
53
|
+
ACP_PERMISSION_MODE = PermissionMode.ASK
|
|
54
|
+
CONFIG_MODEL = "model"
|
|
55
|
+
CONFIG_PERMISSION_AUTO = "permission-auto"
|
|
56
|
+
CONFIG_MODE = "mode"
|
|
57
|
+
MODE_BUILD = "build"
|
|
58
|
+
MODE_PLAN = "plan"
|
|
59
|
+
INTERACTION_MODES = {MODE_BUILD, MODE_PLAN}
|
|
60
|
+
|
|
61
|
+
PermissionCallback = Callable[[PermissionRequest], Awaitable[PermissionDecision]]
|
|
62
|
+
ConfigOption = SessionConfigOptionSelect | SessionConfigOptionBoolean
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def agent_class_for(mode: str) -> type[CoderAgent]:
|
|
66
|
+
return PlanningAgent if mode == MODE_PLAN else CoderAgent
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class AgentFactory:
|
|
70
|
+
"""Opens, loads, and persists ACP sessions backed by the session store."""
|
|
71
|
+
|
|
72
|
+
def __init__(self, permission_mode: PermissionMode = ACP_PERMISSION_MODE) -> None:
|
|
73
|
+
self._permission_mode = permission_mode
|
|
74
|
+
self._store = SessionStore()
|
|
75
|
+
self._settings: CliSettings | None = None
|
|
76
|
+
self._settings_store: SettingsStore | None = None
|
|
77
|
+
self._acp_sessions: dict[str, AcpSession] = {}
|
|
78
|
+
|
|
79
|
+
async def open_session(
|
|
80
|
+
self,
|
|
81
|
+
cwd: str,
|
|
82
|
+
*,
|
|
83
|
+
session_id: str | None = None,
|
|
84
|
+
permission_callback: PermissionCallback | None = None,
|
|
85
|
+
) -> AcpSession:
|
|
86
|
+
project_path = Path(cwd).resolve()
|
|
87
|
+
self._load_settings()
|
|
88
|
+
config = self._config_for(project_path)
|
|
89
|
+
record = self._store.create(project_path, ACP_AGENT_MODE.value, config_summary(config), session_id=session_id)
|
|
90
|
+
return await self._build_session(record, config, restore=False, permission_callback=permission_callback)
|
|
91
|
+
|
|
92
|
+
async def load_session(
|
|
93
|
+
self,
|
|
94
|
+
cwd: str,
|
|
95
|
+
session_id: str,
|
|
96
|
+
*,
|
|
97
|
+
permission_callback: PermissionCallback | None = None,
|
|
98
|
+
) -> AcpSession | None:
|
|
99
|
+
try:
|
|
100
|
+
record = self._store.load(session_id)
|
|
101
|
+
except SessionStoreError as exc:
|
|
102
|
+
logger.info("acp session/load: unknown session %s (%s)", session_id, exc)
|
|
103
|
+
return None
|
|
104
|
+
self._load_settings()
|
|
105
|
+
config = self._config_for(Path(record.project_path))
|
|
106
|
+
return await self._build_session(record, config, restore=True, permission_callback=permission_callback)
|
|
107
|
+
|
|
108
|
+
# -- session config options -------------------------------------------
|
|
109
|
+
|
|
110
|
+
def config_options_for(self, session: AcpSession) -> list[ConfigOption]:
|
|
111
|
+
return [self._model_option(session), self._permission_option(session), self._mode_option(session)]
|
|
112
|
+
|
|
113
|
+
async def set_permission_mode(self, session: AcpSession, mode: PermissionMode) -> None:
|
|
114
|
+
session.agent.set_permission_mode(mode)
|
|
115
|
+
session.record.permission_mode = mode.value
|
|
116
|
+
|
|
117
|
+
async def set_interaction_mode(self, session: AcpSession, mode: str) -> None:
|
|
118
|
+
"""Switch plan/build mode by rebuilding the session agent with the mode's class."""
|
|
119
|
+
session.record.interaction_mode = mode
|
|
120
|
+
await self._rebuild_agent(session, session.config)
|
|
121
|
+
|
|
122
|
+
async def apply_model(self, session: AcpSession, provider: str, model: str) -> None:
|
|
123
|
+
config = self._config_for(Path(session.record.project_path), provider=provider, model=model)
|
|
124
|
+
session.config = config
|
|
125
|
+
await self._rebuild_agent(session, config)
|
|
126
|
+
|
|
127
|
+
# -- persistence --------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
def persist(self, session: AcpSession) -> None:
|
|
130
|
+
"""Flush the agent's conversation state into the session record."""
|
|
131
|
+
session.record.history = session.agent.dump_message_history()
|
|
132
|
+
session.record.compaction = session.agent.dump_compaction_state()
|
|
133
|
+
session.record.permission_mode = session.agent.permission_mode.value
|
|
134
|
+
self._store.save(session.record)
|
|
135
|
+
|
|
136
|
+
async def close_session(self, session_id: str) -> None:
|
|
137
|
+
session = self._acp_sessions.pop(session_id, None)
|
|
138
|
+
if session is None:
|
|
139
|
+
return
|
|
140
|
+
self.persist(session)
|
|
141
|
+
try:
|
|
142
|
+
await session.agent.cleanup()
|
|
143
|
+
except Exception: # noqa: BLE001 — closing must not mask the primary outcome
|
|
144
|
+
logger.exception("acp session close: agent cleanup failed (session=%s)", session_id)
|
|
145
|
+
|
|
146
|
+
def list_sessions(self, cwd: str | None) -> list[SessionInfo]:
|
|
147
|
+
records = self._store.list(project_path=Path(cwd).resolve() if cwd else None)
|
|
148
|
+
return [
|
|
149
|
+
SessionInfo(
|
|
150
|
+
session_id=record.session_id, cwd=record.project_path, title=record.title, updated_at=record.updated_at
|
|
151
|
+
)
|
|
152
|
+
for record in records
|
|
153
|
+
]
|
|
154
|
+
|
|
155
|
+
def event_store(self, session_id: str) -> FileSessionEventStore:
|
|
156
|
+
"""The session's durable event journal as a readable event store."""
|
|
157
|
+
return FileSessionEventStore(self._store.journal(session_id))
|
|
158
|
+
|
|
159
|
+
# -- internal -----------------------------------------------------------
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def _task_list_extension(record: SessionRecord, agent_holder: dict[str, Any], mode: str) -> ToolExtension:
|
|
163
|
+
"""Shared task-list tools backed by the session record — the same list
|
|
164
|
+
the TUI's ``update_task_list`` writes, so a session moves between the
|
|
165
|
+
TUI and the editor with one task list.
|
|
166
|
+
|
|
167
|
+
Build mode can read and update the list; plan mode gets a read-only
|
|
168
|
+
view (same split as the TUI). Updates broadcast a ``task_list_update``
|
|
169
|
+
chat event so the bridge can refresh the editor's plan view live.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
async def get_task_list() -> str:
|
|
173
|
+
return record.task_list_markdown or "No task list has been set."
|
|
174
|
+
|
|
175
|
+
async def update_task_list(task_list_markdown: str) -> str:
|
|
176
|
+
record.task_list_markdown = task_list_markdown.strip()
|
|
177
|
+
agent = agent_holder.get("agent")
|
|
178
|
+
if agent is not None:
|
|
179
|
+
await agent.send_chat_message(
|
|
180
|
+
message_type="task_list_update",
|
|
181
|
+
content=task_list_markdown.strip(),
|
|
182
|
+
tool_call_id=str(getattr(agent, "current_tool_call_id", "") or ""),
|
|
183
|
+
)
|
|
184
|
+
return "Task list updated."
|
|
185
|
+
|
|
186
|
+
tools: dict[str, Any] = {"get_task_list": get_task_list}
|
|
187
|
+
if mode == MODE_BUILD:
|
|
188
|
+
tools["update_task_list"] = update_task_list
|
|
189
|
+
return ToolExtension(
|
|
190
|
+
name="acp-shared-task-list",
|
|
191
|
+
tools=tools,
|
|
192
|
+
tool_descriptions={
|
|
193
|
+
"get_task_list": tool_description_asset(
|
|
194
|
+
"get_task_list" if mode == MODE_BUILD else "get_task_list_readonly"
|
|
195
|
+
),
|
|
196
|
+
**({"update_task_list": tool_description_asset("update_task_list")} if mode == MODE_BUILD else {}),
|
|
197
|
+
},
|
|
198
|
+
tool_schemas={
|
|
199
|
+
"get_task_list": {"type": "object", "properties": {}, "required": []},
|
|
200
|
+
"update_task_list": {
|
|
201
|
+
"type": "object",
|
|
202
|
+
"properties": {
|
|
203
|
+
"task_list_markdown": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"description": "The full current shared task list as Markdown.",
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"required": ["task_list_markdown"],
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
tool_groups={"planning_tools": list(tools)},
|
|
212
|
+
propagate_to_sub_agents=False,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
@staticmethod
|
|
216
|
+
def _task_list_volatile_section(record: SessionRecord) -> Callable[[], VolatileSection]:
|
|
217
|
+
"""The current shared task list as a volatile section (TUI parity: the
|
|
218
|
+
agent sees the latest list in context every turn without re-fetching).
|
|
219
|
+
An empty list is an absent section, exactly like the TUI."""
|
|
220
|
+
|
|
221
|
+
def provider() -> VolatileSection:
|
|
222
|
+
return VolatileSection("task_list", (record.task_list_markdown or "").strip())
|
|
223
|
+
|
|
224
|
+
return provider
|
|
225
|
+
|
|
226
|
+
def _load_settings(self) -> None:
|
|
227
|
+
settings_store = SettingsStore()
|
|
228
|
+
self._settings_store = settings_store
|
|
229
|
+
self._settings = settings_store.load()
|
|
230
|
+
|
|
231
|
+
def _config_for(self, project_path: Path, *, provider: str | None = None, model: str | None = None) -> Any:
|
|
232
|
+
assert self._settings is not None and self._settings_store is not None
|
|
233
|
+
overrides = CliConfigOverrides(provider=provider, model=model) if provider and model else None
|
|
234
|
+
return build_agent_config(
|
|
235
|
+
project_path,
|
|
236
|
+
overrides=overrides,
|
|
237
|
+
settings=self._settings,
|
|
238
|
+
settings_store=self._settings_store,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def _model_option(self, session: AcpSession) -> SessionConfigOptionSelect:
|
|
242
|
+
assert self._settings is not None
|
|
243
|
+
groups: list[SessionConfigSelectGroup] = []
|
|
244
|
+
for provider, key in sorted(self._settings.api_keys.items()):
|
|
245
|
+
if not key:
|
|
246
|
+
continue
|
|
247
|
+
options = [
|
|
248
|
+
SessionConfigSelectOption(value=f"{provider}/{model}", name=label)
|
|
249
|
+
for label, model in ui_model_options(provider)
|
|
250
|
+
]
|
|
251
|
+
if options:
|
|
252
|
+
groups.append(
|
|
253
|
+
SessionConfigSelectGroup(
|
|
254
|
+
group=provider,
|
|
255
|
+
name=str(PROVIDER_LABELS.get(cast(Any, provider), provider)),
|
|
256
|
+
options=options,
|
|
257
|
+
),
|
|
258
|
+
)
|
|
259
|
+
primary = session.agent.primary_model_config
|
|
260
|
+
current = f"{primary.provider.value}/{primary.model}"
|
|
261
|
+
return SessionConfigOptionSelect(
|
|
262
|
+
type="select",
|
|
263
|
+
id=CONFIG_MODEL,
|
|
264
|
+
name="Model",
|
|
265
|
+
current_value=current,
|
|
266
|
+
options=groups,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
@staticmethod
|
|
270
|
+
def _permission_option(session: AcpSession) -> SessionConfigOptionSelect:
|
|
271
|
+
# A select rather than the ACP boolean: vscode-acp renders only
|
|
272
|
+
# select-type config options (its UI skips every other type), and Zed
|
|
273
|
+
# renders selects just as well.
|
|
274
|
+
return SessionConfigOptionSelect(
|
|
275
|
+
type="select",
|
|
276
|
+
id=CONFIG_PERMISSION_AUTO,
|
|
277
|
+
name="Permissions",
|
|
278
|
+
current_value="auto" if session.agent.permission_mode == PermissionMode.AUTO else "ask",
|
|
279
|
+
options=[
|
|
280
|
+
SessionConfigSelectOption(value="ask", name="Ask"),
|
|
281
|
+
SessionConfigSelectOption(value="auto", name="Auto-approve"),
|
|
282
|
+
],
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
@staticmethod
|
|
286
|
+
def _mode_option(session: AcpSession) -> SessionConfigOptionSelect:
|
|
287
|
+
return SessionConfigOptionSelect(
|
|
288
|
+
type="select",
|
|
289
|
+
id=CONFIG_MODE,
|
|
290
|
+
name="Mode",
|
|
291
|
+
current_value=session.record.interaction_mode or MODE_BUILD,
|
|
292
|
+
options=[
|
|
293
|
+
SessionConfigSelectOption(value=MODE_BUILD, name="Build"),
|
|
294
|
+
SessionConfigSelectOption(value=MODE_PLAN, name="Plan"),
|
|
295
|
+
],
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
async def _rebuild_agent(self, session: AcpSession, config: Any) -> None:
|
|
299
|
+
"""Replace the session's agent with a rebuild carrying the same history.
|
|
300
|
+
|
|
301
|
+
Config options apply between turns, so the persisted record is the
|
|
302
|
+
freshest history state; ``restore=True`` loads it into the rebuild.
|
|
303
|
+
"""
|
|
304
|
+
old = session.agent
|
|
305
|
+
# The approval flow rebuilds mid-turn, before prompt() persists the
|
|
306
|
+
# just-finished plan turn. Dump the live agent into the record first
|
|
307
|
+
# (as the TUI does before rebuilds) so the rebuild restores the full
|
|
308
|
+
# conversation, not the stale pre-turn snapshot.
|
|
309
|
+
self.persist(session)
|
|
310
|
+
agent, manager = await self._construct_agent(
|
|
311
|
+
session.record,
|
|
312
|
+
config,
|
|
313
|
+
restore=True,
|
|
314
|
+
permission_callback=session.permission_callback,
|
|
315
|
+
permission_mode=old.permission_mode,
|
|
316
|
+
question_state=session.question_state,
|
|
317
|
+
)
|
|
318
|
+
session.agent = agent
|
|
319
|
+
session.manager = manager
|
|
320
|
+
try:
|
|
321
|
+
await old.cleanup()
|
|
322
|
+
except Exception: # noqa: BLE001
|
|
323
|
+
logger.exception("acp model switch: old agent cleanup failed (session=%s)", session.session_id)
|
|
324
|
+
|
|
325
|
+
async def _build_session(
|
|
326
|
+
self,
|
|
327
|
+
record: SessionRecord,
|
|
328
|
+
config: Any,
|
|
329
|
+
*,
|
|
330
|
+
restore: bool,
|
|
331
|
+
permission_callback: PermissionCallback | None,
|
|
332
|
+
) -> AcpSession:
|
|
333
|
+
"""Compose the durable agent stack for one session (the ``ask`` recipe + recording)."""
|
|
334
|
+
permission_mode = (
|
|
335
|
+
normalize_permission_mode(record.permission_mode, default=self._permission_mode)
|
|
336
|
+
if restore
|
|
337
|
+
else self._permission_mode
|
|
338
|
+
)
|
|
339
|
+
question_state: dict[str, Any] = {}
|
|
340
|
+
agent, manager = await self._construct_agent(
|
|
341
|
+
record,
|
|
342
|
+
config,
|
|
343
|
+
restore=restore,
|
|
344
|
+
permission_callback=permission_callback,
|
|
345
|
+
permission_mode=permission_mode,
|
|
346
|
+
question_state=question_state,
|
|
347
|
+
)
|
|
348
|
+
session = AcpSession(
|
|
349
|
+
session_id=record.session_id,
|
|
350
|
+
record=record,
|
|
351
|
+
agent=agent,
|
|
352
|
+
manager=manager,
|
|
353
|
+
permission_callback=permission_callback,
|
|
354
|
+
config=config,
|
|
355
|
+
question_state=question_state,
|
|
356
|
+
)
|
|
357
|
+
self._acp_sessions[record.session_id] = session
|
|
358
|
+
return session
|
|
359
|
+
|
|
360
|
+
async def _construct_agent(
|
|
361
|
+
self,
|
|
362
|
+
record: SessionRecord,
|
|
363
|
+
config: Any,
|
|
364
|
+
*,
|
|
365
|
+
restore: bool,
|
|
366
|
+
permission_callback: PermissionCallback | None,
|
|
367
|
+
permission_mode: PermissionMode | None = None,
|
|
368
|
+
question_state: dict[str, Any] | None = None,
|
|
369
|
+
) -> tuple[CoderAgent, CliConnectionManager]:
|
|
370
|
+
journal = self._store.journal(record.session_id)
|
|
371
|
+
recorder = self._store.recorder(record.session_id)
|
|
372
|
+
manager = CliConnectionManager()
|
|
373
|
+
recording = RecordingConnectionManager(
|
|
374
|
+
manager,
|
|
375
|
+
FileSessionEventStore(journal),
|
|
376
|
+
session_id=record.session_id,
|
|
377
|
+
artifact_store=FileArtifactStore(journal),
|
|
378
|
+
)
|
|
379
|
+
interaction_mode = record.interaction_mode or MODE_BUILD
|
|
380
|
+
agent_class = agent_class_for(interaction_mode)
|
|
381
|
+
agent_holder: dict[str, Any] = {}
|
|
382
|
+
question_markdown = PLANNING_QUESTION_PROMPT if interaction_mode == MODE_PLAN else BUILD_QUESTION_PROMPT
|
|
383
|
+
prompt_extensions = [
|
|
384
|
+
PromptExtension(
|
|
385
|
+
id="acp-questions",
|
|
386
|
+
title="Asking the User",
|
|
387
|
+
markdown=question_markdown,
|
|
388
|
+
modes=[ACP_AGENT_MODE],
|
|
389
|
+
propagate_to_sub_agents=False,
|
|
390
|
+
),
|
|
391
|
+
]
|
|
392
|
+
agent = agent_class(
|
|
393
|
+
project_path=Path(record.project_path),
|
|
394
|
+
workspace_id=record.workspace_id,
|
|
395
|
+
thread_id=record.thread_id,
|
|
396
|
+
connection_manager=recording,
|
|
397
|
+
config=config,
|
|
398
|
+
agent_mode=ACP_AGENT_MODE,
|
|
399
|
+
permission_mode=permission_mode or self._permission_mode,
|
|
400
|
+
permission_callback=permission_callback,
|
|
401
|
+
prompt_extensions=prompt_extensions,
|
|
402
|
+
tool_extensions=[
|
|
403
|
+
self._task_list_extension(record, agent_holder, interaction_mode),
|
|
404
|
+
build_question_extension(question_state or {}),
|
|
405
|
+
],
|
|
406
|
+
# Mirror the ask path: a resumed session hands the recorder over after
|
|
407
|
+
# restoring history, so construction never double-records a resumed turn.
|
|
408
|
+
session_recorder=None if restore else recorder,
|
|
409
|
+
)
|
|
410
|
+
agent_holder["agent"] = agent
|
|
411
|
+
agent.add_volatile_section(self._task_list_volatile_section(record))
|
|
412
|
+
lsp_messages = await agent.tool_collection.initialize()
|
|
413
|
+
for message in lsp_messages:
|
|
414
|
+
logger.debug("acp lsp: %s", message)
|
|
415
|
+
if restore:
|
|
416
|
+
agent.restore_message_history(record.history)
|
|
417
|
+
agent.restore_compaction_state(record.compaction)
|
|
418
|
+
agent.session_recorder = recorder
|
|
419
|
+
return agent, manager
|
|
420
|
+
|
|
421
|
+
# -- error conversion -------------------------------------------------
|
|
422
|
+
|
|
423
|
+
@staticmethod
|
|
424
|
+
def protocol_error(exc: BaseException) -> RequestError:
|
|
425
|
+
return RequestError.internal_error({"message": str(exc) or exc.__class__.__name__})
|