kolega-code 0.28.0__tar.gz → 0.28.2__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.
Files changed (440) hide show
  1. {kolega_code-0.28.0 → kolega_code-0.28.2}/CHANGELOG.md +15 -0
  2. {kolega_code-0.28.0 → kolega_code-0.28.2}/PKG-INFO +3 -2
  3. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/conversation.py +63 -27
  6. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/models.py +69 -28
  7. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/tinker.py +16 -3
  8. {kolega_code-0.28.0 → kolega_code-0.28.2}/pyproject.toml +13 -3
  9. {kolega_code-0.28.0 → kolega_code-0.28.2}/.gitignore +0 -0
  10. {kolega_code-0.28.0 → kolega_code-0.28.2}/CONTRIBUTING.md +0 -0
  11. {kolega_code-0.28.0 → kolega_code-0.28.2}/LICENSE +0 -0
  12. {kolega_code-0.28.0 → kolega_code-0.28.2}/MIGRATION.md +0 -0
  13. {kolega_code-0.28.0 → kolega_code-0.28.2}/README.md +0 -0
  14. {kolega_code-0.28.0 → kolega_code-0.28.2}/RELEASING.md +0 -0
  15. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/LICENSE +0 -0
  16. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/manifest.json +0 -0
  17. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  18. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  19. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  20. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  21. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  22. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  23. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  24. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  25. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  26. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  27. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  28. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  29. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  30. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  31. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  32. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  33. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  34. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  35. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  36. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  37. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  38. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  39. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  40. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  41. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  42. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  43. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  44. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  45. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  46. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  47. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  48. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  49. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  50. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  51. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  52. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  53. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  54. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  55. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  56. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  57. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  58. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  59. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  60. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  61. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  62. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  63. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  64. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  65. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  66. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  67. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/baseagent.py +0 -0
  68. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/browseragent.py +0 -0
  69. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/coder.py +0 -0
  70. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/common.py +0 -0
  71. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/compression.py +0 -0
  72. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/context.py +0 -0
  73. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/custom_agents.py +0 -0
  74. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/edit_protocols.py +0 -0
  75. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/errors.py +0 -0
  76. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/__init__.py +0 -0
  77. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/bridge.py +0 -0
  78. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  79. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  80. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/env.py +0 -0
  81. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/js_kernel.py +0 -0
  82. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/kernel.py +0 -0
  83. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/prelude.js +0 -0
  84. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/prelude.py +0 -0
  85. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/protocol.py +0 -0
  86. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/py_kernel.py +0 -0
  87. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/runner.js +0 -0
  88. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/eval/runner.py +0 -0
  89. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/generalagent.py +0 -0
  90. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/goal.py +0 -0
  91. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/investigationagent.py +0 -0
  92. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/model_routing.py +0 -0
  93. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/__init__.py +0 -0
  94. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/accounting.py +0 -0
  95. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/budget.py +0 -0
  96. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/context.py +0 -0
  97. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/errors.py +0 -0
  98. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/executor.py +0 -0
  99. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/guide.py +0 -0
  100. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/journal.py +0 -0
  101. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/runtime.py +0 -0
  102. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/orchestration/types.py +0 -0
  103. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/planningagent.py +0 -0
  104. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_dump.py +0 -0
  105. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_overrides.py +0 -0
  106. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_provider.py +0 -0
  107. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  108. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  109. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  110. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  111. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  112. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  113. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  114. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  115. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  116. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  117. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  118. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  119. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  120. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  121. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  122. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  123. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  124. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  125. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  126. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  127. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  128. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  129. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  130. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  131. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  132. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  133. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  134. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  135. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  136. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  137. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  138. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  139. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  140. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  141. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  142. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  143. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  144. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  145. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  146. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  147. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  148. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  149. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  150. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  151. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  152. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  153. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  154. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  155. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  156. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  157. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  158. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  159. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  160. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  161. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  162. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  163. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  164. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  165. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  166. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  167. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  168. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  169. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  170. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  171. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  172. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  173. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  174. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  175. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  176. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  177. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  178. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  179. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  180. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  181. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  182. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  183. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  184. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  185. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  186. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  187. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  188. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  189. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  190. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  191. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  192. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  193. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  194. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  195. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  196. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  197. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  198. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  199. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  200. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  201. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/prompts.py +0 -0
  202. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  203. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  204. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  205. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  206. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  207. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  208. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  209. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  210. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  211. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  212. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  213. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/network_status.py +0 -0
  214. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  215. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  216. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  217. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  218. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  219. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  220. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  221. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  222. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  223. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  224. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  225. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  226. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  227. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  228. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  229. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  230. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  231. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  232. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  233. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  234. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  235. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  236. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tool_definitions.py +0 -0
  237. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/tools.py +0 -0
  238. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/utils/commands.py +0 -0
  239. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/agent/volatile_context.py +0 -0
  240. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/auth/__init__.py +0 -0
  241. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/auth/_jwt.py +0 -0
  242. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/auth/chatgpt_oauth.py +0 -0
  243. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/auth/constants.py +0 -0
  244. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/auth/tokens.py +0 -0
  245. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/__init__.py +0 -0
  246. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/framing.py +0 -0
  247. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/installer.py +0 -0
  248. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/manager.py +0 -0
  249. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/multiplex.py +0 -0
  250. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/native_host.py +0 -0
  251. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/protocol.py +0 -0
  252. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/registry.py +0 -0
  253. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/browser_extension/runtime.py +0 -0
  254. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/__init__.py +0 -0
  255. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/app.py +0 -0
  256. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/ask_output.py +0 -0
  257. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/atif_export.py +0 -0
  258. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/browser_backend.py +0 -0
  259. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/clipboard_image.py +0 -0
  260. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/config.py +0 -0
  261. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/connection.py +0 -0
  262. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/cron.py +0 -0
  263. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/diagnostics.py +0 -0
  264. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/file_index.py +0 -0
  265. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/goal.py +0 -0
  266. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/loop.py +0 -0
  267. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/main.py +0 -0
  268. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/mentions.py +0 -0
  269. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/messages.py +0 -0
  270. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/model_catalog.py +0 -0
  271. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/model_connection.py +0 -0
  272. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/plan_artifacts.py +0 -0
  273. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/provider_registry.py +0 -0
  274. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/session_event_protocol.py +0 -0
  275. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/session_event_store.py +0 -0
  276. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/session_journal.py +0 -0
  277. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/session_store.py +0 -0
  278. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/session_usage.py +0 -0
  279. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/settings.py +0 -0
  280. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/skills.py +0 -0
  281. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/slash_commands.py +0 -0
  282. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/theme.py +0 -0
  283. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/__init__.py +0 -0
  284. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/agent_runtime.py +0 -0
  285. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/app_base.py +0 -0
  286. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/changes_screen.py +0 -0
  287. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/command_handlers.py +0 -0
  288. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/constants.py +0 -0
  289. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/custom_model.py +0 -0
  290. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/loop_runtime.py +0 -0
  291. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/memory_screen.py +0 -0
  292. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  293. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/pacing.py +0 -0
  294. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/prompt_flows.py +0 -0
  295. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/session_diff.py +0 -0
  296. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/settings_panel.py +0 -0
  297. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/settings_screen.py +0 -0
  298. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/state.py +0 -0
  299. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/status_dashboard.py +0 -0
  300. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/styles.tcss +0 -0
  301. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  302. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/terminal_display.py +0 -0
  303. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/transcript.py +0 -0
  304. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/tui/widgets.py +0 -0
  305. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/cli/updater.py +0 -0
  306. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/config.py +0 -0
  307. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/events.py +0 -0
  308. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/extensions.py +0 -0
  309. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/git_env.py +0 -0
  310. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/__init__.py +0 -0
  311. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/backends.py +0 -0
  312. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/config.py +0 -0
  313. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/dispatcher.py +0 -0
  314. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/events.py +0 -0
  315. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/matcher.py +0 -0
  316. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/hooks/outcome.py +0 -0
  317. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/client.py +0 -0
  318. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/exceptions.py +0 -0
  319. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/instrumented_client.py +0 -0
  320. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/ledger.py +0 -0
  321. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/__init__.py +0 -0
  322. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/_token_encoding.py +0 -0
  323. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/anthropic.py +0 -0
  324. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/base.py +0 -0
  325. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  326. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  327. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/google.py +0 -0
  328. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/models.py +0 -0
  329. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/openai.py +0 -0
  330. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/openai_responses.py +0 -0
  331. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/responses_common.py +0 -0
  332. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/providers/tinker_trace.py +0 -0
  333. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/ratelimit.py +0 -0
  334. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/__init__.py +0 -0
  335. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/accessors.py +0 -0
  336. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  337. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  338. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  339. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  340. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  341. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/google.py +0 -0
  342. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  343. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  344. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  345. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/openai.py +0 -0
  346. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  347. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  348. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  349. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  350. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/together.py +0 -0
  351. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/xai.py +0 -0
  352. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/catalog/zai.py +0 -0
  353. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  354. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  355. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/thinking.py +0 -0
  356. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  357. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/types.py +0 -0
  358. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/specs/validation.py +0 -0
  359. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/timeouts.py +0 -0
  360. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/tool_execution_ids.py +0 -0
  361. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/llm/usage.py +0 -0
  362. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/local_state.py +0 -0
  363. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/__init__.py +0 -0
  364. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/config.py +0 -0
  365. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/oauth.py +0 -0
  366. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/service.py +0 -0
  367. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/state.py +0 -0
  368. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/tools.py +0 -0
  369. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/mcp/transport.py +0 -0
  370. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/__init__.py +0 -0
  371. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/identity.py +0 -0
  372. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/manager.py +0 -0
  373. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/manifest.py +0 -0
  374. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/markdown.py +0 -0
  375. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/models.py +0 -0
  376. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/protocol.py +0 -0
  377. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/memory/registry.py +0 -0
  378. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/models/__init__.py +0 -0
  379. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/models/sandbox_terminal_state.py +0 -0
  380. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/permissions.py +0 -0
  381. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/runtime.py +0 -0
  382. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/README.md +0 -0
  383. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/__init__.py +0 -0
  384. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/async_filesystem.py +0 -0
  385. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/base.py +0 -0
  386. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/browser.py +0 -0
  387. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/event_loop.py +0 -0
  388. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/filesystem.py +0 -0
  389. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/local.py +0 -0
  390. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/serializer.py +0 -0
  391. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/terminal.py +0 -0
  392. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/sandbox/utils.py +0 -0
  393. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/scratchpad.py +0 -0
  394. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/security/__init__.py +0 -0
  395. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/security/secrets.py +0 -0
  396. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/base.py +0 -0
  397. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/browser.py +0 -0
  398. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/file_system.py +0 -0
  399. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/html.py +0 -0
  400. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/__init__.py +0 -0
  401. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/client.py +0 -0
  402. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/config.py +0 -0
  403. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/detector.py +0 -0
  404. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/diagnostics.py +0 -0
  405. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/edits.py +0 -0
  406. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/manager.py +0 -0
  407. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/registry.py +0 -0
  408. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/lsp/registry.yaml +0 -0
  409. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/snapshots.py +0 -0
  410. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/terminal.py +0 -0
  411. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/terminal_buffer.py +0 -0
  412. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/services/workspace_scan.py +0 -0
  413. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/__init__.py +0 -0
  414. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/control.py +0 -0
  415. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/inmemory.py +0 -0
  416. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/projection.py +0 -0
  417. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/recording.py +0 -0
  418. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/runtime.py +0 -0
  419. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/session/store.py +0 -0
  420. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/testing/__init__.py +0 -0
  421. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/testing/store_conformance.py +0 -0
  422. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/tools/__init__.py +0 -0
  423. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/tools/core.py +0 -0
  424. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/tools/definitions.py +0 -0
  425. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/tools/param_aliases.py +0 -0
  426. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/tools/registry.py +0 -0
  427. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/utils/__init__.py +0 -0
  428. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/utils/images.py +0 -0
  429. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/__init__.py +0 -0
  430. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/assets/fold.js +0 -0
  431. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/assets/player.css +0 -0
  432. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/assets/player.html +0 -0
  433. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/assets/player.js +0 -0
  434. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/bundle.py +0 -0
  435. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/hosting.py +0 -0
  436. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/redaction.py +0 -0
  437. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/server.py +0 -0
  438. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/singlefile.py +0 -0
  439. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/web/theme_css.py +0 -0
  440. {kolega_code-0.28.0 → kolega_code-0.28.2}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,21 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.28.2 - 2026-08-12
