kolega-code 0.43.0__tar.gz → 0.45.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.43.0 → kolega_code-0.45.0}/CHANGELOG.md +93 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/CONTRIBUTING.md +12 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/PKG-INFO +17 -9
- {kolega_code-0.43.0 → kolega_code-0.45.0}/README.md +14 -6
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/__init__.py +1 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/agent_factory.py +45 -8
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/bridge.py +6 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/server.py +156 -25
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/session.py +10 -9
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/baseagent.py +576 -41
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/bundle-requirements.in +1 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/bundle-requirements.txt +8 -8
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +1 -1
- kolega_code-0.45.0/kolega_code/agent/prompt_templates/tools/agent_job.md +8 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +10 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/agent_tool.py +306 -95
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_definitions.py +28 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tools.py +30 -9
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/acp.py +9 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/app.py +350 -45
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/config.py +2 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/main.py +183 -25
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/messages.py +9 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/model_catalog.py +43 -2
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/provider_registry.py +19 -2
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_event_store.py +85 -3
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_journal.py +523 -90
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_store.py +40 -10
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_usage.py +52 -6
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/agent_runtime.py +625 -55
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/app_base.py +51 -3
- kolega_code-0.45.0/kolega_code/cli/tui/background_status.py +116 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/command_handlers.py +45 -14
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/constants.py +12 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/loop_runtime.py +12 -4
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/settings_panel.py +23 -9
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/shortcut_bar.py +2 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/startup.py +1 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/state.py +1 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/status_dashboard.py +111 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/sub_agent_screen.py +36 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/transcript.py +85 -15
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/turn_status.py +29 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/widgets.py +17 -6
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/config.py +3 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/events.py +8 -3
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/router.py +9 -3
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/sessions.py +166 -18
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/client.py +7 -1
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/exceptions.py +33 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/instrumented_client.py +2 -2
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/responses_common.py +7 -5
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/__init__.py +2 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/google.py +15 -0
- kolega_code-0.45.0/kolega_code/llm/specs/catalog/minimax.py +87 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/mistral.py +36 -13
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/xai.py +16 -0
- kolega_code-0.45.0/kolega_code/llm/specs/mistral_catalog.py +248 -0
- kolega_code-0.45.0/kolega_code/llm/timeouts.py +76 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/usage.py +3 -1
- kolega_code-0.45.0/kolega_code/session/background.py +455 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/pyproject.toml +12 -3
- kolega_code-0.43.0/kolega_code/llm/timeouts.py +0 -37
- {kolega_code-0.43.0 → kolega_code-0.45.0}/.gitignore +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/MIGRATION.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/RELEASING.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/diffs.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/permissions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/plans.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/questions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/acp/usage.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/handoff.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/session_metadata.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/gateway.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/peer_messaging.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/prompt_history.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/boot_splash.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/discovery.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/metadata.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/settings_screen.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/settings_widgets.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/task_list.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/tui/tool_presentation.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/access.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/access_settings.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/base.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/echo.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/telegram/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/telegram/adapter.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/adapters/telegram/formatting.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/bridge.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/commands.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/config.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/control_relay.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/daemon.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/event_router.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/questions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/redaction.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/service.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/gateway/stt.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/mistral.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/groq.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/inbox.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tool_subjects.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/ask_user.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.43.0 → kolega_code-0.45.0}/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.45.0 - 2026-10-22
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **First-party MiniMax support.** Select `minimax` with `MINIMAX_API_KEY`
|
|
14
|
+
or a key saved in Settings. Includes MiniMax M3.1 Flash (the default), M3,
|
|
15
|
+
and the M2 family, with streaming, tool calling, usage reporting, image
|
|
16
|
+
input on M3 models, and adjustable adaptive thinking on M3.1 Flash.
|
|
17
|
+
- **Mistral model refresh.** `kolega-code models refresh --provider mistral`
|
|
18
|
+
caches Mistral's live, account-visible model list so models published after a
|
|
19
|
+
release resolve without upgrading. The endpoint is authenticated, so the
|
|
20
|
+
command uses `MISTRAL_API_KEY` or a key saved in Settings. A refresh only adds
|
|
21
|
+
models Kolega does not already know and never overrides a bundled spec.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Reduced session-recording overhead during long turns by avoiding redundant
|
|
26
|
+
journal reads while the process exclusively owns the session.
|
|
27
|
+
- Updated the documentation site's image-processing dependency, sharp, to 0.35.5.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **Completed turns no longer leave the TUI stuck as busy on Python 3.12+.**
|
|
32
|
+
Ordinary turns, background-agent continuations, and scheduled loops now
|
|
33
|
+
release their timer and active-turn state correctly.
|
|
34
|
+
- **Stop no longer remains indefinitely on "Stopping…".** A second Stop or
|
|
35
|
+
five-second grace period restores the UI while unfinished cleanup remains
|
|
36
|
+
isolated. New turns and session, model, or settings changes wait for that
|
|
37
|
+
cleanup; late output cannot overwrite the current UI.
|
|
38
|
+
- **Silent model requests are bounded.** Separate first-response and idle
|
|
39
|
+
deadlines, bounded retries, and bounded stream cleanup prevent long,
|
|
40
|
+
unexplained waits. Compact connection-status notices keep the next action
|
|
41
|
+
visible even in narrow terminals; detailed errors remain in diagnostics.
|
|
42
|
+
- Slow session writes no longer indefinitely hide finished plans or prevent
|
|
43
|
+
turn finalization. Writes continue in the background with warnings and
|
|
44
|
+
diagnostics, and older delayed saves cannot overwrite newer state.
|
|
45
|
+
- Worktree switches committed before cancellation are completed or recovered
|
|
46
|
+
safely before queued work resumes.
|
|
47
|
+
- Quit now uses bounded waits and a final process-exit watchdog for stuck
|
|
48
|
+
cleanup or worker threads. The watchdog is disarmed when shutdown returns
|
|
49
|
+
normally.
|
|
50
|
+
- **Mistral catalog drift.** Large 4's context window is 1,048,576 tokens (was
|
|
51
|
+
524,288), Mistral Large 3 (`mistral-large-2512`) and its `latest` alias are now
|
|
52
|
+
catalogued, and `mistral-code-latest` resolves to Codestral. Large 4 is no
|
|
53
|
+
longer labelled a preview.
|
|
54
|
+
- **ACP model picker honours exported credentials.** Editor sessions now list
|
|
55
|
+
providers whose API key comes from the environment, matching the CLI, instead
|
|
56
|
+
of only providers saved through onboarding.
|
|
57
|
+
|
|
58
|
+
### Security
|
|
59
|
+
|
|
60
|
+
- Updated aiohttp to 3.14.5 for three parser/timeout advisories, with its
|
|
61
|
+
required yarl update to 1.25.1.
|
|
62
|
+
- Updated Pillow to 13.0.0 in the application and standalone eval bundle for
|
|
63
|
+
eight security advisories.
|
|
64
|
+
- Updated certifi to 2026.10.19, removing compromised emSign roots.
|
|
65
|
+
|
|
66
|
+
## 0.44.0 - 2026-10-19
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- **Background sub-agents.** The agent can delegate with
|
|
71
|
+
`dispatch_agent(..., background=True)` and keep working while the child runs;
|
|
72
|
+
foreground dispatch remains the default. Jobs belong to the session in the
|
|
73
|
+
TUI, `ask`, `--loop`, goal runs, editor (ACP) sessions, and gateway chats.
|
|
74
|
+
Completion reports arrive automatically and normally start a continuation
|
|
75
|
+
instead of becoming extra prompts. The new `agent_job` tool lists, inspects,
|
|
76
|
+
or cancels jobs, with reports retained after completion, failure, or
|
|
77
|
+
cancellation. Persisted outcomes can be recovered when a session resumes, and
|
|
78
|
+
reported background usage is attributed to the session. Jobs survive turns,
|
|
79
|
+
not process exit; cancelling a main turn does not discard child results.
|
|
80
|
+
- The TUI shows a persistent background-agent indicator above the composer,
|
|
81
|
+
distinguishing running, queued, undelivered, and failed work, and lists
|
|
82
|
+
retained jobs in the `Ctrl+G` sub-agent inspector. Delivered reports appear as
|
|
83
|
+
collapsed rows that expand on click or `Enter`, including after a session is
|
|
84
|
+
restored.
|
|
85
|
+
- Added native Google Gemini 4 Argon (`gemini-4-argon`) and xAI Grok 4.7
|
|
86
|
+
(`grok-4.7`) support, including model selectors, image input, streaming, tool
|
|
87
|
+
calling, and named reasoning efforts. Argon uses a shared 1,048,576-token
|
|
88
|
+
input/thinking/output window; Grok 4.7 uses 500,000 tokens and supports `xhigh`
|
|
89
|
+
effort. Existing provider defaults remain unchanged.
|
|
90
|
+
|
|
91
|
+
### Fixed
|
|
92
|
+
|
|
93
|
+
- Late transcript updates during screen teardown no longer raise while the
|
|
94
|
+
conversation is being pruned, so exiting or switching sessions can no longer
|
|
95
|
+
fail on a stale render.
|
|
96
|
+
|
|
97
|
+
### Security
|
|
98
|
+
|
|
99
|
+
- Updated mcp to 1.30.0, closing CVE-2026-59951 (GHSA-84m7-p3x7-pcfv), a
|
|
100
|
+
streamable-HTTP session exhaustion issue in the MCP client.
|
|
101
|
+
|
|
9
102
|
## 0.43.0 - 2026-10-13
|
|
10
103
|
|
|
11
104
|
### Added
|
|
@@ -120,6 +120,18 @@ You can pass additional pytest arguments through the wrapper:
|
|
|
120
120
|
./run_tests.sh tests/test_git_env.py -ra
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
+
## Comments
|
|
124
|
+
|
|
125
|
+
Comments are rare here. Write one only where the code cannot say it: a non-obvious
|
|
126
|
+
constraint, a failure mode, or a probed vendor behaviour.
|
|
127
|
+
|
|
128
|
+
- Don't restate a self-explanatory constant or boolean in prose above it.
|
|
129
|
+
- Don't write a docstring that rewords the signature, or one longer than the body it
|
|
130
|
+
documents.
|
|
131
|
+
- Don't transcribe research (probe logs, vendor quirks) into a source-file banner —
|
|
132
|
+
that belongs in `docs/`, `CHANGELOG.md`, or the test that pins the behaviour.
|
|
133
|
+
- Explain a subtle decision once, at the place it is made, not at every call site.
|
|
134
|
+
|
|
123
135
|
## Updating bundled skills
|
|
124
136
|
|
|
125
137
|
Kolega Code vendors a reviewed, tagged snapshot from
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.45.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/
|
|
@@ -45,14 +45,14 @@ Requires-Dist: langfuse==3.14.5
|
|
|
45
45
|
Requires-Dist: lxml-html-clean==0.4.5
|
|
46
46
|
Requires-Dist: markdownify==1.2.3
|
|
47
47
|
Requires-Dist: markitdown[docx,pdf,pptx,xls,xlsx]==0.1.6
|
|
48
|
-
Requires-Dist: mcp==1.
|
|
48
|
+
Requires-Dist: mcp==1.30.0
|
|
49
49
|
Requires-Dist: nest-asyncio==1.6.0
|
|
50
50
|
Requires-Dist: onnxruntime==1.19.2; sys_platform == 'darwin' and platform_machine == 'x86_64' and python_version < '3.13'
|
|
51
51
|
Requires-Dist: onnxruntime==1.27.0; python_version >= '3.14' and sys_platform != 'win32'
|
|
52
52
|
Requires-Dist: openai==2.46.0
|
|
53
53
|
Requires-Dist: packaging==25.0
|
|
54
54
|
Requires-Dist: pathspec==1.1.1
|
|
55
|
-
Requires-Dist: pillow==
|
|
55
|
+
Requires-Dist: pillow==13.0.0
|
|
56
56
|
Requires-Dist: playwright==1.59.0
|
|
57
57
|
Requires-Dist: psutil==7.2.2
|
|
58
58
|
Requires-Dist: pydantic==2.13.4
|
|
@@ -271,6 +271,7 @@ Supported model providers:
|
|
|
271
271
|
- DashScope / Qwen
|
|
272
272
|
- OpenRouter (gateway to 250+ tool-capable models)
|
|
273
273
|
- Moonshot / Kimi
|
|
274
|
+
- MiniMax
|
|
274
275
|
- DeepSeek
|
|
275
276
|
- Z.AI / GLM Coding Plan
|
|
276
277
|
- Kimi Coding Plan
|
|
@@ -314,20 +315,27 @@ kolega-code . --provider mistral --model mistral-medium-3-5
|
|
|
314
315
|
```
|
|
315
316
|
|
|
316
317
|
The picker defaults to Mistral Medium 3.5 and includes Mistral Small 4
|
|
317
|
-
(`mistral-small-2603`), Mistral Large 4
|
|
318
|
-
Ministral 3 (3B/8B/14B), Codestral, and eligible native
|
|
319
|
-
|
|
320
|
-
|
|
318
|
+
(`mistral-small-2603`), Mistral Large 4 (`mistral-large-4`), Mistral Large 3
|
|
319
|
+
(`mistral-large-2512`), Ministral 3 (3B/8B/14B), Codestral, and eligible native
|
|
320
|
+
aliases. Windows and capabilities mirror Mistral's authenticated model list; a
|
|
321
|
+
catalog entry does not guarantee access, because subscription tiers and
|
|
322
|
+
organization policies still apply. Aliases, especially `latest`, can change
|
|
323
|
+
their target and capabilities.
|
|
321
324
|
|
|
322
325
|
Medium 3.5, Small 4, Large 4, and Ministral 3 support image input; Codestral is
|
|
323
|
-
text-only. Medium
|
|
324
|
-
same-provider reasoning replayed in Mistral's native format
|
|
326
|
+
text-only. Medium 3.5, Small 4 and Large 4 expose `none` (default) or `high`
|
|
327
|
+
thinking, with same-provider reasoning replayed in Mistral's native format;
|
|
328
|
+
Large 3, Ministral 3 and Codestral expose no thinking control. Token counting is
|
|
325
329
|
a conservative local estimate with a safety margin, not an exact Mistral
|
|
326
330
|
tokenizer. The catalog's 32,768-token output reservation is Kolega's budgeting
|
|
327
331
|
policy, not a verified native maximum-output ceiling. Kolega Code runs the local
|
|
328
332
|
function-tool loop; Mistral-hosted server tools are not enabled. Native Mistral
|
|
329
333
|
keys and model IDs are separate from gateway credentials and routes.
|
|
330
334
|
|
|
335
|
+
Mistral publishes models between releases; `kolega-code models refresh --provider mistral`
|
|
336
|
+
caches the live list locally. It adds only models Kolega does not already ship
|
|
337
|
+
and never overrides a bundled spec.
|
|
338
|
+
|
|
331
339
|
## Requirements
|
|
332
340
|
|
|
333
341
|
- **Python 3.11+**
|
|
@@ -180,6 +180,7 @@ Supported model providers:
|
|
|
180
180
|
- DashScope / Qwen
|
|
181
181
|
- OpenRouter (gateway to 250+ tool-capable models)
|
|
182
182
|
- Moonshot / Kimi
|
|
183
|
+
- MiniMax
|
|
183
184
|
- DeepSeek
|
|
184
185
|
- Z.AI / GLM Coding Plan
|
|
185
186
|
- Kimi Coding Plan
|
|
@@ -223,20 +224,27 @@ kolega-code . --provider mistral --model mistral-medium-3-5
|
|
|
223
224
|
```
|
|
224
225
|
|
|
225
226
|
The picker defaults to Mistral Medium 3.5 and includes Mistral Small 4
|
|
226
|
-
(`mistral-small-2603`), Mistral Large 4
|
|
227
|
-
Ministral 3 (3B/8B/14B), Codestral, and eligible native
|
|
228
|
-
|
|
229
|
-
|
|
227
|
+
(`mistral-small-2603`), Mistral Large 4 (`mistral-large-4`), Mistral Large 3
|
|
228
|
+
(`mistral-large-2512`), Ministral 3 (3B/8B/14B), Codestral, and eligible native
|
|
229
|
+
aliases. Windows and capabilities mirror Mistral's authenticated model list; a
|
|
230
|
+
catalog entry does not guarantee access, because subscription tiers and
|
|
231
|
+
organization policies still apply. Aliases, especially `latest`, can change
|
|
232
|
+
their target and capabilities.
|
|
230
233
|
|
|
231
234
|
Medium 3.5, Small 4, Large 4, and Ministral 3 support image input; Codestral is
|
|
232
|
-
text-only. Medium
|
|
233
|
-
same-provider reasoning replayed in Mistral's native format
|
|
235
|
+
text-only. Medium 3.5, Small 4 and Large 4 expose `none` (default) or `high`
|
|
236
|
+
thinking, with same-provider reasoning replayed in Mistral's native format;
|
|
237
|
+
Large 3, Ministral 3 and Codestral expose no thinking control. Token counting is
|
|
234
238
|
a conservative local estimate with a safety margin, not an exact Mistral
|
|
235
239
|
tokenizer. The catalog's 32,768-token output reservation is Kolega's budgeting
|
|
236
240
|
policy, not a verified native maximum-output ceiling. Kolega Code runs the local
|
|
237
241
|
function-tool loop; Mistral-hosted server tools are not enabled. Native Mistral
|
|
238
242
|
keys and model IDs are separate from gateway credentials and routes.
|
|
239
243
|
|
|
244
|
+
Mistral publishes models between releases; `kolega-code models refresh --provider mistral`
|
|
245
|
+
caches the live list locally. It adds only models Kolega does not already ship
|
|
246
|
+
and never overrides a bundled spec.
|
|
247
|
+
|
|
240
248
|
## Requirements
|
|
241
249
|
|
|
242
250
|
- **Python 3.11+**
|
|
@@ -18,6 +18,7 @@ the process keeps serving.
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
20
|
import logging
|
|
21
|
+
import os
|
|
21
22
|
from pathlib import Path
|
|
22
23
|
from typing import Any, Awaitable, Callable, cast
|
|
23
24
|
|
|
@@ -38,7 +39,7 @@ from kolega_code.agent.prompt_provider import AgentMode
|
|
|
38
39
|
from kolega_code.agent.prompts import BUILD_QUESTION_PROMPT, PLANNING_QUESTION_PROMPT
|
|
39
40
|
from kolega_code.agent.tool_definitions import tool_description_asset
|
|
40
41
|
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.config import API_KEY_ENV, CliConfigOverrides, build_agent_config, config_summary
|
|
42
43
|
from kolega_code.cli.connection import CliConnectionManager
|
|
43
44
|
from kolega_code.cli.provider_registry import PROVIDER_LABELS, ui_model_options
|
|
44
45
|
from kolega_code.cli.session_event_store import FileArtifactStore, FileSessionEventStore
|
|
@@ -139,6 +140,15 @@ class AgentFactory:
|
|
|
139
140
|
return
|
|
140
141
|
self.persist(session)
|
|
141
142
|
try:
|
|
143
|
+
jobs = getattr(session.agent, "background_jobs", None)
|
|
144
|
+
if jobs is not None:
|
|
145
|
+
jobs.set_callbacks(on_ready=None, on_delivered=None)
|
|
146
|
+
await jobs.close()
|
|
147
|
+
await jobs.deliver(session.agent)
|
|
148
|
+
self.persist(session)
|
|
149
|
+
for old in session.retired_agents:
|
|
150
|
+
await old.cleanup()
|
|
151
|
+
session.retired_agents.clear()
|
|
142
152
|
await session.agent.cleanup()
|
|
143
153
|
except Exception: # noqa: BLE001 — closing must not mask the primary outcome
|
|
144
154
|
logger.exception("acp session close: agent cleanup failed (session=%s)", session_id)
|
|
@@ -238,12 +248,24 @@ class AgentFactory:
|
|
|
238
248
|
settings_store=self._settings_store,
|
|
239
249
|
)
|
|
240
250
|
|
|
241
|
-
def
|
|
251
|
+
def _configured_providers(self) -> list[str]:
|
|
252
|
+
"""Providers the editor can offer: saved keys plus exported credentials.
|
|
253
|
+
|
|
254
|
+
ACP spawns as a child of the editor, which inherits the shell
|
|
255
|
+
environment. The CLI already treats an exported ``*_API_KEY`` as
|
|
256
|
+
sufficient, so an env-only provider must not be invisible here just
|
|
257
|
+
because it was never saved through onboarding.
|
|
258
|
+
"""
|
|
242
259
|
assert self._settings is not None
|
|
260
|
+
providers = {provider for provider, key in self._settings.api_keys.items() if key}
|
|
261
|
+
providers.update(
|
|
262
|
+
provider.value for provider, env_name in API_KEY_ENV.items() if (os.environ.get(env_name) or "").strip()
|
|
263
|
+
)
|
|
264
|
+
return sorted(providers)
|
|
265
|
+
|
|
266
|
+
def _model_option(self, session: AcpSession) -> SessionConfigOptionSelect:
|
|
243
267
|
groups: list[SessionConfigSelectGroup] = []
|
|
244
|
-
for provider
|
|
245
|
-
if not key:
|
|
246
|
-
continue
|
|
268
|
+
for provider in self._configured_providers():
|
|
247
269
|
options = [
|
|
248
270
|
SessionConfigSelectOption(value=f"{provider}/{model}", name=label)
|
|
249
271
|
for label, model in ui_model_options(provider)
|
|
@@ -315,10 +337,24 @@ class AgentFactory:
|
|
|
315
337
|
permission_mode=old.permission_mode,
|
|
316
338
|
question_state=session.question_state,
|
|
317
339
|
)
|
|
340
|
+
# New generations must keep publishing into the session-lifetime event
|
|
341
|
+
# consumer, including children still using the previous generation.
|
|
342
|
+
if manager is not session.manager:
|
|
343
|
+
raise RuntimeError("ACP rebuild must preserve the session connection manager")
|
|
318
344
|
session.agent = agent
|
|
319
|
-
|
|
345
|
+
jobs = getattr(old, "background_jobs", None)
|
|
346
|
+
if jobs is not None and agent is not old:
|
|
347
|
+
agent.background_jobs = jobs
|
|
348
|
+
agent.background_needs_turn = getattr(old, "background_needs_turn", False)
|
|
349
|
+
old.background_jobs = None
|
|
350
|
+
if jobs is not None and jobs.active_count and agent is not old:
|
|
351
|
+
# Children borrow this generation's terminal/browser/extensions.
|
|
352
|
+
# Keep it alive until the supervisor has joined them.
|
|
353
|
+
session.retired_agents.append(old)
|
|
354
|
+
return
|
|
320
355
|
try:
|
|
321
|
-
|
|
356
|
+
if agent is not old:
|
|
357
|
+
await old.cleanup()
|
|
322
358
|
except Exception: # noqa: BLE001
|
|
323
359
|
logger.exception("acp model switch: old agent cleanup failed (session=%s)", session.session_id)
|
|
324
360
|
|
|
@@ -369,7 +405,8 @@ class AgentFactory:
|
|
|
369
405
|
) -> tuple[CoderAgent, CliConnectionManager]:
|
|
370
406
|
journal = self._store.journal(record.session_id)
|
|
371
407
|
recorder = self._store.recorder(record.session_id)
|
|
372
|
-
|
|
408
|
+
existing = self._acp_sessions.get(record.session_id)
|
|
409
|
+
manager = existing.manager if existing is not None else CliConnectionManager()
|
|
373
410
|
recording = RecordingConnectionManager(
|
|
374
411
|
manager,
|
|
375
412
|
FileSessionEventStore(journal),
|
|
@@ -111,6 +111,12 @@ class AcpBridge:
|
|
|
111
111
|
#: label the dispatching card's title.
|
|
112
112
|
self._dispatch_labels: dict[str, str] = {}
|
|
113
113
|
|
|
114
|
+
def begin_turn(self, agent: Any, diff_provider: AcpDiffProvider) -> None:
|
|
115
|
+
"""Reset turn-only projections, retaining session-lifetime tool maps."""
|
|
116
|
+
self._agent = agent
|
|
117
|
+
self._diffs = diff_provider
|
|
118
|
+
self._turn_response_parts.clear()
|
|
119
|
+
|
|
114
120
|
async def send(self, session_id: str, update: Any) -> None:
|
|
115
121
|
if logger.isEnabledFor(logging.DEBUG):
|
|
116
122
|
logger.debug(
|
|
@@ -188,6 +188,7 @@ class AcpAgent(Agent):
|
|
|
188
188
|
return await self._load_sub_session(session_id)
|
|
189
189
|
if session_id in self._sessions:
|
|
190
190
|
existing = self._sessions[session_id]
|
|
191
|
+
self._start_session_tasks(existing)
|
|
191
192
|
return LoadSessionResponse(config_options=self._factory.config_options_for(existing))
|
|
192
193
|
try:
|
|
193
194
|
session = await self._factory.load_session(
|
|
@@ -204,6 +205,7 @@ class AcpAgent(Agent):
|
|
|
204
205
|
await self._emit_initial_usage(session)
|
|
205
206
|
await self._send_available_commands(session)
|
|
206
207
|
await self._replay_transcript(session)
|
|
208
|
+
self._start_session_tasks(session)
|
|
207
209
|
return LoadSessionResponse(config_options=self._factory.config_options_for(session))
|
|
208
210
|
|
|
209
211
|
async def _load_sub_session(self, session_id: str) -> LoadSessionResponse:
|
|
@@ -254,11 +256,33 @@ class AcpAgent(Agent):
|
|
|
254
256
|
|
|
255
257
|
async def close_session(self, session_id: str, **kwargs: Any) -> None:
|
|
256
258
|
logger.info("acp session/close (session=%s)", session_id)
|
|
257
|
-
self._sessions.pop(session_id, None)
|
|
259
|
+
session = self._sessions.pop(session_id, None)
|
|
260
|
+
if session is not None:
|
|
261
|
+
session.closed = True
|
|
262
|
+
session.auto_continue_paused = True
|
|
263
|
+
if session.turn_task is not None:
|
|
264
|
+
session.turn_task.cancel()
|
|
265
|
+
await asyncio.gather(session.turn_task, return_exceptions=True)
|
|
266
|
+
if session.background_task is not None:
|
|
267
|
+
session.background_task.cancel()
|
|
268
|
+
await asyncio.gather(session.background_task, return_exceptions=True)
|
|
258
269
|
self._brokers.pop(session_id, None)
|
|
259
|
-
|
|
270
|
+
if session is not None:
|
|
271
|
+
async with session.execution_lock:
|
|
272
|
+
await self._factory.close_session(session_id)
|
|
273
|
+
else:
|
|
274
|
+
await self._factory.close_session(session_id)
|
|
275
|
+
if session is not None and session.event_task is not None:
|
|
276
|
+
session.event_task.cancel()
|
|
277
|
+
await asyncio.gather(session.event_task, return_exceptions=True)
|
|
278
|
+
await self._drain_residual(session, session.bridge)
|
|
260
279
|
return None
|
|
261
280
|
|
|
281
|
+
async def shutdown(self) -> None:
|
|
282
|
+
"""Join session work before the ACP transport and shared services close."""
|
|
283
|
+
for session_id in list(self._sessions):
|
|
284
|
+
await self.close_session(session_id)
|
|
285
|
+
|
|
262
286
|
# -- turns ------------------------------------------------------------
|
|
263
287
|
|
|
264
288
|
async def prompt(self, session_id: str, prompt: list[_PromptBlock], **kwargs: Any) -> PromptResponse:
|
|
@@ -270,13 +294,19 @@ class AcpAgent(Agent):
|
|
|
270
294
|
text = self._extract_text(prompt)
|
|
271
295
|
if not text:
|
|
272
296
|
raise RequestError.invalid_request({"message": "prompt contains no text"})
|
|
273
|
-
|
|
274
|
-
|
|
297
|
+
self._start_session_tasks(session)
|
|
298
|
+
async with session.execution_lock:
|
|
299
|
+
session.auto_continue_paused = False
|
|
300
|
+
stop_reason = await self._run_turn(session, text)
|
|
301
|
+
self._factory.persist(session)
|
|
275
302
|
return PromptResponse(stop_reason=stop_reason)
|
|
276
303
|
|
|
277
304
|
async def cancel(self, session_id: str, **kwargs: Any) -> None:
|
|
278
305
|
session = self._sessions.get(session_id)
|
|
279
|
-
if session is None
|
|
306
|
+
if session is None:
|
|
307
|
+
return
|
|
308
|
+
session.auto_continue_paused = True
|
|
309
|
+
if session.turn_task is None:
|
|
280
310
|
logger.debug("acp session/cancel: nothing to cancel (session=%s)", session_id)
|
|
281
311
|
return
|
|
282
312
|
logger.info("acp session/cancel (session=%s)", session_id)
|
|
@@ -314,7 +344,8 @@ class AcpAgent(Agent):
|
|
|
314
344
|
raise RequestError.invalid_params({"message": f"unknown mode {mode_id!r}; available: build, plan"})
|
|
315
345
|
if not session.idle():
|
|
316
346
|
raise RequestError.invalid_request({"message": "modes apply between turns only"})
|
|
317
|
-
|
|
347
|
+
async with session.execution_lock:
|
|
348
|
+
await self._factory.set_interaction_mode(session, mode_id)
|
|
318
349
|
logger.info("acp session mode -> %s (session=%s)", mode_id, session_id)
|
|
319
350
|
await self._emit_current_mode(session)
|
|
320
351
|
return SetSessionModeResponse()
|
|
@@ -342,14 +373,16 @@ class AcpAgent(Agent):
|
|
|
342
373
|
raise RequestError.invalid_params({"message": "model option expects 'provider/model'"})
|
|
343
374
|
provider, model = value.split("/", 1)
|
|
344
375
|
try:
|
|
345
|
-
|
|
376
|
+
async with session.execution_lock:
|
|
377
|
+
await self._factory.apply_model(session, provider, model)
|
|
346
378
|
except _HANDLED_CONFIG_ERRORS as exc:
|
|
347
379
|
raise AgentFactory.protocol_error(exc) from exc
|
|
348
380
|
logger.info("acp session config: model -> %s/%s (session=%s)", provider, model, session_id)
|
|
349
381
|
elif config_id == CONFIG_MODE:
|
|
350
382
|
if value not in INTERACTION_MODES:
|
|
351
383
|
raise RequestError.invalid_params({"message": f"unknown mode {value!r}; available: build, plan"})
|
|
352
|
-
|
|
384
|
+
async with session.execution_lock:
|
|
385
|
+
await self._factory.set_interaction_mode(session, str(value))
|
|
353
386
|
logger.info("acp session config: mode -> %s (session=%s)", value, session_id)
|
|
354
387
|
await self._emit_current_mode(session)
|
|
355
388
|
else:
|
|
@@ -438,6 +471,7 @@ class AcpAgent(Agent):
|
|
|
438
471
|
return
|
|
439
472
|
await self._emit_initial_usage(session)
|
|
440
473
|
await self._send_available_commands(session)
|
|
474
|
+
self._start_session_tasks(session)
|
|
441
475
|
|
|
442
476
|
async def _send_available_commands(self, session: AcpSession) -> None:
|
|
443
477
|
"""Advertise the agent's slash commands for the client's command UI.
|
|
@@ -525,29 +559,107 @@ class AcpAgent(Agent):
|
|
|
525
559
|
|
|
526
560
|
# -- turn machinery ----------------------------------------------------
|
|
527
561
|
|
|
528
|
-
|
|
562
|
+
def _start_session_tasks(self, session: AcpSession) -> None:
|
|
563
|
+
if session.closed:
|
|
564
|
+
return
|
|
565
|
+
if session.event_task is None:
|
|
566
|
+
session.bridge = AcpBridge(
|
|
567
|
+
self._conn, diff_provider=AcpDiffProvider.for_session(session), agent=session.agent
|
|
568
|
+
)
|
|
569
|
+
session.event_task = asyncio.create_task(
|
|
570
|
+
self._pump_events(session, session.bridge), name=f"acp-events-{session.session_id}"
|
|
571
|
+
)
|
|
572
|
+
# Explicit session activity rearms retained presentation work, including
|
|
573
|
+
# after a transport failure. The worker must not retry itself on failure.
|
|
574
|
+
if session.completions:
|
|
575
|
+
session.background_wake.set()
|
|
576
|
+
if session.background_task is not None and not session.background_task.done():
|
|
577
|
+
return
|
|
578
|
+
get_jobs = getattr(session.agent, "get_background_jobs", None)
|
|
579
|
+
if callable(get_jobs):
|
|
580
|
+
jobs: Any = get_jobs()
|
|
581
|
+
|
|
582
|
+
def delivered(completion: dict[str, Any]) -> None:
|
|
583
|
+
session.completions.append(completion)
|
|
584
|
+
session.background_wake.set()
|
|
585
|
+
|
|
586
|
+
jobs.set_callbacks(on_ready=session.background_wake.set, on_delivered=delivered)
|
|
587
|
+
session.background_task = asyncio.create_task(
|
|
588
|
+
self._background_worker(session, jobs), name=f"acp-background-{session.session_id}"
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
async def _background_worker(self, session: AcpSession, jobs: Any) -> None:
|
|
592
|
+
await jobs.recover()
|
|
593
|
+
if jobs.pending_count:
|
|
594
|
+
session.background_wake.set()
|
|
595
|
+
while not session.closed:
|
|
596
|
+
await session.background_wake.wait()
|
|
597
|
+
session.background_wake.clear()
|
|
598
|
+
async with session.execution_lock:
|
|
599
|
+
if session.closed:
|
|
600
|
+
return
|
|
601
|
+
try:
|
|
602
|
+
await jobs.deliver(session.agent)
|
|
603
|
+
# Delivery callbacks also wake the worker for reports
|
|
604
|
+
# inserted by the running agent. Consume those wakeups now,
|
|
605
|
+
# not after sending: a failed send must wait for new activity,
|
|
606
|
+
# while readiness arriving during presentation must survive.
|
|
607
|
+
session.background_wake.clear()
|
|
608
|
+
if jobs.pending_count:
|
|
609
|
+
session.background_wake.set()
|
|
610
|
+
completions = bool(session.completions)
|
|
611
|
+
try:
|
|
612
|
+
while session.completions:
|
|
613
|
+
completion = session.completions[0]
|
|
614
|
+
await session.bridge.send(
|
|
615
|
+
session.session_id, update_agent_thought_text(str(completion["text"]))
|
|
616
|
+
)
|
|
617
|
+
# History insertion is already durable. Acknowledge
|
|
618
|
+
# presentation separately, only after this send
|
|
619
|
+
# succeeds; failure/cancellation retains the suffix.
|
|
620
|
+
session.completions.pop(0)
|
|
621
|
+
except Exception:
|
|
622
|
+
logger.exception("acp background presentation failed (session=%s)", session.session_id)
|
|
623
|
+
continue
|
|
624
|
+
if (
|
|
625
|
+
completions
|
|
626
|
+
and not session.auto_continue_paused
|
|
627
|
+
and getattr(session.agent, "background_needs_turn", True)
|
|
628
|
+
):
|
|
629
|
+
await self._run_turn(session, None)
|
|
630
|
+
self._factory.persist(session)
|
|
631
|
+
if jobs is not getattr(session.agent, "background_jobs", None):
|
|
632
|
+
return # a context reset installed another epoch's owner
|
|
633
|
+
if not jobs.active_count:
|
|
634
|
+
for old in session.retired_agents:
|
|
635
|
+
await old.cleanup()
|
|
636
|
+
session.retired_agents.clear()
|
|
637
|
+
except asyncio.CancelledError:
|
|
638
|
+
raise
|
|
639
|
+
except Exception:
|
|
640
|
+
# A failed automatic turn must not spin or silently kill
|
|
641
|
+
# the prompt owner. Explicit input can resume it.
|
|
642
|
+
session.auto_continue_paused = True
|
|
643
|
+
logger.exception("acp background delivery failed (session=%s)", session.session_id)
|
|
644
|
+
|
|
645
|
+
async def _run_turn(self, session: AcpSession, text: str | None) -> StopReason:
|
|
529
646
|
"""Drive one agent turn, mapping its output to ACP updates.
|
|
530
647
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
results still render.
|
|
648
|
+
The event pump belongs to the session, not this request. It keeps
|
|
649
|
+
rendering child activity after a prompt's response has been returned.
|
|
534
650
|
"""
|
|
535
|
-
|
|
536
|
-
bridge =
|
|
651
|
+
self._start_session_tasks(session)
|
|
652
|
+
bridge = session.bridge
|
|
653
|
+
bridge.begin_turn(session.agent, AcpDiffProvider.for_session(session))
|
|
537
654
|
session.turn_task = asyncio.create_task(self._drive_turn(session, bridge, text))
|
|
538
|
-
|
|
655
|
+
reason: StopReason = "cancelled"
|
|
539
656
|
try:
|
|
540
|
-
|
|
657
|
+
reason = await session.turn_task
|
|
658
|
+
return reason
|
|
541
659
|
finally:
|
|
542
|
-
pump.cancel()
|
|
543
|
-
try:
|
|
544
|
-
await pump
|
|
545
|
-
except asyncio.CancelledError:
|
|
546
|
-
pass
|
|
547
|
-
await self._drain_residual(session, bridge)
|
|
548
660
|
session.turn_task = None
|
|
549
661
|
await bridge.emit_usage(session.session_id)
|
|
550
|
-
plan = self._consume_plan(session, bridge)
|
|
662
|
+
plan = self._consume_plan(session, bridge) if reason != "cancelled" and not session.closed else None
|
|
551
663
|
if plan:
|
|
552
664
|
session.record.latest_plan_markdown = plan
|
|
553
665
|
session.record.plan_pending = True
|
|
@@ -606,6 +718,20 @@ class AcpAgent(Agent):
|
|
|
606
718
|
session.record.plan_pending = False
|
|
607
719
|
session.record.plan_reofferable = False
|
|
608
720
|
if option_id == "implement_plan_clear":
|
|
721
|
+
jobs = getattr(session.agent, "background_jobs", None)
|
|
722
|
+
if jobs is not None:
|
|
723
|
+
# The reset starts another epoch. Settle old-context work
|
|
724
|
+
# before clearing its history and creating a new owner.
|
|
725
|
+
jobs.set_callbacks(on_ready=None, on_delivered=None)
|
|
726
|
+
await jobs.close()
|
|
727
|
+
await jobs.deliver(session.agent)
|
|
728
|
+
session.agent.background_jobs = None
|
|
729
|
+
if session.background_task is not None and session.background_task is not asyncio.current_task():
|
|
730
|
+
session.background_task.cancel()
|
|
731
|
+
await asyncio.gather(session.background_task, return_exceptions=True)
|
|
732
|
+
session.background_task = None
|
|
733
|
+
session.completions.clear()
|
|
734
|
+
session.background_wake.clear()
|
|
609
735
|
self._clear_agent_context(session)
|
|
610
736
|
await self._factory.set_interaction_mode(session, MODE_BUILD)
|
|
611
737
|
await self._emit_current_mode(session)
|
|
@@ -630,9 +756,14 @@ class AcpAgent(Agent):
|
|
|
630
756
|
session.record.history = []
|
|
631
757
|
session.record.compaction = {}
|
|
632
758
|
|
|
633
|
-
async def _drive_turn(self, session: AcpSession, bridge: AcpBridge, text: str) ->
|
|
759
|
+
async def _drive_turn(self, session: AcpSession, bridge: AcpBridge, text: str | None) -> StopReason:
|
|
634
760
|
try:
|
|
635
|
-
|
|
761
|
+
stream = (
|
|
762
|
+
session.agent.process_message_stream(text)
|
|
763
|
+
if text is not None
|
|
764
|
+
else session.agent.continue_from_history_stream()
|
|
765
|
+
)
|
|
766
|
+
async for chunk in stream:
|
|
636
767
|
await bridge.emit_chunk(session.session_id, chunk)
|
|
637
768
|
return "end_turn"
|
|
638
769
|
except asyncio.CancelledError:
|
|
@@ -33,14 +33,15 @@ class AcpSession:
|
|
|
33
33
|
question_state: dict[str, Any] = field(default_factory=dict)
|
|
34
34
|
#: In-flight turn task; None when the session is idle. Set and cleared by the server.
|
|
35
35
|
turn_task: asyncio.Task | None = field(default=None, repr=False)
|
|
36
|
+
execution_lock: asyncio.Lock = field(default_factory=asyncio.Lock, repr=False)
|
|
37
|
+
event_task: asyncio.Task[None] | None = field(default=None, repr=False)
|
|
38
|
+
background_task: asyncio.Task[None] | None = field(default=None, repr=False)
|
|
39
|
+
bridge: Any = field(default=None, repr=False)
|
|
40
|
+
background_wake: asyncio.Event = field(default_factory=asyncio.Event, repr=False)
|
|
41
|
+
completions: list[dict[str, Any]] = field(default_factory=list)
|
|
42
|
+
auto_continue_paused: bool = False
|
|
43
|
+
closed: bool = False
|
|
44
|
+
retired_agents: list[Any] = field(default_factory=list, repr=False)
|
|
36
45
|
|
|
37
46
|
def idle(self) -> bool:
|
|
38
|
-
return self.turn_task is None or self.turn_task.done()
|
|
39
|
-
|
|
40
|
-
def drain_events(self) -> None:
|
|
41
|
-
"""Drop any events left over from a previous turn (stale mapping inputs)."""
|
|
42
|
-
while not self.manager.events.empty():
|
|
43
|
-
try:
|
|
44
|
-
self.manager.events.get_nowait()
|
|
45
|
-
except asyncio.QueueEmpty:
|
|
46
|
-
break
|
|
47
|
+
return not self.execution_lock.locked() and (self.turn_task is None or self.turn_task.done())
|