kolega-code 0.28.3__tar.gz → 0.28.4__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.28.3 → kolega_code-0.28.4}/CHANGELOG.md +8 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/PKG-INFO +1 -1
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/__init__.py +1 -1
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/baseagent.py +1 -0
- kolega_code-0.28.4/kolega_code/agent/compression.py +324 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/conversation.py +5 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +1 -1
- {kolega_code-0.28.3 → kolega_code-0.28.4}/pyproject.toml +1 -1
- kolega_code-0.28.3/kolega_code/agent/compression.py +0 -166
- {kolega_code-0.28.3 → kolega_code-0.28.4}/.gitignore +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/CONTRIBUTING.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/MIGRATION.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/README.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/RELEASING.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/network_status.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_definitions.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/volatile_context.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/framing.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/installer.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/manager.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/multiplex.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/native_host.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/protocol.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/registry.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/runtime.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/ask_output.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/atif_export.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/browser_backend.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/config.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/main.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/messages.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/model_catalog.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/provider_registry.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_event_protocol.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_usage.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/agent_runtime.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/command_handlers.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/custom_model.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/pacing.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/settings_panel.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/settings_screen.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/config.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/events.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/extensions.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/git_env.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/client.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/ledger.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/_token_encoding.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/deepseek_responses.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/tinker.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/tinker_trace.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/tinker.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/tinker_catalog.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/validation.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/usage.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/local_state.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/permissions.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/runtime.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/base.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/html.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/control.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/store.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/param_aliases.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/utils/images.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/server.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/worktrees.py +0 -0
|
@@ -6,6 +6,14 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.28.4 - 2026-08-12
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Conversation compaction now keeps the summarization request within the run's
|
|
14
|
+
input token budget, so auto-compaction no longer fails on long conversations
|
|
15
|
+
and lets the run continue instead of aborting.
|
|
16
|
+
|
|
9
17
|
## 0.28.3 - 2026-08-12
|
|
10
18
|
|
|
11
19
|
### Changed
|
|
@@ -1208,6 +1208,7 @@ class BaseAgent(LogMixin):
|
|
|
1208
1208
|
on_error=on_error,
|
|
1209
1209
|
system_prompt_text=compaction_system_prompt,
|
|
1210
1210
|
keep_recent=keep_recent,
|
|
1211
|
+
max_input_tokens=self.model_max_input_tokens,
|
|
1211
1212
|
)
|
|
1212
1213
|
if result.ok:
|
|
1213
1214
|
# Compaction summarizes the injected volatile-context blocks along with
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"""History compression: summarize a conversation when it outgrows the context window."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Awaitable, Callable, List, Optional
|
|
7
|
+
|
|
8
|
+
from .conversation import Conversation, replace_image_blocks_with_placeholders
|
|
9
|
+
from kolega_code.llm.exceptions import LLMContextWindowExceededError
|
|
10
|
+
from kolega_code.llm.ledger import helper_origin, llm_call_origin
|
|
11
|
+
from kolega_code.llm.models import Message, MessageHistory, TextBlock, ToolCall, ToolResult
|
|
12
|
+
from .prompts import (
|
|
13
|
+
build_compression_summary_user_prompt,
|
|
14
|
+
COMPRESSION_SUMMARY_SYSTEM_PROMPT,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
LogCallback = Callable[[str], Awaitable[None]]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class CompactionResult:
|
|
24
|
+
"""Outcome of a compaction attempt, surfaced to callers and the UI.
|
|
25
|
+
|
|
26
|
+
``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "llm_error".
|
|
27
|
+
``message`` is a human-readable line for the command output / logs.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
ok: bool
|
|
31
|
+
reason: str
|
|
32
|
+
summarized_messages: int = 0
|
|
33
|
+
message: str = ""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _render_transcript(messages: List[Message]) -> str:
|
|
37
|
+
"""Role-tagged plain text: JSON only for tool arguments, tool results raw.
|
|
38
|
+
|
|
39
|
+
JSON-escaping newline-heavy tool output costs ~30% more tokens than
|
|
40
|
+
leaving it raw.
|
|
41
|
+
"""
|
|
42
|
+
out: List[str] = []
|
|
43
|
+
for message in messages:
|
|
44
|
+
if isinstance(message.content, str):
|
|
45
|
+
if message.content:
|
|
46
|
+
out.append(f"[{message.role}]\n{message.content}")
|
|
47
|
+
continue
|
|
48
|
+
for block in message.content:
|
|
49
|
+
if isinstance(block, ToolCall):
|
|
50
|
+
try:
|
|
51
|
+
args = json.dumps(block.input, ensure_ascii=False)
|
|
52
|
+
except (TypeError, ValueError):
|
|
53
|
+
args = str(block.input)
|
|
54
|
+
out.append(f"[assistant → {block.name}] {args}")
|
|
55
|
+
elif isinstance(block, ToolResult):
|
|
56
|
+
if isinstance(block.content, str):
|
|
57
|
+
body = block.content
|
|
58
|
+
else:
|
|
59
|
+
body = "\n".join(getattr(item, "text", "") or "" for item in block.content)
|
|
60
|
+
tag = "error" if block.is_error else "result"
|
|
61
|
+
out.append(f"[{block.name} {tag}]\n{body}")
|
|
62
|
+
else:
|
|
63
|
+
text = getattr(block, "text", None)
|
|
64
|
+
thinking = getattr(block, "thinking", None)
|
|
65
|
+
if text:
|
|
66
|
+
out.append(f"[{message.role}]\n{text}")
|
|
67
|
+
elif thinking:
|
|
68
|
+
out.append(f"[{message.role} thinking]\n{thinking}")
|
|
69
|
+
return "\n\n".join(out)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _omission_notice(omitted: int) -> str:
|
|
73
|
+
return f"[... {omitted} conversation message(s) omitted here so the compaction request fits the context budget ...]"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _approx_message_chars(message: Message) -> int:
|
|
77
|
+
"""Size proxy for picking the omission gap; the request is re-counted before dispatch."""
|
|
78
|
+
if isinstance(message.content, str):
|
|
79
|
+
return len(message.content)
|
|
80
|
+
chars = 0
|
|
81
|
+
for block in message.content:
|
|
82
|
+
if isinstance(block, ToolCall):
|
|
83
|
+
try:
|
|
84
|
+
chars += len(json.dumps(block.input))
|
|
85
|
+
except (TypeError, ValueError):
|
|
86
|
+
chars += len(str(block.input))
|
|
87
|
+
elif isinstance(block, ToolResult):
|
|
88
|
+
if isinstance(block.content, str):
|
|
89
|
+
chars += len(block.content)
|
|
90
|
+
else:
|
|
91
|
+
chars += sum(len(getattr(item, "text", "") or "") for item in block.content)
|
|
92
|
+
else:
|
|
93
|
+
chars += len(getattr(block, "text", "") or "") + len(getattr(block, "thinking", "") or "")
|
|
94
|
+
return chars
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _middle_gap(weights: List[int], target_chars: float) -> tuple[int, int]:
|
|
98
|
+
"""Pick the (head_end, tail_start) gap keeping ~``target_chars``: half from the
|
|
99
|
+
oldest messages (task statement), half from the newest (continuity)."""
|
|
100
|
+
half = target_chars / 2
|
|
101
|
+
head_end, acc = 0, 0
|
|
102
|
+
for index, weight in enumerate(weights):
|
|
103
|
+
if acc + weight > half:
|
|
104
|
+
break
|
|
105
|
+
acc += weight
|
|
106
|
+
head_end = index + 1
|
|
107
|
+
tail_start, acc = len(weights), 0
|
|
108
|
+
for index in range(len(weights) - 1, head_end - 1, -1):
|
|
109
|
+
if acc + weights[index] > half:
|
|
110
|
+
break
|
|
111
|
+
acc += weights[index]
|
|
112
|
+
tail_start = index
|
|
113
|
+
return head_end, tail_start
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _bundles_tool_results(message: Message) -> bool:
|
|
117
|
+
return isinstance(message.content, list) and any(isinstance(block, ToolResult) for block in message.content)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class HistoryCompressor:
|
|
121
|
+
"""Summarizes a conversation non-destructively when it crosses the budget threshold."""
|
|
122
|
+
|
|
123
|
+
MIN_MESSAGES_TO_COMPRESS = 5
|
|
124
|
+
# How many of the most recent messages to keep verbatim after the summary.
|
|
125
|
+
KEEP_RECENT_MESSAGES = 6
|
|
126
|
+
# Don't bother summarizing a trivially short prefix.
|
|
127
|
+
MIN_PREFIX_TO_SUMMARIZE = 3
|
|
128
|
+
# Cap the summary length. The prompt targets ~600 words, but reasoning
|
|
129
|
+
# models (deepseek-v4-flash Responses, etc.) can consume the entire budget
|
|
130
|
+
# on chain-of-thought and leave no room for text output, producing an empty
|
|
131
|
+
# summary. A generous ceiling gives reasoning headroom while still staying
|
|
132
|
+
# well under the model's full completion budget.
|
|
133
|
+
SUMMARY_MAX_TOKENS = 8192
|
|
134
|
+
# Attempts at widening the omission gap per budget rung.
|
|
135
|
+
MAX_FIT_ATTEMPTS = 6
|
|
136
|
+
|
|
137
|
+
def __init__(self, threshold: float = 0.8) -> None:
|
|
138
|
+
# Fraction of the model context window above which compression kicks in
|
|
139
|
+
self.threshold = threshold
|
|
140
|
+
|
|
141
|
+
def over_budget(self, input_tokens: int, input_budget_tokens: int) -> bool:
|
|
142
|
+
"""True when input exceeds the threshold fraction of the input budget."""
|
|
143
|
+
return input_tokens > input_budget_tokens * self.threshold
|
|
144
|
+
|
|
145
|
+
async def summarize(
|
|
146
|
+
self,
|
|
147
|
+
conversation: Conversation,
|
|
148
|
+
*,
|
|
149
|
+
llm,
|
|
150
|
+
model: str,
|
|
151
|
+
temperature: float,
|
|
152
|
+
thinking,
|
|
153
|
+
on_info: Optional[LogCallback] = None,
|
|
154
|
+
on_error: Optional[LogCallback] = None,
|
|
155
|
+
system_prompt_text: Optional[str] = None,
|
|
156
|
+
keep_recent: Optional[int] = None,
|
|
157
|
+
max_input_tokens: Optional[int] = None,
|
|
158
|
+
) -> CompactionResult:
|
|
159
|
+
"""
|
|
160
|
+
Non-destructively summarize the aged-out prefix while keeping the most
|
|
161
|
+
recent turns verbatim, and move the compaction boundary.
|
|
162
|
+
|
|
163
|
+
Incremental: only the messages that have aged out since the previous
|
|
164
|
+
boundary are summarized, with the prior summary folded in for continuity.
|
|
165
|
+
The aged-out span is presented to the summarizer as a role-tagged
|
|
166
|
+
plain-text transcript (tool arguments as JSON, tool results raw).
|
|
167
|
+
Returns a CompactionResult describing what happened — never a silent no-op.
|
|
168
|
+
|
|
169
|
+
``keep_recent`` overrides KEEP_RECENT_MESSAGES (the verbatim tail). A
|
|
170
|
+
literal ``0`` is the aggressive fallback: everything before the safe
|
|
171
|
+
boundary — potentially including recent user content — becomes eligible
|
|
172
|
+
for lossy summarization. The raw history is never modified, and the
|
|
173
|
+
safe-boundary snap still keeps tool_use/tool_result pairs together.
|
|
174
|
+
|
|
175
|
+
``max_input_tokens`` bounds the summarization request itself: while the
|
|
176
|
+
rendered request exceeds it, whole messages are dropped from the middle
|
|
177
|
+
of the span (never splitting a tool exchange) and an omission notice is
|
|
178
|
+
left in the gap. Dispatch walks a descending budget ladder (100%, 90%,
|
|
179
|
+
80%, ... of the bound): if the enforcing side rejects a request the
|
|
180
|
+
counter accepted, the next rung re-widens the gap and retries until a
|
|
181
|
+
request is accepted. An unbounded request would be rejected before
|
|
182
|
+
dispatch and read as ``llm_error``, permanently disabling
|
|
183
|
+
auto-compaction.
|
|
184
|
+
"""
|
|
185
|
+
history = conversation.history
|
|
186
|
+
if not history or len(history) < self.MIN_MESSAGES_TO_COMPRESS:
|
|
187
|
+
return CompactionResult(
|
|
188
|
+
ok=False,
|
|
189
|
+
reason="too_few",
|
|
190
|
+
message=(
|
|
191
|
+
f"Nothing to compress yet ({len(history)} message(s); "
|
|
192
|
+
f"need at least {self.MIN_MESSAGES_TO_COMPRESS})."
|
|
193
|
+
),
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
if keep_recent is None:
|
|
197
|
+
keep_recent = self.KEEP_RECENT_MESSAGES
|
|
198
|
+
split = conversation.compaction_split_point(keep_recent=keep_recent, min_prefix=self.MIN_PREFIX_TO_SUMMARIZE)
|
|
199
|
+
prior_through = conversation.compacted_through if conversation.summary is not None else 0
|
|
200
|
+
if split is None or split <= prior_through:
|
|
201
|
+
return CompactionResult(
|
|
202
|
+
ok=False,
|
|
203
|
+
reason="nothing_to_summarize",
|
|
204
|
+
message="Already compact — no older messages to summarize.",
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
if on_info:
|
|
208
|
+
await on_info("Compressing message history...")
|
|
209
|
+
|
|
210
|
+
try:
|
|
211
|
+
# A summary needs no pixels, and base64 must stay out of the transcript.
|
|
212
|
+
prefix = replace_image_blocks_with_placeholders(list(history[prior_through:split]), model)
|
|
213
|
+
previous_summary = conversation.summary.get_text_content() if conversation.summary is not None else None
|
|
214
|
+
|
|
215
|
+
def build_request(head_end: int, tail_start: int) -> MessageHistory:
|
|
216
|
+
omitted = tail_start - head_end
|
|
217
|
+
if omitted:
|
|
218
|
+
parts = [
|
|
219
|
+
_render_transcript(prefix[:head_end]),
|
|
220
|
+
_omission_notice(omitted),
|
|
221
|
+
_render_transcript(prefix[tail_start:]),
|
|
222
|
+
]
|
|
223
|
+
transcript = "\n\n".join(part for part in parts if part)
|
|
224
|
+
else:
|
|
225
|
+
transcript = _render_transcript(prefix)
|
|
226
|
+
prompt = build_compression_summary_user_prompt(transcript, previous_summary=previous_summary)
|
|
227
|
+
return MessageHistory([Message(role="user", content=[TextBlock(text=prompt)])])
|
|
228
|
+
|
|
229
|
+
head_end, tail_start = len(prefix), len(prefix)
|
|
230
|
+
messages = build_request(head_end, tail_start)
|
|
231
|
+
system_text = system_prompt_text or COMPRESSION_SUMMARY_SYSTEM_PROMPT
|
|
232
|
+
system_message = Message(role="system", content=[TextBlock(text=system_text)])
|
|
233
|
+
weights = [_approx_message_chars(message) for message in prefix]
|
|
234
|
+
|
|
235
|
+
async def widen_gap_until_fits(budget: int) -> None:
|
|
236
|
+
nonlocal head_end, tail_start, messages
|
|
237
|
+
for _ in range(self.MAX_FIT_ATTEMPTS):
|
|
238
|
+
counted = await llm.count_tokens(
|
|
239
|
+
messages=messages, system=system_message, model=model, thinking=thinking
|
|
240
|
+
)
|
|
241
|
+
if counted.input_tokens <= budget:
|
|
242
|
+
return
|
|
243
|
+
kept_chars = sum(weights[:head_end]) + sum(weights[tail_start:])
|
|
244
|
+
target_chars = kept_chars * budget / counted.input_tokens * 0.9
|
|
245
|
+
new_head, new_tail = _middle_gap(weights, target_chars)
|
|
246
|
+
# Keep tool exchanges whole on both edges of the gap.
|
|
247
|
+
new_head = conversation.snap_split_point(prior_through + new_head) - prior_through
|
|
248
|
+
while new_head < new_tail < len(prefix) and _bundles_tool_results(prefix[new_tail]):
|
|
249
|
+
new_tail += 1
|
|
250
|
+
if (new_head, new_tail) == (head_end, tail_start):
|
|
251
|
+
# Stalled (fixed prompt parts dominate): let the budget
|
|
252
|
+
# check or provider give the definitive answer.
|
|
253
|
+
return
|
|
254
|
+
head_end, tail_start = new_head, new_tail
|
|
255
|
+
messages = build_request(head_end, tail_start)
|
|
256
|
+
|
|
257
|
+
# Stream and drain rather than calling generate(): the Anthropic SDK
|
|
258
|
+
# rejects non-streaming requests whose max_tokens is large enough to risk
|
|
259
|
+
# a >10-minute response, which the model's full completion budget triggers.
|
|
260
|
+
#
|
|
261
|
+
# The helper origin spans the whole request: providers may sample and
|
|
262
|
+
# emit their trace record at context entry or final-message time, not
|
|
263
|
+
# at stream().
|
|
264
|
+
response = None
|
|
265
|
+
last_error: Optional[LLMContextWindowExceededError] = None
|
|
266
|
+
dispatched_gap: Optional[tuple[int, int]] = None
|
|
267
|
+
rungs = range(10, 0, -1) if max_input_tokens is not None else range(1)
|
|
268
|
+
for tenths in rungs:
|
|
269
|
+
if max_input_tokens is not None:
|
|
270
|
+
await widen_gap_until_fits(max_input_tokens * tenths // 10)
|
|
271
|
+
if dispatched_gap == (head_end, tail_start):
|
|
272
|
+
# This rung could not shrink the request any further;
|
|
273
|
+
# re-sending it would only be rejected again.
|
|
274
|
+
continue
|
|
275
|
+
try:
|
|
276
|
+
with llm_call_origin(helper_origin("compression")):
|
|
277
|
+
stream_cm = await llm.stream(
|
|
278
|
+
messages=messages,
|
|
279
|
+
system=system_message,
|
|
280
|
+
temperature=temperature,
|
|
281
|
+
model=model,
|
|
282
|
+
max_completion_tokens=self.SUMMARY_MAX_TOKENS,
|
|
283
|
+
thinking=thinking,
|
|
284
|
+
)
|
|
285
|
+
async with stream_cm as stream:
|
|
286
|
+
async for _event in stream:
|
|
287
|
+
pass
|
|
288
|
+
response = await stream.get_final_message()
|
|
289
|
+
break
|
|
290
|
+
except LLMContextWindowExceededError as exc:
|
|
291
|
+
if max_input_tokens is None:
|
|
292
|
+
raise
|
|
293
|
+
dispatched_gap = (head_end, tail_start)
|
|
294
|
+
last_error = exc
|
|
295
|
+
if response is None:
|
|
296
|
+
# Every rung was rejected or would have re-sent an identical request.
|
|
297
|
+
assert last_error is not None
|
|
298
|
+
raise last_error
|
|
299
|
+
|
|
300
|
+
summary_text = response.get_text_content()
|
|
301
|
+
if not summary_text or not summary_text.strip():
|
|
302
|
+
msg = "Compression produced an empty summary; history left unchanged."
|
|
303
|
+
if on_error:
|
|
304
|
+
await on_error(msg)
|
|
305
|
+
else:
|
|
306
|
+
logger.error(msg)
|
|
307
|
+
return CompactionResult(ok=False, reason="llm_error", message=msg)
|
|
308
|
+
|
|
309
|
+
folded = split - prior_through
|
|
310
|
+
conversation.apply_compaction(summary_text, split)
|
|
311
|
+
|
|
312
|
+
done = f"Compressed {folded} older message(s) into a summary; kept the latest turns verbatim."
|
|
313
|
+
if on_info:
|
|
314
|
+
await on_info(done)
|
|
315
|
+
return CompactionResult(ok=True, reason="ok", summarized_messages=folded, message=done)
|
|
316
|
+
|
|
317
|
+
except Exception as e:
|
|
318
|
+
# Never swallow into a fake success: log the full traceback and surface
|
|
319
|
+
# the real error to the caller.
|
|
320
|
+
logger.exception("Failed to compress message history")
|
|
321
|
+
msg = f"Failed to compress message history: {type(e).__name__}: {e}"
|
|
322
|
+
if on_error:
|
|
323
|
+
await on_error(msg)
|
|
324
|
+
return CompactionResult(ok=False, reason="llm_error", message=msg)
|
|
@@ -1085,6 +1085,11 @@ class Conversation:
|
|
|
1085
1085
|
return None
|
|
1086
1086
|
return candidate
|
|
1087
1087
|
|
|
1088
|
+
def snap_split_point(self, idx: int) -> int:
|
|
1089
|
+
"""Clamp ``idx`` to history bounds and snap it backward so a tool_use/
|
|
1090
|
+
tool_result group is never split across a compaction boundary."""
|
|
1091
|
+
return self._snap_to_safe_boundary(max(0, min(idx, len(self._history))))
|
|
1092
|
+
|
|
1088
1093
|
def _snap_to_safe_boundary(self, idx: int) -> int:
|
|
1089
1094
|
"""Move ``idx`` backward past any assistant tool_use so a tool_use/tool_result
|
|
1090
1095
|
group is never split across the compaction boundary."""
|
|
@@ -14,4 +14,4 @@ Summarize the following coding session so far:
|
|
|
14
14
|
{{ history }}
|
|
15
15
|
</conversation_history>
|
|
16
16
|
|
|
17
|
-
Produce the continuity briefing exactly as specified in your instructions. Summary text only — do not call tools.
|
|
17
|
+
Each transcript entry is tagged with its role; tool calls show their JSON arguments and tool results follow raw. A bracketed line marks messages omitted for length. Produce the continuity briefing exactly as specified in your instructions. Summary text only — do not call tools.
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
"""History compression: summarize a conversation when it outgrows the context window."""
|
|
2
|
-
|
|
3
|
-
import logging
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
from typing import Awaitable, Callable, Optional
|
|
6
|
-
|
|
7
|
-
from .conversation import Conversation
|
|
8
|
-
from kolega_code.llm.ledger import helper_origin, llm_call_origin
|
|
9
|
-
from kolega_code.llm.models import Message, MessageHistory, TextBlock
|
|
10
|
-
from .prompts import (
|
|
11
|
-
build_compression_summary_user_prompt,
|
|
12
|
-
COMPRESSION_SUMMARY_SYSTEM_PROMPT,
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
LogCallback = Callable[[str], Awaitable[None]]
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass(frozen=True)
|
|
21
|
-
class CompactionResult:
|
|
22
|
-
"""Outcome of a compaction attempt, surfaced to callers and the UI.
|
|
23
|
-
|
|
24
|
-
``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "llm_error".
|
|
25
|
-
``message`` is a human-readable line for the command output / logs.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
ok: bool
|
|
29
|
-
reason: str
|
|
30
|
-
summarized_messages: int = 0
|
|
31
|
-
message: str = ""
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class HistoryCompressor:
|
|
35
|
-
"""Summarizes a conversation non-destructively when it crosses the budget threshold."""
|
|
36
|
-
|
|
37
|
-
MIN_MESSAGES_TO_COMPRESS = 5
|
|
38
|
-
# How many of the most recent messages to keep verbatim after the summary.
|
|
39
|
-
KEEP_RECENT_MESSAGES = 6
|
|
40
|
-
# Don't bother summarizing a trivially short prefix.
|
|
41
|
-
MIN_PREFIX_TO_SUMMARIZE = 3
|
|
42
|
-
# Cap the summary length. The prompt targets ~600 words, but reasoning
|
|
43
|
-
# models (deepseek-v4-flash Responses, etc.) can consume the entire budget
|
|
44
|
-
# on chain-of-thought and leave no room for text output, producing an empty
|
|
45
|
-
# summary. A generous ceiling gives reasoning headroom while still staying
|
|
46
|
-
# well under the model's full completion budget.
|
|
47
|
-
SUMMARY_MAX_TOKENS = 8192
|
|
48
|
-
|
|
49
|
-
def __init__(self, threshold: float = 0.8) -> None:
|
|
50
|
-
# Fraction of the model context window above which compression kicks in
|
|
51
|
-
self.threshold = threshold
|
|
52
|
-
|
|
53
|
-
def over_budget(self, input_tokens: int, input_budget_tokens: int) -> bool:
|
|
54
|
-
"""True when input exceeds the threshold fraction of the input budget."""
|
|
55
|
-
return input_tokens > input_budget_tokens * self.threshold
|
|
56
|
-
|
|
57
|
-
async def summarize(
|
|
58
|
-
self,
|
|
59
|
-
conversation: Conversation,
|
|
60
|
-
*,
|
|
61
|
-
llm,
|
|
62
|
-
model: str,
|
|
63
|
-
temperature: float,
|
|
64
|
-
thinking,
|
|
65
|
-
on_info: Optional[LogCallback] = None,
|
|
66
|
-
on_error: Optional[LogCallback] = None,
|
|
67
|
-
system_prompt_text: Optional[str] = None,
|
|
68
|
-
keep_recent: Optional[int] = None,
|
|
69
|
-
) -> CompactionResult:
|
|
70
|
-
"""
|
|
71
|
-
Non-destructively summarize the aged-out prefix while keeping the most
|
|
72
|
-
recent turns verbatim, and move the compaction boundary.
|
|
73
|
-
|
|
74
|
-
Incremental: only the messages that have aged out since the previous
|
|
75
|
-
boundary are summarized, with the prior summary folded in for continuity.
|
|
76
|
-
Returns a CompactionResult describing what happened — never a silent no-op.
|
|
77
|
-
|
|
78
|
-
``keep_recent`` overrides KEEP_RECENT_MESSAGES (the verbatim tail). A
|
|
79
|
-
literal ``0`` is the aggressive fallback: everything before the safe
|
|
80
|
-
boundary — potentially including recent user content — becomes eligible
|
|
81
|
-
for lossy summarization. The raw history is never modified, and the
|
|
82
|
-
safe-boundary snap still keeps tool_use/tool_result pairs together.
|
|
83
|
-
"""
|
|
84
|
-
history = conversation.history
|
|
85
|
-
if not history or len(history) < self.MIN_MESSAGES_TO_COMPRESS:
|
|
86
|
-
return CompactionResult(
|
|
87
|
-
ok=False,
|
|
88
|
-
reason="too_few",
|
|
89
|
-
message=(
|
|
90
|
-
f"Nothing to compress yet ({len(history)} message(s); "
|
|
91
|
-
f"need at least {self.MIN_MESSAGES_TO_COMPRESS})."
|
|
92
|
-
),
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
if keep_recent is None:
|
|
96
|
-
keep_recent = self.KEEP_RECENT_MESSAGES
|
|
97
|
-
split = conversation.compaction_split_point(keep_recent=keep_recent, min_prefix=self.MIN_PREFIX_TO_SUMMARIZE)
|
|
98
|
-
prior_through = conversation.compacted_through if conversation.summary is not None else 0
|
|
99
|
-
if split is None or split <= prior_through:
|
|
100
|
-
return CompactionResult(
|
|
101
|
-
ok=False,
|
|
102
|
-
reason="nothing_to_summarize",
|
|
103
|
-
message="Already compact — no older messages to summarize.",
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
if on_info:
|
|
107
|
-
await on_info("Compressing message history...")
|
|
108
|
-
|
|
109
|
-
try:
|
|
110
|
-
prefix = MessageHistory(list(history[prior_through:split]))
|
|
111
|
-
prefix_markdown = prefix.get_markdown_conversation()
|
|
112
|
-
previous_summary = conversation.summary.get_text_content() if conversation.summary is not None else None
|
|
113
|
-
user_prompt_filled = build_compression_summary_user_prompt(
|
|
114
|
-
prefix_markdown, previous_summary=previous_summary
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
messages = MessageHistory([Message(role="user", content=[TextBlock(text=user_prompt_filled)])])
|
|
118
|
-
system_text = system_prompt_text or COMPRESSION_SUMMARY_SYSTEM_PROMPT
|
|
119
|
-
system_message = Message(role="system", content=[TextBlock(text=system_text)])
|
|
120
|
-
|
|
121
|
-
# Stream and drain rather than calling generate(): the Anthropic SDK
|
|
122
|
-
# rejects non-streaming requests whose max_tokens is large enough to risk
|
|
123
|
-
# a >10-minute response, which the model's full completion budget triggers.
|
|
124
|
-
#
|
|
125
|
-
# The helper origin spans the whole request: providers may sample and
|
|
126
|
-
# emit their trace record at context entry or final-message time, not
|
|
127
|
-
# at stream().
|
|
128
|
-
with llm_call_origin(helper_origin("compression")):
|
|
129
|
-
stream_cm = await llm.stream(
|
|
130
|
-
messages=messages,
|
|
131
|
-
system=system_message,
|
|
132
|
-
temperature=temperature,
|
|
133
|
-
model=model,
|
|
134
|
-
max_completion_tokens=self.SUMMARY_MAX_TOKENS,
|
|
135
|
-
thinking=thinking,
|
|
136
|
-
)
|
|
137
|
-
async with stream_cm as stream:
|
|
138
|
-
async for _event in stream:
|
|
139
|
-
pass
|
|
140
|
-
response = await stream.get_final_message()
|
|
141
|
-
|
|
142
|
-
summary_text = response.get_text_content()
|
|
143
|
-
if not summary_text or not summary_text.strip():
|
|
144
|
-
msg = "Compression produced an empty summary; history left unchanged."
|
|
145
|
-
if on_error:
|
|
146
|
-
await on_error(msg)
|
|
147
|
-
else:
|
|
148
|
-
logger.error(msg)
|
|
149
|
-
return CompactionResult(ok=False, reason="llm_error", message=msg)
|
|
150
|
-
|
|
151
|
-
folded = split - prior_through
|
|
152
|
-
conversation.apply_compaction(summary_text, split)
|
|
153
|
-
|
|
154
|
-
done = f"Compressed {folded} older message(s) into a summary; kept the latest turns verbatim."
|
|
155
|
-
if on_info:
|
|
156
|
-
await on_info(done)
|
|
157
|
-
return CompactionResult(ok=True, reason="ok", summarized_messages=folded, message=done)
|
|
158
|
-
|
|
159
|
-
except Exception as e:
|
|
160
|
-
# Never swallow into a fake success: log the full traceback and surface
|
|
161
|
-
# the real error to the caller.
|
|
162
|
-
logger.exception("Failed to compress message history")
|
|
163
|
-
msg = f"Failed to compress message history: {type(e).__name__}: {e}"
|
|
164
|
-
if on_error:
|
|
165
|
-
await on_error(msg)
|
|
166
|
-
return CompactionResult(ok=False, reason="llm_error", message=msg)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/requirements.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/LICENSE
RENAMED
|
File without changes
|
{kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements.txt
RENAMED
|
File without changes
|