10
+
11
+ ### Fixed
12
+
13
+ - Native Tinker sessions now keep repeated provider tool-call IDs paired with
14
+ their distinct executions after persistence, avoiding false interrupted-tool
15
+ placeholders and preserving every result in subsequent model history.
16
+
17
+ ## 0.28.1 - 2026-08-12
18
+
19
+ ### Fixed
20
+
21
+ - Restored native Tinker tool dispatch so generated tool calls execute through
22
+ the agent loop instead of being returned as plain assistant output.
23
+
9
24
  ## 0.28.0 - 2026-08-11
10
25
 
11
26
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.28.0
3
+ Version: 0.28.2
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/
@@ -278,7 +278,8 @@ Requires-Dist: pytest==9.0.3; extra == 'dev'
278
278
  Requires-Dist: ruff==0.15.12; extra == 'dev'
279
279
  Requires-Dist: twine==6.2.0; extra == 'dev'
280
280
  Provides-Extra: tinker
281
- Requires-Dist: tinker-cookbook==0.5.3; extra == 'tinker'
281
+ Requires-Dist: tinker-cookbook==0.5.4; extra == 'tinker'
282
+ Requires-Dist: tinker==0.25.0; extra == 'tinker'
282
283
  Requires-Dist: tml-renderers==0.1.0; extra == 'tinker'
