kolega-code 0.33.0__tar.gz → 0.35.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.33.0 → kolega_code-0.35.0}/CHANGELOG.md +75 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/PKG-INFO +2 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/__init__.py +1 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/compression.py +4 -4
- kolega_code-0.35.0/kolega_code/agent/handoff.py +167 -0
- kolega_code-0.35.0/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +37 -0
- kolega_code-0.35.0/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +11 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompts.py +9 -0
- kolega_code-0.35.0/kolega_code/agent/session_metadata.py +165 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/app.py +162 -3
- kolega_code-0.35.0/kolega_code/cli/gateway.py +390 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/main.py +30 -11
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/messages.py +9 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/peer_messaging.py +1 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/provider_registry.py +11 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/session_store.py +43 -4
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/settings.py +78 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/slash_commands.py +8 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/agent_runtime.py +75 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/app_base.py +6 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/command_handlers.py +114 -6
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/settings_panel.py +200 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/settings_screen.py +76 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/status_dashboard.py +15 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/updater.py +14 -1
- kolega_code-0.35.0/kolega_code/gateway/__init__.py +50 -0
- kolega_code-0.35.0/kolega_code/gateway/access.py +194 -0
- kolega_code-0.35.0/kolega_code/gateway/adapters/__init__.py +72 -0
- kolega_code-0.35.0/kolega_code/gateway/adapters/base.py +186 -0
- kolega_code-0.35.0/kolega_code/gateway/adapters/echo.py +128 -0
- kolega_code-0.35.0/kolega_code/gateway/adapters/telegram/__init__.py +6 -0
- kolega_code-0.35.0/kolega_code/gateway/adapters/telegram/adapter.py +467 -0
- kolega_code-0.35.0/kolega_code/gateway/adapters/telegram/formatting.py +151 -0
- kolega_code-0.35.0/kolega_code/gateway/bridge.py +225 -0
- kolega_code-0.35.0/kolega_code/gateway/commands.py +54 -0
- kolega_code-0.35.0/kolega_code/gateway/config.py +190 -0
- kolega_code-0.35.0/kolega_code/gateway/control_relay.py +204 -0
- kolega_code-0.35.0/kolega_code/gateway/daemon.py +263 -0
- kolega_code-0.35.0/kolega_code/gateway/event_router.py +55 -0
- kolega_code-0.35.0/kolega_code/gateway/questions.py +65 -0
- kolega_code-0.35.0/kolega_code/gateway/redaction.py +35 -0
- kolega_code-0.35.0/kolega_code/gateway/router.py +104 -0
- kolega_code-0.35.0/kolega_code/gateway/service.py +223 -0
- kolega_code-0.35.0/kolega_code/gateway/sessions.py +741 -0
- kolega_code-0.35.0/kolega_code/gateway/stt.py +187 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/__init__.py +2 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/google.py +13 -0
- kolega_code-0.35.0/kolega_code/llm/specs/catalog/groq.py +54 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +18 -18
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/openrouter.py +1085 -1045
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +16 -2
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/tinker.py +10 -2
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/zai.py +14 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/pyproject.toml +3 -1
- {kolega_code-0.33.0 → kolega_code-0.35.0}/.gitignore +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/CONTRIBUTING.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/MIGRATION.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/README.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/RELEASING.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/agent_factory.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/bridge.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/diffs.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/permissions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/plans.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/questions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/server.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/session.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/acp/usage.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/baseagent.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/acp.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/config.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/prompt_history.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/config.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/events.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/extensions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/git_env.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/client.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/llm/usage.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/local_state.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/permissions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/runtime.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/base.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/html.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/control.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/inbox.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/session/store.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/tools/ask_user.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/server.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.33.0 → kolega_code-0.35.0}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,81 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.35.0 - 2026-09-03
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added Google Gemini 3.8 Flash (`gemini-3.8-flash`): 1M-token context, 64K
|
|
14
|
+
output, vision and function calling, and `low`/`medium`/`high` thinking
|
|
15
|
+
levels. It omits Google's deprecated temperature parameter and is now the
|
|
16
|
+
default Google model.
|
|
17
|
+
- **Descriptive session titles.** Sessions now get a natural-language title
|
|
18
|
+
and a short description generated in the background by the active LLM after
|
|
19
|
+
substantive turns, while the stable session name keeps its role as the
|
|
20
|
+
peer-addressing handle. `/retitle` regenerates them on demand, a dedicated
|
|
21
|
+
Session card in the sidebar shows them, and the header, status dashboard,
|
|
22
|
+
startup banner, and `sessions` CLI output all display the title.
|
|
23
|
+
- **`kolega-code gateway restart` and auto-restart on update.** The new
|
|
24
|
+
subcommand restarts an installed gateway service in place (systemd user
|
|
25
|
+
unit on Linux, launchd agent on macOS). `kolega-code update`, the `/update`
|
|
26
|
+
TUI command, and the shell installer now restart the gateway automatically
|
|
27
|
+
when the service is installed, so an update picks up the new build without
|
|
28
|
+
a manual daemon restart.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- OpenRouter catalog refreshed from the live endpoint (2026-09-03 snapshot):
|
|
33
|
+
277 tool-capable models (20 featured), adding `google/gemini-3.8-flash` and
|
|
34
|
+
the `meta/muse-spark-1.3` pair, with featured order re-ranked by the latest
|
|
35
|
+
weekly token volume.
|
|
36
|
+
|
|
37
|
+
## 0.34.0 - 2026-09-02
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **Telegram gateway.** The new `kolega-code gateway` daemon drives Kolega Code
|
|
42
|
+
agents from Telegram: each chat maps to a durable session, and agent turns
|
|
43
|
+
stream back as edit-in-place chat messages. `kolega-code gateway telegram
|
|
44
|
+
setup --verify` saves your @BotFather token, `kolega-code gateway run
|
|
45
|
+
--adapter telegram` starts the daemon (an LLM-free `echo` adapter is
|
|
46
|
+
included for transport testing), and `gateway install` registers it as a
|
|
47
|
+
systemd user service or launchd agent — a new Gateway page in Settings
|
|
48
|
+
covers configuration. Access is by sender allowlist with pairing-code
|
|
49
|
+
onboarding (`gateway pairing`), group chats stay silent unless the bot is
|
|
50
|
+
@mentioned or replied to, and each chat gets slash commands (`/model`,
|
|
51
|
+
`/permissions`, `/status`) as ordinary messages. Permission prompts and
|
|
52
|
+
agent questions arrive as tappable inline buttons. Voice notes are
|
|
53
|
+
transcribed, photos attach as vision input, documents are saved where the
|
|
54
|
+
agent's tools can reach them, sessions survive gateway restarts, and the
|
|
55
|
+
working directory defaults to `~/kolega-code-workspace` — never the daemon's
|
|
56
|
+
own. Outbound messages are redacted for known secrets, including the bot
|
|
57
|
+
token.
|
|
58
|
+
- **`/handoff`.** `/handoff [focus instructions]` summarizes the current
|
|
59
|
+
session with a one-shot LLM call and switches to a brand-new session whose
|
|
60
|
+
entire context is that structured document (Goal, Constraints &
|
|
61
|
+
Preferences, Progress, Key Decisions, Critical Context, Next Steps). The
|
|
62
|
+
old session stays intact and resumable, recorded as the new session's
|
|
63
|
+
parent; Esc during generation cancels cooperatively and leaves the session
|
|
64
|
+
untouched.
|
|
65
|
+
- **Groq as a first-party provider, plus remote voice transcription.** Groq is
|
|
66
|
+
now a catalogued provider — `openai/gpt-oss-120b`, `openai/gpt-oss-20b`,
|
|
67
|
+
`qwen/qwen3-32b`, `qwen/qwen3.6-27b`, and the Llama 4 Scout/Maverick pair,
|
|
68
|
+
all 131K context — with its own entry on the Providers page and the `groq`
|
|
69
|
+
API key. Gateway voice notes transcribe through Groq's hosted
|
|
70
|
+
`whisper-large-v3-turbo` (Settings → Tools → Voice transcription), reusing
|
|
71
|
+
that same key; transcription is remote-only.
|
|
72
|
+
- **GLM-5.3-Flash on Z.AI.** The GLM Coding Plan catalog adds `glm-5.3-flash`
|
|
73
|
+
— 1M-token context, 128K max output, `high`/`max` reasoning effort
|
|
74
|
+
(default `max`), and the first GLM-5 model with native vision input.
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
|
|
78
|
+
- Provider catalogs refreshed from live endpoints (2026-09-02 snapshots):
|
|
79
|
+
OpenRouter (274 tool-capable models, 20 featured), Tinker (27 models,
|
|
80
|
+
+`zai-org/GLM-5.3`), Ollama Cloud (19 models, +`glm-5.3`/`glm-5.3-flash`,
|
|
81
|
+
deepseek `:preview` tags dropped), and Perplexity Agent (46 models,
|
|
82
|
+
+`anthropic/claude-fable-5-1`).
|
|
83
|
+
|
|
9
84
|
## 0.33.0 - 2026-08-26
|
|
10
85
|
|
|
11
86
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.35.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/
|
|
@@ -27,6 +27,7 @@ Classifier: Topic :: Software Development
|
|
|
27
27
|
Classifier: Topic :: Utilities
|
|
28
28
|
Requires-Python: >=3.11
|
|
29
29
|
Requires-Dist: agent-client-protocol==0.12.0
|
|
30
|
+
Requires-Dist: aiogram==3.30.0
|
|
30
31
|
Requires-Dist: anthropic==0.101.0
|
|
31
32
|
Requires-Dist: atif==1.7.0
|
|
32
33
|
Requires-Dist: beautifulsoup4==4.14.3
|
|
@@ -33,7 +33,7 @@ class CompactionResult:
|
|
|
33
33
|
message: str = ""
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
def
|
|
36
|
+
def render_transcript(messages: List[Message]) -> str:
|
|
37
37
|
"""Role-tagged plain text: JSON only for tool arguments, tool results raw.
|
|
38
38
|
|
|
39
39
|
JSON-escaping newline-heavy tool output costs ~30% more tokens than
|
|
@@ -250,13 +250,13 @@ class HistoryCompressor:
|
|
|
250
250
|
omitted = tail_start - head_end
|
|
251
251
|
if omitted:
|
|
252
252
|
parts = [
|
|
253
|
-
|
|
253
|
+
render_transcript(prefix[:head_end]),
|
|
254
254
|
_omission_notice(omitted),
|
|
255
|
-
|
|
255
|
+
render_transcript(prefix[tail_start:]),
|
|
256
256
|
]
|
|
257
257
|
transcript = "\n\n".join(part for part in parts if part)
|
|
258
258
|
else:
|
|
259
|
-
transcript =
|
|
259
|
+
transcript = render_transcript(prefix)
|
|
260
260
|
prompt = build_compression_summary_user_prompt(transcript, previous_summary=previous_summary)
|
|
261
261
|
return MessageHistory([Message(role="user", content=[TextBlock(text=prompt)])])
|
|
262
262
|
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""Handoff: summarize a session into a document that seeds a fresh session.
|
|
2
|
+
|
|
3
|
+
Mirrors the helper-request pattern of ``compression.py``: a one-shot streamed
|
|
4
|
+
LLM call that renders the session as a role-tagged transcript and asks for a
|
|
5
|
+
structured handoff document. The result is injected as the sole context of a
|
|
6
|
+
brand-new session, so the summary must stand alone.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import asyncio
|
|
12
|
+
import logging
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import Any, List, Optional, Union
|
|
15
|
+
|
|
16
|
+
from kolega_code.llm.ledger import helper_origin, llm_call_origin
|
|
17
|
+
from kolega_code.llm.models import Message, MessageHistory, TextBlock
|
|
18
|
+
|
|
19
|
+
from .compression import render_transcript
|
|
20
|
+
from .conversation import replace_image_blocks_with_placeholders
|
|
21
|
+
from .prompts import HANDOFF_SYSTEM_PROMPT, build_handoff_user_prompt
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class HandoffCancelledError(Exception):
|
|
27
|
+
"""Raised when the user cancels handoff document generation."""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class HandoffResult:
|
|
32
|
+
"""Outcome of a handoff document generation attempt.
|
|
33
|
+
|
|
34
|
+
``reason`` is a machine tag: "ok" | "too_few" | "empty_summary" | "llm_error".
|
|
35
|
+
Cancellation is not a result — it raises :class:`HandoffCancelledError`.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
ok: bool
|
|
39
|
+
reason: str
|
|
40
|
+
document: str = ""
|
|
41
|
+
message: str = ""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Don't summarize a session that has no real exchange to summarize.
|
|
45
|
+
HANDOFF_MIN_MESSAGES = 2
|
|
46
|
+
# Generous ceiling matching the compaction helper: reasoning models can consume
|
|
47
|
+
# most of the budget on chain-of-thought before emitting the document.
|
|
48
|
+
HANDOFF_MAX_TOKENS = 8192
|
|
49
|
+
# Completed-but-empty documents (reasoning-only, whitespace, no text) are
|
|
50
|
+
# retried on the same request before the attempt is reported unusable.
|
|
51
|
+
HANDOFF_EMPTY_ATTEMPTS = 3
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def build_handoff_context_text(document: str) -> str:
|
|
55
|
+
"""Wrap a handoff document for injection as a new session's opening context."""
|
|
56
|
+
return (
|
|
57
|
+
"<handoff-context>\n"
|
|
58
|
+
f"{document}\n"
|
|
59
|
+
"</handoff-context>\n\n"
|
|
60
|
+
"The above is a handoff document from a previous session. "
|
|
61
|
+
"Use this context to continue the work seamlessly."
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
async def _stream_document(
|
|
66
|
+
llm: Any,
|
|
67
|
+
messages: MessageHistory,
|
|
68
|
+
system: Message,
|
|
69
|
+
temperature: float,
|
|
70
|
+
model: str,
|
|
71
|
+
thinking: Optional[Union[int, str]],
|
|
72
|
+
cancel_event: asyncio.Event,
|
|
73
|
+
) -> Message:
|
|
74
|
+
"""Issue the handoff helper request and return the completed message.
|
|
75
|
+
|
|
76
|
+
Stream and consume events rather than calling ``generate()``: the Anthropic
|
|
77
|
+
SDK rejects non-streaming requests whose max_tokens is large enough to risk
|
|
78
|
+
a >10-minute response. Cancellation is cooperative — the stream is closed
|
|
79
|
+
and :class:`HandoffCancelledError` raised when the event fires.
|
|
80
|
+
"""
|
|
81
|
+
if cancel_event.is_set():
|
|
82
|
+
raise HandoffCancelledError()
|
|
83
|
+
with llm_call_origin(helper_origin("handoff")):
|
|
84
|
+
stream_cm = await llm.stream(
|
|
85
|
+
messages=messages,
|
|
86
|
+
system=system,
|
|
87
|
+
temperature=temperature,
|
|
88
|
+
model=model,
|
|
89
|
+
max_completion_tokens=HANDOFF_MAX_TOKENS,
|
|
90
|
+
thinking=thinking,
|
|
91
|
+
)
|
|
92
|
+
async with stream_cm as stream:
|
|
93
|
+
async for _event in stream:
|
|
94
|
+
if cancel_event.is_set():
|
|
95
|
+
break
|
|
96
|
+
if cancel_event.is_set():
|
|
97
|
+
raise HandoffCancelledError()
|
|
98
|
+
return await stream.get_final_message()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
async def generate_handoff_document(
|
|
102
|
+
messages: List[Message],
|
|
103
|
+
*,
|
|
104
|
+
llm: Any,
|
|
105
|
+
model: str,
|
|
106
|
+
temperature: float,
|
|
107
|
+
thinking: Optional[Union[int, str]],
|
|
108
|
+
focus: Optional[str] = None,
|
|
109
|
+
cancel_event: Optional[asyncio.Event] = None,
|
|
110
|
+
) -> HandoffResult:
|
|
111
|
+
"""Summarize ``messages`` into a handoff document via a one-shot LLM call.
|
|
112
|
+
|
|
113
|
+
Images are replaced with placeholders (base64 must stay out of the
|
|
114
|
+
transcript); tool calls render as JSON arguments and tool results raw,
|
|
115
|
+
exactly like compaction's transcript. Raises :class:`HandoffCancelledError`
|
|
116
|
+
when ``cancel_event`` fires before a document is produced; otherwise never
|
|
117
|
+
raises — failures come back as ``HandoffResult(ok=False, ...)``.
|
|
118
|
+
"""
|
|
119
|
+
if len(messages) < HANDOFF_MIN_MESSAGES:
|
|
120
|
+
return HandoffResult(
|
|
121
|
+
ok=False,
|
|
122
|
+
reason="too_few",
|
|
123
|
+
message=(f"Nothing to hand off ({len(messages)} message(s); need at least {HANDOFF_MIN_MESSAGES})."),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if cancel_event is None:
|
|
127
|
+
cancel_event = asyncio.Event()
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
stripped = replace_image_blocks_with_placeholders(list(messages), model)
|
|
131
|
+
prompt = build_handoff_user_prompt(render_transcript(stripped), focus=focus)
|
|
132
|
+
request_messages = MessageHistory([Message(role="user", content=[TextBlock(text=prompt)])])
|
|
133
|
+
system_message = Message(role="system", content=[TextBlock(text=HANDOFF_SYSTEM_PROMPT)])
|
|
134
|
+
|
|
135
|
+
response = await _stream_document(
|
|
136
|
+
llm, request_messages, system_message, temperature, model, thinking, cancel_event
|
|
137
|
+
)
|
|
138
|
+
for attempt in range(1, HANDOFF_EMPTY_ATTEMPTS + 1):
|
|
139
|
+
document = response.get_text_content()
|
|
140
|
+
if document and document.strip():
|
|
141
|
+
return HandoffResult(ok=True, reason="ok", document=document.strip())
|
|
142
|
+
stop = getattr(response, "stop_reason", None)
|
|
143
|
+
stop_note = f" (stop_reason={stop})" if stop else ""
|
|
144
|
+
if attempt >= HANDOFF_EMPTY_ATTEMPTS:
|
|
145
|
+
break
|
|
146
|
+
logger.info(
|
|
147
|
+
"Handoff generation produced an empty document%s; retrying (%d/%d).",
|
|
148
|
+
stop_note,
|
|
149
|
+
attempt + 1,
|
|
150
|
+
HANDOFF_EMPTY_ATTEMPTS,
|
|
151
|
+
)
|
|
152
|
+
response = await _stream_document(
|
|
153
|
+
llm, request_messages, system_message, temperature, model, thinking, cancel_event
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
message = "Handoff generation produced an empty document; session left unchanged."
|
|
157
|
+
logger.error(message)
|
|
158
|
+
return HandoffResult(ok=False, reason="empty_summary", message=message)
|
|
159
|
+
except HandoffCancelledError:
|
|
160
|
+
raise
|
|
161
|
+
except Exception as exc:
|
|
162
|
+
logger.exception("Failed to generate handoff document")
|
|
163
|
+
return HandoffResult(
|
|
164
|
+
ok=False,
|
|
165
|
+
reason="llm_error",
|
|
166
|
+
message=f"Failed to generate handoff document: {type(exc).__name__}: {exc}",
|
|
167
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
You are handing off an in-progress coding session to a fresh session that has NO access to this conversation. Write a handoff document that lets the new session continue seamlessly.
|
|
2
|
+
|
|
3
|
+
Hard rules:
|
|
4
|
+
- Output ONLY the handoff document. No preamble, no commentary, no wrapper text.
|
|
5
|
+
- Capture exact technical state, not abstractions: file paths, symbol names, commands run, test results, observed failures, decisions made, and partial work affecting the next step.
|
|
6
|
+
- Quote identifiers EXACTLY: file paths, function/class names, variable names, error strings, commands, and config keys. Do not paraphrase code or paths.
|
|
7
|
+
- Do not invent facts. If something is unknown or unfinished, say so briefly.
|
|
8
|
+
- Preserve any `<skill_content name="...">` instructions referenced earlier — note them by name so they are not lost.
|
|
9
|
+
- Be thorough: completeness matters more than brevity here, because the new session cannot look anything up in this conversation.
|
|
10
|
+
|
|
11
|
+
Use exactly this structure:
|
|
12
|
+
|
|
13
|
+
## Goal
|
|
14
|
+
What the user is trying to accomplish
|
|
15
|
+
|
|
16
|
+
## Constraints & Preferences
|
|
17
|
+
- Any constraints, preferences, or requirements mentioned
|
|
18
|
+
|
|
19
|
+
## Progress
|
|
20
|
+
### Done
|
|
21
|
+
- [x] Completed tasks with specifics
|
|
22
|
+
|
|
23
|
+
### In Progress
|
|
24
|
+
- [ ] Current work, if any
|
|
25
|
+
|
|
26
|
+
### Pending
|
|
27
|
+
- [ ] Tasks mentioned but not started
|
|
28
|
+
|
|
29
|
+
## Key Decisions
|
|
30
|
+
- **Decision**: rationale
|
|
31
|
+
|
|
32
|
+
## Critical Context
|
|
33
|
+
- Code snippets, file paths, function/type names, error messages, and data essential to continue
|
|
34
|
+
- Repository state if relevant
|
|
35
|
+
|
|
36
|
+
## Next Steps
|
|
37
|
+
1. What should happen next
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Write a handoff document for the following coding session so the work can continue seamlessly in a new session that has no access to this conversation.
|
|
2
|
+
|
|
3
|
+
<conversation_history>
|
|
4
|
+
{{ transcript }}
|
|
5
|
+
</conversation_history>
|
|
6
|
+
|
|
7
|
+
Each transcript entry is tagged with its role; tool calls show their JSON arguments and tool results follow raw.
|
|
8
|
+
{% if focus %}
|
|
9
|
+
Additional focus: {{ focus }}
|
|
10
|
+
{% endif %}
|
|
11
|
+
Produce the handoff document exactly as specified in your instructions. Handoff document only — do not call tools.
|
|
@@ -38,6 +38,7 @@ def render_prompt_template(template_name: str, **variables: Any) -> str:
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
COMPRESSION_SUMMARY_SYSTEM_PROMPT = render_prompt_template("auxiliary/compression/summary.system.md")
|
|
41
|
+
HANDOFF_SYSTEM_PROMPT = render_prompt_template("auxiliary/handoff/document.system.md")
|
|
41
42
|
SHELL_SAFETY_SYSTEM_PROMPT = render_prompt_template("auxiliary/terminal/safety.system.md")
|
|
42
43
|
SHELL_COMPRESSION_SYSTEM_PROMPT = render_prompt_template("auxiliary/terminal/output_summary.system.md")
|
|
43
44
|
SHARED_TASK_LIST_PROMPT = render_prompt_template("extensions/cli/shared_task_list.md")
|
|
@@ -71,6 +72,14 @@ def build_compression_summary_user_prompt(history: str, previous_summary: Option
|
|
|
71
72
|
)
|
|
72
73
|
|
|
73
74
|
|
|
75
|
+
def build_handoff_user_prompt(transcript: str, focus: Optional[str] = None) -> str:
|
|
76
|
+
return render_prompt_template(
|
|
77
|
+
"auxiliary/handoff/document.user.md.j2",
|
|
78
|
+
transcript=transcript,
|
|
79
|
+
focus=focus,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
74
83
|
def build_silent_turn_nudge(attempt: int) -> str:
|
|
75
84
|
"""Escalating reminder injected when the model ends a turn with no tool call and no visible text."""
|
|
76
85
|
return render_prompt_template("auxiliary/agent_loop/silent_turn_nudge.user.md.j2", attempt=attempt)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""Generate descriptive session title and description via the active LLM."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
import re
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Any, List, Optional, Sequence
|
|
11
|
+
|
|
12
|
+
from kolega_code.gateway.redaction import scrub
|
|
13
|
+
from kolega_code.llm.ledger import helper_origin, llm_call_origin
|
|
14
|
+
from kolega_code.llm.models import Message, MessageHistory, TextBlock
|
|
15
|
+
|
|
16
|
+
from .compression import render_transcript
|
|
17
|
+
from .conversation import replace_image_blocks_with_placeholders
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
SESSION_METADATA_MIN_MESSAGES = 2
|
|
22
|
+
SESSION_METADATA_MAX_TOKENS = 256
|
|
23
|
+
SESSION_METADATA_HEAD_CHARS = 2000
|
|
24
|
+
SESSION_METADATA_TAIL_CHARS = 6000
|
|
25
|
+
|
|
26
|
+
TITLE_MAX_CHARS = 60
|
|
27
|
+
DESCRIPTION_MAX_CHARS = 200
|
|
28
|
+
|
|
29
|
+
SESSION_METADATA_SYSTEM_PROMPT = """\
|
|
30
|
+
You are an assistant that summarizes developer coding sessions.
|
|
31
|
+
Analyze the provided conversation transcript and generate:
|
|
32
|
+
1. title: A concise, descriptive title in Natural Title Case (e.g. "Fix Authentication Middleware", "Add PostgreSQL Connection Pool", "Investigate Bug 662"). Maximum 60 characters. No surrounding quotes or Markdown formatting.
|
|
33
|
+
2. description: A clear 1 to 2 sentence summary of what the session is working on, goals, and key progress or findings so far. Maximum 200 characters.
|
|
34
|
+
|
|
35
|
+
Respond ONLY with valid JSON in this exact structure:
|
|
36
|
+
{
|
|
37
|
+
"title": "Natural Title Case Title",
|
|
38
|
+
"description": "One or two sentences describing the session."
|
|
39
|
+
}
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class SessionMetadata:
|
|
45
|
+
"""The generated descriptive metadata for a session."""
|
|
46
|
+
|
|
47
|
+
title: str
|
|
48
|
+
description: str
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SessionMetadataCancelledError(Exception):
|
|
52
|
+
"""Raised when metadata generation is cancelled."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _truncate_transcript(transcript: str) -> str:
|
|
56
|
+
"""Bound the transcript sent to the metadata generator."""
|
|
57
|
+
total_budget = SESSION_METADATA_HEAD_CHARS + SESSION_METADATA_TAIL_CHARS
|
|
58
|
+
if len(transcript) <= total_budget:
|
|
59
|
+
return transcript
|
|
60
|
+
head = transcript[:SESSION_METADATA_HEAD_CHARS]
|
|
61
|
+
tail = transcript[-SESSION_METADATA_TAIL_CHARS:]
|
|
62
|
+
return f"{head}\n\n[... middle conversation omitted ...]\n\n{tail}"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def parse_session_metadata_json(raw_text: str) -> Optional[SessionMetadata]:
|
|
66
|
+
"""Parse and sanitize the JSON returned by the model."""
|
|
67
|
+
text = raw_text.strip()
|
|
68
|
+
if not text:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
# Strip code fences if present
|
|
72
|
+
fence_match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text)
|
|
73
|
+
if fence_match:
|
|
74
|
+
text = fence_match.group(1).strip()
|
|
75
|
+
|
|
76
|
+
data: Optional[dict[str, Any]] = None
|
|
77
|
+
try:
|
|
78
|
+
parsed = json.loads(text)
|
|
79
|
+
if isinstance(parsed, dict):
|
|
80
|
+
data = parsed
|
|
81
|
+
except Exception:
|
|
82
|
+
# Fallback regex extraction for title and description
|
|
83
|
+
title_match = re.search(r'"title"\s*:\s*"([^"]+)"', text)
|
|
84
|
+
desc_match = re.search(r'"description"\s*:\s*"([^"]+)"', text)
|
|
85
|
+
if title_match:
|
|
86
|
+
data = {
|
|
87
|
+
"title": title_match.group(1),
|
|
88
|
+
"description": desc_match.group(1) if desc_match else "",
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if not data or not isinstance(data.get("title"), str):
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
raw_title = data["title"].strip().strip("\"'")
|
|
95
|
+
# Clean control characters and normalize spaces
|
|
96
|
+
cleaned_title = " ".join(raw_title.split())
|
|
97
|
+
if not cleaned_title:
|
|
98
|
+
return None
|
|
99
|
+
|
|
100
|
+
if len(cleaned_title) > TITLE_MAX_CHARS:
|
|
101
|
+
cleaned_title = cleaned_title[:TITLE_MAX_CHARS].rstrip()
|
|
102
|
+
|
|
103
|
+
raw_description = str(data.get("description") or "").strip()
|
|
104
|
+
cleaned_description = " ".join(raw_description.split())
|
|
105
|
+
if len(cleaned_description) > DESCRIPTION_MAX_CHARS:
|
|
106
|
+
cleaned_description = cleaned_description[:DESCRIPTION_MAX_CHARS].rstrip()
|
|
107
|
+
|
|
108
|
+
return SessionMetadata(title=cleaned_title, description=cleaned_description)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
async def generate_session_metadata(
|
|
112
|
+
messages: List[Message],
|
|
113
|
+
*,
|
|
114
|
+
llm: Any,
|
|
115
|
+
model: str,
|
|
116
|
+
temperature: float = 0.2,
|
|
117
|
+
cancel_event: Optional[asyncio.Event] = None,
|
|
118
|
+
secret_values: Sequence[str] = (),
|
|
119
|
+
) -> Optional[SessionMetadata]:
|
|
120
|
+
"""Summarize ``messages`` into a title and description via the active LLM.
|
|
121
|
+
|
|
122
|
+
Returns ``None`` if generation fails or is cancelled. Never raises.
|
|
123
|
+
"""
|
|
124
|
+
if len(messages) < SESSION_METADATA_MIN_MESSAGES:
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
if cancel_event is None:
|
|
128
|
+
cancel_event = asyncio.Event()
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
stripped = replace_image_blocks_with_placeholders(list(messages), model)
|
|
132
|
+
transcript = render_transcript(stripped)
|
|
133
|
+
bounded_transcript = _truncate_transcript(transcript)
|
|
134
|
+
scrubbed_transcript = scrub(bounded_transcript, secret_values)
|
|
135
|
+
|
|
136
|
+
user_content = f"Conversation transcript:\n\n{scrubbed_transcript}"
|
|
137
|
+
request_messages = MessageHistory([Message(role="user", content=[TextBlock(text=user_content)])])
|
|
138
|
+
system_message = Message(role="system", content=[TextBlock(text=SESSION_METADATA_SYSTEM_PROMPT)])
|
|
139
|
+
|
|
140
|
+
if cancel_event.is_set():
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
with llm_call_origin(helper_origin("session_metadata")):
|
|
144
|
+
stream_cm = await llm.stream(
|
|
145
|
+
messages=request_messages,
|
|
146
|
+
system=system_message,
|
|
147
|
+
temperature=temperature,
|
|
148
|
+
model=model,
|
|
149
|
+
max_completion_tokens=SESSION_METADATA_MAX_TOKENS,
|
|
150
|
+
thinking=None,
|
|
151
|
+
)
|
|
152
|
+
async with stream_cm as stream:
|
|
153
|
+
async for _event in stream:
|
|
154
|
+
if cancel_event.is_set():
|
|
155
|
+
return None
|
|
156
|
+
|
|
157
|
+
if cancel_event.is_set():
|
|
158
|
+
return None
|
|
159
|
+
|
|
160
|
+
response = await stream.get_final_message()
|
|
161
|
+
raw_output = response.get_text_content()
|
|
162
|
+
return parse_session_metadata_json(raw_output)
|
|
163
|
+
except Exception as exc:
|
|
164
|
+
logger.warning("Failed to generate session metadata: %s", exc)
|
|
165
|
+
return None
|