283
284
  Description-Content-Type: text/markdown
284
285
 
@@ -173,4 +173,4 @@ __all__ = [
173
173
  "parse_git_status_output",
174
174
  ]
175
175
 
176
- __version__ = "0.28.0"
176
+ __version__ = "0.28.2"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.28.0"
54
+ __version__ = "0.28.2"
@@ -9,8 +9,9 @@ holding their own reference.
9
9
 
10
10
  import logging
11
11
  import re
12
- from typing import Any, Dict, List, Optional, Union
12
+ from typing import Any, Dict, List, Optional, Union, cast
13
13
 
14
+ from kolega_code.agent.tool_backend.hashline_v2 import strip_hashline_read_output
14
15
  from kolega_code.llm.models import (
15
16
  ContentBlock,
16
17
  ImageBlock,
@@ -23,10 +24,10 @@ from kolega_code.llm.models import (
23
24
  ToolCall,
24
25
  ToolResult,
25
26
  WebSearchCallBlock,
27
+ same_tool_execution,
26
28
  )
27
29
  from kolega_code.llm.specs import prior_reasoning_is_replayable
28
30
  from kolega_code.utils import images as image_utils
29
- from kolega_code.agent.tool_backend.hashline_v2 import strip_hashline_read_output
30
31
 
31
32
  logger = logging.getLogger(__name__)
32
33
 
@@ -630,25 +631,48 @@ class Conversation:
630
631
  content_blocks = [content]
631
632
 
632
633
  if isinstance(content_blocks, list):
633
- new_tool_results = {}
634
+ new_tool_results: List[ToolResult] = []
634
635
  other_blocks = []
635
636
 
636
637
  for block in content_blocks:
637
638
  if isinstance(block, ToolResult):
638
- new_tool_results[block.tool_use_id] = block
639
+ duplicate_index = next(
640
+ (
641
+ index
642
+ for index, existing in enumerate(new_tool_results)
643
+ if same_tool_execution(existing, block)
644
+ ),
645
+ None,
646
+ )
647
+ if duplicate_index is None:
648
+ new_tool_results.append(block)
649
+ else:
650
+ new_tool_results[duplicate_index] = block
639
651
  else:
640
652
  other_blocks.append(block)
641
653
 
642
654
  if new_tool_results:
643
- # Find and update any existing tool results with the same IDs
655
+ # Find and update any existing result for the same execution.
644
656
  for i, msg in enumerate(self.history):
645
657
  if msg.role == "user" and isinstance(msg.content, list):
646
658
  updated_content = []
647
659
  replaced_any = False
648
660
 
649
661
  for block in msg.content:
650
- if isinstance(block, ToolResult) and block.tool_use_id in new_tool_results:
651
- new_result = new_tool_results[block.tool_use_id]
662
+ matching_index = (
663
+ next(
664
+ (
665
+ index
666
+ for index, candidate in enumerate(new_tool_results)
667
+ if same_tool_execution(block, candidate)
668
+ ),
669
+ None,
670
+ )
671
+ if isinstance(block, ToolResult)
672
+ else None
673
+ )
674
+ if isinstance(block, ToolResult) and matching_index is not None:
675
+ new_result = new_tool_results[matching_index]
652
676
  # Replace if: old is dummy error OR new is success and old is error
653
677
  should_replace = (block.is_error and "Operation was interrupted" in block.content) or (
654
678
  not new_result.is_error and block.is_error
@@ -658,14 +682,13 @@ class Conversation:
658
682
  updated_content.append(new_result)
659
683
  replaced_any = True
660
684
  logger.debug("Replaced tool result for tool_use_id: %s", block.tool_use_id)
661
- del new_tool_results[block.tool_use_id]
685
+ del new_tool_results[matching_index]
662
686
  else:
663
687
  updated_content.append(block)
664
- if block.tool_use_id in new_tool_results:
665
- logger.debug(
666
- "Skipping duplicate tool result for tool_use_id: %s", block.tool_use_id
667
- )
668
- del new_tool_results[block.tool_use_id]
688
+ logger.debug(
689
+ "Skipping duplicate tool result for tool_use_id: %s", block.tool_use_id
690
+ )
691
+ del new_tool_results[matching_index]
669
692
  else:
670
693
  updated_content.append(block)
671
694
 
@@ -679,7 +702,7 @@ class Conversation:
679
702
  )
680
703
 
681
704
  # Add any remaining new tool results along with other blocks
682
- content_blocks = list(new_tool_results.values()) + other_blocks
705
+ content_blocks = cast(List[ContentBlock], list(new_tool_results)) + other_blocks
683
706
 
684
707
  # If all blocks were handled (replaced or skipped), don't add empty message
685
708
  if not content_blocks:
@@ -826,19 +849,32 @@ class Conversation:
826
849
  fixed_messages.append(current_message)
827
850
  processed_indices.add(i)
828
851
 
829
- # Collect all tool results from the entire remaining conversation
830
- tool_call_ids = {call.id for call in tool_calls}
831
- all_tool_results = {}
852
+ # Collect all tool results from the entire remaining conversation.
853
+ # Provider IDs may repeat across responses, so correlate modern
854
+ # records by their durable execution IDs and fall back to provider
855
+ # IDs only when either side is legacy.
856
+ all_tool_results: Dict[int, ToolResult] = {}
832
857
  other_content_blocks = [] # Non-tool-result content from the next user message
833
858
 
859
+ def unmatched_call_index(block: ToolResult) -> Optional[int]:
860
+ return next(
861
+ (
862
+ index
863
+ for index, call in enumerate(tool_calls)
864
+ if index not in all_tool_results and same_tool_execution(call, block)
865
+ ),
866
+ None,
867
+ )
868
+
834
869
  # First, check the immediately following message (expected position)
835
870
  next_user_message = None
836
871
  if i + 1 < len(messages) and messages[i + 1].role == "user":
837
872
  next_user_message = messages[i + 1]
838
873
  if isinstance(next_user_message.content, list):
839
874
  for block in next_user_message.content:
840
- if isinstance(block, ToolResult) and block.tool_use_id in tool_call_ids:
841
- all_tool_results[block.tool_use_id] = block
875
+ call_index = unmatched_call_index(block) if isinstance(block, ToolResult) else None
876
+ if isinstance(block, ToolResult) and call_index is not None:
877
+ all_tool_results[call_index] = block
842
878
  else:
843
879
  other_content_blocks.append(block)
844
880
 
@@ -848,8 +884,7 @@ class Conversation:
848
884
  processed_indices.add(i + 1)
849
885
 
850
886
  # Search the entire remaining conversation for any missing tool results
851
- missing_ids = tool_call_ids - set(all_tool_results.keys())
852
- if missing_ids:
887
+ if len(all_tool_results) < len(tool_calls):
853
888
  for j in range(i + 1, len(messages)):
854
889
  if j in processed_indices:
855
890
  continue
@@ -860,15 +895,15 @@ class Conversation:
860
895
  found_any = False
861
896
 
862
897
  for block in msg.content:
863
- if isinstance(block, ToolResult) and block.tool_use_id in missing_ids:
898
+ call_index = unmatched_call_index(block) if isinstance(block, ToolResult) else None
899
+ if isinstance(block, ToolResult) and call_index is not None:
864
900
  logger.warning(
865
901
  "Found tool result %s at position %s instead of expected position %s",
866
902
  block.tool_use_id,
867
903
  j,
868
904
  i + 1,
869
905
  )
870
- all_tool_results[block.tool_use_id] = block
871
- missing_ids.remove(block.tool_use_id)
906
+ all_tool_results[call_index] = block
872
907
  found_any = True
873
908
  else:
874
909
  remaining_content.append(block)
@@ -890,9 +925,9 @@ class Conversation:
890
925
 
891
926
  # Create the complete tool results list in the correct order
892
927
  complete_tool_results = []
893
- for tool_call in tool_calls:
894
- if tool_call.id in all_tool_results:
895
- complete_tool_results.append(all_tool_results[tool_call.id])
928
+ for call_index, tool_call in enumerate(tool_calls):
929
+ if call_index in all_tool_results:
930
+ complete_tool_results.append(all_tool_results[call_index])
896
931
  else:
897
932
  logger.warning("Adding placeholder result for missing tool call: %s", tool_call.id)
898
933
  complete_tool_results.append(
@@ -901,6 +936,7 @@ class Conversation:
901
936
  content="Operation was interrupted. Please retry if needed.",
902
937
  name=tool_call.name,
903
938
  is_error=True,
939
+ execution_id=tool_call.execution_id,
904
940
  input_kind=tool_call.input_kind,
905
941
  )
906
942
  )
@@ -1119,6 +1119,34 @@ class ToolResult(ContentBlock):
1119
1119
  return f"{status} from tool call (ID: {self.tool_use_id}):\n\n```\n{markdown_content}\n```"
1120
1120
 
1121
1121
 
1122
+ ToolExecutionBlock = Union[ToolCall, ToolResult]
1123
+
1124
+
1125
+ def provider_tool_call_id(block: ToolExecutionBlock) -> str:
1126
+ """Return the provider-owned identifier used on the model wire."""
1127
+ return block.id if isinstance(block, ToolCall) else block.tool_use_id
1128
+
1129
+
1130
+ def same_tool_execution(left: ToolExecutionBlock, right: ToolExecutionBlock) -> bool:
1131
+ """Whether two call/result blocks describe one app-level execution.
1132
+
1133
+ Modern records carry the globally unique app ``execution_id`` on both
1134
+ sides. Legacy records may lack it on the result (while restoring the call
1135
+ generates one), so provider-ID matching remains the compatibility fallback
1136
+ whenever either side has no durable execution ID.
1137
+ """
1138
+ if left.execution_id is not None and right.execution_id is not None:
1139
+ return left.execution_id == right.execution_id
1140
+ return provider_tool_call_id(left) == provider_tool_call_id(right)
1141
+
1142
+
1143
+ def tool_result_identity(result: ToolResult) -> tuple[str, str]:
1144
+ """Stable de-duplication key for one result, with legacy fallback."""
1145
+ if result.execution_id is not None:
1146
+ return ("execution", result.execution_id)
1147
+ return ("provider", result.tool_use_id)
1148
+
1149
+
1122
1150
  def _tool_result_blocks(tool_result: "ToolResult") -> List[ContentBlock]:
1123
1151
  if isinstance(tool_result.content, list):
1124
1152
  return tool_result.content
@@ -1905,31 +1933,46 @@ class MessageHistory(list):
1905
1933
 
1906
1934
  def to_openai(self, provider: Optional[str] = None, model: Optional[str] = None) -> list:
1907
1935
  processed_messages = []
1908
- consumed_tool_result_ids = set()
1936
+ # A provider tool-call ID need not be globally unique (native Tinker
1937
+ # emits call_0 in each response). Track their execution identities
1938
+ # instead of treating wire IDs as conversation-global IDs.
1939
+ consumed_tool_results: set[tuple[str, str]] = set()
1909
1940
  messages = list(self)
1910
1941
 
1911
1942
  def payload_has_content(payload: Dict[str, Any]) -> bool:
1912
1943
  content = payload.get("content")
1913
1944
  return (isinstance(content, str) and bool(content)) or (isinstance(content, list) and bool(content))
1914
1945
 
1915
- def collect_lookahead_tool_results(start_index: int, needed_ids: set) -> List[ToolResult]:
1946
+ def unmatched_tool_calls(calls: List[ToolCall], results: List[ToolResult]) -> List[ToolCall]:
1947
+ unmatched = list(calls)
1948
+ for result in results:
1949
+ matching_index = next(
1950
+ (index for index, call in enumerate(unmatched) if same_tool_execution(call, result)),
1951
+ None,
1952
+ )
1953
+ if matching_index is not None:
1954
+ unmatched.pop(matching_index)
1955
+ return unmatched
1956
+
1957
+ def collect_lookahead_tool_results(start_index: int, needed_calls: List[ToolCall]) -> List[ToolResult]:
1916
1958
  found: List[ToolResult] = []
1917
- if not needed_ids:
1959
+ unmatched = list(needed_calls)
1960
+ if not unmatched:
1918
1961
  return found
1919
- found_ids = set()
1920
1962
  for look_ahead in messages[start_index + 1 :]:
1921
1963
  if not isinstance(look_ahead.content, list):
1922
1964
  continue
1923
1965
  for item in look_ahead.content:
1924
- if (
1925
- isinstance(item, ToolResult)
1926
- and item.tool_use_id in needed_ids
1927
- and item.tool_use_id not in consumed_tool_result_ids
1928
- and item.tool_use_id not in found_ids
1929
- ):
1966
+ if not isinstance(item, ToolResult) or tool_result_identity(item) in consumed_tool_results:
1967
+ continue
1968
+ matching_index = next(
1969
+ (index for index, call in enumerate(unmatched) if same_tool_execution(call, item)),
1970
+ None,
1971
+ )
1972
+ if matching_index is not None:
1930
1973
  found.append(item)
1931
- found_ids.add(item.tool_use_id)
1932
- if needed_ids.issubset(found_ids):
1974
+ unmatched.pop(matching_index)
1975
+ if not unmatched:
1933
1976
  break
1934
1977
  return found
1935
1978
 
@@ -1944,7 +1987,7 @@ class MessageHistory(list):
1944
1987
  tool_result_blocks = [
1945
1988
  item
1946
1989
  for item in message.content
1947
- if isinstance(item, ToolResult) and item.tool_use_id not in consumed_tool_result_ids
1990
+ if isinstance(item, ToolResult) and tool_result_identity(item) not in consumed_tool_results
1948
1991
  ]
1949
1992
 
1950
1993
  if tool_result_blocks:
@@ -1964,22 +2007,21 @@ class MessageHistory(list):
1964
2007
 
1965
2008
  # If this same message included tool_calls, pull any missing tool
1966
2009
  # results forward so all role=tool messages stay contiguous.
1967
- tool_call_ids = [item.id for item in message.content if isinstance(item, ToolCall)]
1968
- found_ids = {tr.tool_use_id for tr in tool_result_blocks}
1969
- lookahead_results = collect_lookahead_tool_results(index, set(tool_call_ids) - found_ids)
2010
+ tool_calls = [item for item in message.content if isinstance(item, ToolCall)]
2011
+ missing_calls = unmatched_tool_calls(tool_calls, tool_result_blocks)
2012
+ lookahead_results = collect_lookahead_tool_results(index, missing_calls)
1970
2013
  batch_tool_results = tool_result_blocks + lookahead_results
1971
2014
 
1972
2015
  processed_messages.extend(_openai_tool_result_message(tr) for tr in batch_tool_results)
1973
2016
  for tr in batch_tool_results:
1974
- consumed_tool_result_ids.add(tr.tool_use_id)
2017
+ consumed_tool_results.add(tool_result_identity(tr))
1975
2018
 
1976
2019
  # If still missing, emit placeholder tool messages to satisfy API requirements.
1977
2020
  # These must come before any image follow-up user messages so all required
1978
2021
  # role=tool responses stay contiguous after the assistant tool calls.
1979
- added_ids = {tr.tool_use_id for tr in lookahead_results}
1980
- remaining = set(tool_call_ids) - (found_ids | added_ids)
1981
- for missing_id in remaining:
1982
- processed_messages.append({"role": "tool", "content": "", "tool_call_id": missing_id})
2022
+ remaining_calls = unmatched_tool_calls(missing_calls, lookahead_results)
2023
+ for missing_call in remaining_calls:
2024
+ processed_messages.append({"role": "tool", "content": "", "tool_call_id": missing_call.id})
1983
2025
  for tr in batch_tool_results:
1984
2026
  followup = _openai_tool_result_image_followup(tr)
1985
2027
  if followup is not None:
@@ -1997,20 +2039,19 @@ class MessageHistory(list):
1997
2039
 
1998
2040
  tool_calls = temp_payload.get("tool_calls") or []
1999
2041
  if tool_calls:
2000
- tool_call_ids = [tc.get("id") for tc in tool_calls if tc.get("id")]
2001
- lookahead_results = collect_lookahead_tool_results(index, set(tool_call_ids))
2042
+ content_tool_calls = [item for item in message.content if isinstance(item, ToolCall)]
2043
+ lookahead_results = collect_lookahead_tool_results(index, content_tool_calls)
2002
2044
 
2003
2045
  processed_messages.extend(_openai_tool_result_message(tr) for tr in lookahead_results)
2004
2046
  for tr in lookahead_results:
2005
- consumed_tool_result_ids.add(tr.tool_use_id)
2047
+ consumed_tool_results.add(tool_result_identity(tr))
2006
2048
 
2007
2049
  # If any are still missing, emit placeholder tool messages to satisfy API ordering.
2008
2050
  # Placeholders also come before image follow-up user messages to keep all role=tool
2009
2051
  # responses contiguous after the assistant tool-call message.
2010
- added_ids = {tr.tool_use_id for tr in lookahead_results}
2011
- remaining = [tc_id for tc_id in tool_call_ids if tc_id not in added_ids]
2012
- for missing_id in remaining:
2013
- processed_messages.append({"role": "tool", "content": "", "tool_call_id": missing_id})
2052
+ remaining_calls = unmatched_tool_calls(content_tool_calls, lookahead_results)
2053
+ for missing_call in remaining_calls:
2054
+ processed_messages.append({"role": "tool", "content": "", "tool_call_id": missing_call.id})
2014
2055
  for tr in lookahead_results:
2015
2056
  followup = _openai_tool_result_image_followup(tr)
2016
2057
  if followup is not None:
@@ -166,6 +166,7 @@ def _parsed_to_message(parsed: Any, stop_reason: str) -> Message:
166
166
  are fabricated when the renderer does not emit one.
167
167
  """
168
168
  blocks: List[Any] = []
169
+ message_tool_calls: List[ToolCall] = []
169
170
 
170
171
  reasoning = (
171
172
  parsed.get("reasoning_content") if isinstance(parsed, dict) else getattr(parsed, "reasoning_content", None)
@@ -211,11 +212,18 @@ def _parsed_to_message(parsed: Any, stop_reason: str) -> Message:
211
212
  tool_input = {"raw": arguments}
212
213
  raw_id = call.get("id") if isinstance(call, dict) else getattr(call, "id", None)
213
214
  call_id = str(raw_id) if raw_id else f"call_{index}"
214
- blocks.append(ToolCall(id=call_id, name=name, input=tool_input))
215
+ tool_call = ToolCall(id=call_id, name=name, input=tool_input)
216
+ message_tool_calls.append(tool_call)
217
+ blocks.append(tool_call)
215
218
 
216
219
  if not blocks:
217
220
  blocks.append(TextBlock(text=""))
218
- return Message(role="assistant", content=blocks, stop_reason=stop_reason)
221
+ return Message(
222
+ role="assistant",
223
+ content=blocks,
224
+ stop_reason="tool_use" if message_tool_calls else stop_reason,
225
+ tool_calls=message_tool_calls,
226
+ )
219
227
 
220
228
 
221
229
  def _kolega_stop_reason(sdk_reason: str, termination: Any) -> str:
@@ -573,7 +581,12 @@ def _message_to_chunks(message: Message) -> List[MessageChunk]:
573
581
  chunks.append(
574
582
  MessageChunk(
575
583
  type="tool_use_start",
576
- tool_call_delta={"id": block.id, "name": block.name, "input": ""},
584
+ tool_call_delta={
585
+ "id": block.id,
586
+ "name": block.name,
587
+ "input": "",
588
+ "execution_id": block.execution_id,
589
+ },
577
590
  )
578
591
  )
579
592
  chunks.append(
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "kolega-code"
7
- version = "0.28.0"
7
+ version = "0.28.2"
8
8
  description = "Multi-agent coding in the terminal"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
@@ -107,7 +107,8 @@ cli = []
107
107
  # tml-renderers >=2.10) and transformers; the base install stays torch-free.
108
108
  # tml-renderers ships abi3 wheels for Linux x86_64/aarch64 and macOS arm64 only.
109
109
  tinker = [
110
- "tinker-cookbook==0.5.3",
110
+ "tinker==0.25.0",
111
+ "tinker-cookbook==0.5.4",
111
112
  "tml-renderers==0.1.0",
112
113
  ]
113
114
  dev = [
@@ -166,7 +167,16 @@ exclude-newer = "1 week"
166
167
  # h2 4.4.1 (released 2026-08-03) is the only release fixing GHSA-6hr6-w5qg-qmwg
167
168
  # (CVE-2026-71554, duplicate Host header request smuggling) and sits inside the
168
169
  # same quarantine; admit it the same way.
169
- exclude-newer-package = { cryptography = "2026-08-01T00:00:00Z", h2 = "2026-08-04T00:00:00Z" }
170
+ # tinker 0.25.0 (released 2026-08-08) is required by the live service, which
171
+ # warns that 0.24.0 is outdated; admit that SDK without widening the global window.
172
+ # tinker-cookbook 0.5.4 (released 2026-08-11) is the matching current cookbook;
173
+ # admit it through the same targeted exception.
174
+
175
+ [tool.uv.exclude-newer-package]
176
+ cryptography = "2026-08-01T00:00:00Z"
177
+ h2 = "2026-08-04T00:00:00Z"
178
+ tinker = "2026-08-09T00:00:00Z"
179
+ tinker-cookbook = "2026-08-12T00:00:00Z"
170
180
 
171
181
  [tool.pyright]
172
182
  include = ["kolega_code", "benchmarks", "tests"]
File without changes
File without changes
File without changes
File without changes
File without changes