kolega-code 0.27.1__tar.gz → 0.28.1__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 (444) hide show
  1. {kolega_code-0.27.1 → kolega_code-0.28.1}/CHANGELOG.md +156 -0
  2. {kolega_code-0.27.1 → kolega_code-0.28.1}/PKG-INFO +4 -2
  3. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/__init__.py +25 -3
  4. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/manifest.json +7 -7
  5. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +1 -1
  6. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +4 -3
  7. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +16 -9
  8. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +164 -0
  9. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +146 -1
  10. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/__init__.py +1 -1
  11. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/baseagent.py +413 -164
  12. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/browseragent.py +2 -0
  13. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/coder.py +2 -0
  14. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/compression.py +21 -9
  15. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/context.py +11 -0
  16. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/custom_agents.py +2 -0
  17. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/generalagent.py +2 -0
  18. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/investigationagent.py +2 -0
  19. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/planningagent.py +17 -12
  20. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +1 -1
  21. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/apply_patch.md +1 -0
  22. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +10 -0
  23. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_click.md +7 -0
  24. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_close.md +1 -0
  25. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +5 -0
  26. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_drag.md +1 -0
  27. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_drop.md +1 -0
  28. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +1 -0
  29. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +1 -0
  30. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +1 -0
  31. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_find.md +8 -0
  32. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +1 -0
  33. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_hover.md +1 -0
  34. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_navigate.md +1 -0
  35. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +1 -0
  36. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_network_request.md +5 -0
  37. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +1 -0
  38. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_press_key.md +6 -0
  39. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_resize.md +1 -0
  40. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_scroll.md +5 -0
  41. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_select_option.md +1 -0
  42. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +9 -0
  43. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_tabs.md +11 -0
  44. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +9 -0
  45. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_type.md +1 -0
  46. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +1 -0
  47. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/build_backend.md +12 -0
  48. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/build_frontend.md +12 -0
  49. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/claude_edit.md +8 -0
  50. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/claude_write.md +6 -0
  51. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +18 -0
  52. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/edit.md +53 -0
  53. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/eval.md +14 -0
  54. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/exec_command.md +27 -0
  55. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/get_host.md +2 -0
  56. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/get_task_list.md +6 -0
  57. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +8 -0
  58. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/hashline_edit.md +22 -0
  59. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/hashline_write.md +7 -0
  60. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/kill_command.md +8 -0
  61. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/list_sessions.md +9 -0
  62. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +9 -0
  63. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +10 -0
  64. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/lsp.md +19 -0
  65. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/lsp_edit.md +7 -0
  66. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/multi_edit.md +24 -0
  67. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/read.md +4 -0
  68. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/read_image.md +4 -0
  69. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/resolve.md +8 -0
  70. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/run_workflow.md +17 -0
  71. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/set_goal.md +21 -0
  72. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/skill.md +8 -0
  73. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/snapshot.md +9 -0
  74. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/switch_worktree.md +22 -0
  75. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/update_task_list.md +8 -0
  76. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/web_fetch.md +11 -0
  77. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/web_search.md +9 -0
  78. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/write.md +7 -0
  79. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/write_plan.md +7 -0
  80. kolega_code-0.28.1/kolega_code/agent/prompt_templates/tools/write_stdin.md +17 -0
  81. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/agent_tool.py +124 -0
  82. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/terminal_tool.py +170 -33
  83. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch_tool.py +1 -0
  84. kolega_code-0.28.1/kolega_code/agent/tool_definitions.py +767 -0
  85. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tools.py +152 -1132
  86. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/utils/commands.py +5 -4
  87. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/volatile_context.py +2 -0
  88. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/app.py +65 -21
  89. kolega_code-0.28.1/kolega_code/cli/ask_output.py +24 -0
  90. kolega_code-0.28.1/kolega_code/cli/atif_export.py +1076 -0
  91. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/config.py +143 -3
  92. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/diagnostics.py +21 -0
  93. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/main.py +732 -369
  94. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/messages.py +4 -0
  95. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/model_catalog.py +31 -6
  96. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/provider_registry.py +2 -1
  97. kolega_code-0.28.1/kolega_code/cli/session_event_protocol.py +295 -0
  98. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/session_journal.py +538 -54
  99. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/session_store.py +118 -3
  100. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/session_usage.py +19 -2
  101. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/settings.py +8 -2
  102. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/skills.py +14 -13
  103. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/slash_commands.py +18 -5
  104. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/theme.py +2 -12
  105. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/agent_runtime.py +226 -125
  106. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/app_base.py +13 -0
  107. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/changes_screen.py +5 -1
  108. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/command_handlers.py +4 -1
  109. kolega_code-0.28.1/kolega_code/cli/tui/pacing.py +58 -0
  110. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/prompt_flows.py +23 -46
  111. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/settings_panel.py +43 -2
  112. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/settings_screen.py +16 -1
  113. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/status_dashboard.py +4 -3
  114. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/sub_agent_screen.py +5 -1
  115. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/terminal_display.py +22 -0
  116. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/transcript.py +11 -7
  117. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/config.py +24 -0
  118. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/events.py +6 -1
  119. kolega_code-0.28.1/kolega_code/extensions.py +182 -0
  120. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/client.py +111 -1
  121. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/instrumented_client.py +47 -4
  122. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/ledger.py +33 -2
  123. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/models.py +16 -3
  124. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/anthropic.py +4 -0
  125. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/responses_common.py +80 -11
  126. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/tinker.py +11 -27
  127. kolega_code-0.28.1/kolega_code/llm/providers/tinker_trace.py +37 -0
  128. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/__init__.py +2 -0
  129. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/accessors.py +29 -1
  130. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/anthropic.py +10 -0
  131. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/dashscope.py +2 -0
  132. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/deepseek.py +2 -0
  133. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/fireworks.py +8 -0
  134. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/google.py +4 -0
  135. kolega_code-0.28.1/kolega_code/llm/specs/catalog/kimi_coding.py +73 -0
  136. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/moonshot.py +9 -0
  137. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/ollama_cloud.py +53 -154
  138. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/openai.py +7 -1
  139. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/openai_chatgpt.py +13 -5
  140. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/openrouter.py +260 -0
  141. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/thinking_machines.py +2 -0
  142. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/tinker.py +23 -0
  143. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/together.py +2 -0
  144. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/xai.py +3 -0
  145. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/zai.py +2 -0
  146. kolega_code-0.28.1/kolega_code/llm/specs/ollama_cloud_catalog.py +364 -0
  147. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/openrouter_catalog.py +8 -1
  148. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/tinker_catalog.py +13 -2
  149. kolega_code-0.28.1/kolega_code/llm/specs/validation.py +17 -0
  150. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/tools.py +3 -2
  151. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/serializer.py +3 -1
  152. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/terminal.py +216 -29
  153. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/scratchpad.py +21 -0
  154. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/base.py +26 -5
  155. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/terminal.py +321 -47
  156. kolega_code-0.28.1/kolega_code/services/terminal_buffer.py +587 -0
  157. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/tools/__init__.py +0 -4
  158. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/tools/core.py +26 -0
  159. kolega_code-0.28.1/kolega_code/tools/definitions.py +68 -0
  160. {kolega_code-0.27.1 → kolega_code-0.28.1}/pyproject.toml +16 -3
  161. kolega_code-0.27.1/kolega_code/cli/ask_output.py +0 -104
  162. kolega_code-0.27.1/kolega_code/llm/specs/catalog/kimi_coding.py +0 -41
  163. kolega_code-0.27.1/kolega_code/services/terminal_buffer.py +0 -135
  164. kolega_code-0.27.1/kolega_code/tools/definitions.py +0 -194
  165. {kolega_code-0.27.1 → kolega_code-0.28.1}/.gitignore +0 -0
  166. {kolega_code-0.27.1 → kolega_code-0.28.1}/CONTRIBUTING.md +0 -0
  167. {kolega_code-0.27.1 → kolega_code-0.28.1}/LICENSE +0 -0
  168. {kolega_code-0.27.1 → kolega_code-0.28.1}/MIGRATION.md +0 -0
  169. {kolega_code-0.27.1 → kolega_code-0.28.1}/README.md +0 -0
  170. {kolega_code-0.27.1 → kolega_code-0.28.1}/RELEASING.md +0 -0
  171. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/LICENSE +0 -0
  172. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  173. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  174. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  175. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  176. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  177. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  178. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  179. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  180. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  181. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  182. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  183. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  184. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  185. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  186. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  187. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  188. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  189. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  190. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  191. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  192. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  193. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  194. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  195. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  196. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  197. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  198. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  199. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  200. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  201. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  202. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  203. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  204. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  205. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  206. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  207. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  208. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  209. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  210. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  211. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  212. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  213. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  214. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  215. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  216. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  217. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/common.py +0 -0
  218. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/conversation.py +0 -0
  219. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/edit_protocols.py +0 -0
  220. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/errors.py +0 -0
  221. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/__init__.py +0 -0
  222. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/bridge.py +0 -0
  223. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  224. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  225. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/env.py +0 -0
  226. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/js_kernel.py +0 -0
  227. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/kernel.py +0 -0
  228. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/prelude.js +0 -0
  229. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/prelude.py +0 -0
  230. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/protocol.py +0 -0
  231. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/py_kernel.py +0 -0
  232. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/runner.js +0 -0
  233. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/eval/runner.py +0 -0
  234. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/goal.py +0 -0
  235. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/model_routing.py +0 -0
  236. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/__init__.py +0 -0
  237. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/accounting.py +0 -0
  238. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/budget.py +0 -0
  239. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/context.py +0 -0
  240. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/errors.py +0 -0
  241. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/executor.py +0 -0
  242. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/guide.py +0 -0
  243. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/journal.py +0 -0
  244. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/runtime.py +0 -0
  245. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/orchestration/types.py +0 -0
  246. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_dump.py +0 -0
  247. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_overrides.py +0 -0
  248. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_provider.py +0 -0
  249. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  250. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  251. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  252. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  253. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  254. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  255. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  256. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  257. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  258. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  259. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  260. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  261. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  262. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  263. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  264. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  265. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  266. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  267. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  268. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  269. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  270. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  271. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  272. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  273. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  274. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  275. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  276. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  277. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  278. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  279. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  280. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  281. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  282. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/prompts.py +0 -0
  283. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  284. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  285. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  286. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  287. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  288. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  289. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  290. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  291. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  292. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  293. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/network_status.py +0 -0
  294. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  295. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  296. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  297. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  298. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  299. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  300. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  301. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  302. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  303. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  304. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  305. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  306. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  307. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  308. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  309. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  310. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  311. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  312. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  313. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  314. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/auth/__init__.py +0 -0
  315. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/auth/_jwt.py +0 -0
  316. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/auth/chatgpt_oauth.py +0 -0
  317. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/auth/constants.py +0 -0
  318. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/auth/tokens.py +0 -0
  319. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/__init__.py +0 -0
  320. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/framing.py +0 -0
  321. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/installer.py +0 -0
  322. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/manager.py +0 -0
  323. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/multiplex.py +0 -0
  324. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/native_host.py +0 -0
  325. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/protocol.py +0 -0
  326. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/registry.py +0 -0
  327. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/browser_extension/runtime.py +0 -0
  328. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/__init__.py +0 -0
  329. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/browser_backend.py +0 -0
  330. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/clipboard_image.py +0 -0
  331. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/connection.py +0 -0
  332. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/cron.py +0 -0
  333. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/file_index.py +0 -0
  334. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/goal.py +0 -0
  335. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/loop.py +0 -0
  336. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/mentions.py +0 -0
  337. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/model_connection.py +0 -0
  338. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/plan_artifacts.py +0 -0
  339. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/session_event_store.py +0 -0
  340. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/__init__.py +0 -0
  341. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/constants.py +0 -0
  342. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/custom_model.py +0 -0
  343. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/loop_runtime.py +0 -0
  344. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/memory_screen.py +0 -0
  345. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  346. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/session_diff.py +0 -0
  347. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/state.py +0 -0
  348. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/styles.tcss +0 -0
  349. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/tui/widgets.py +0 -0
  350. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/cli/updater.py +0 -0
  351. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/git_env.py +0 -0
  352. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/__init__.py +0 -0
  353. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/backends.py +0 -0
  354. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/config.py +0 -0
  355. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/dispatcher.py +0 -0
  356. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/events.py +0 -0
  357. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/matcher.py +0 -0
  358. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/hooks/outcome.py +0 -0
  359. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/exceptions.py +0 -0
  360. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/__init__.py +0 -0
  361. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/_token_encoding.py +0 -0
  362. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/base.py +0 -0
  363. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  364. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  365. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/google.py +0 -0
  366. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/models.py +0 -0
  367. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/openai.py +0 -0
  368. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/providers/openai_responses.py +0 -0
  369. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/ratelimit.py +0 -0
  370. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  371. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/thinking.py +0 -0
  372. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/specs/types.py +0 -0
  373. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/timeouts.py +0 -0
  374. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/tool_execution_ids.py +0 -0
  375. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/llm/usage.py +0 -0
  376. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/local_state.py +0 -0
  377. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/__init__.py +0 -0
  378. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/config.py +0 -0
  379. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/oauth.py +0 -0
  380. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/service.py +0 -0
  381. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/state.py +0 -0
  382. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/mcp/transport.py +0 -0
  383. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/__init__.py +0 -0
  384. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/identity.py +0 -0
  385. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/manager.py +0 -0
  386. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/manifest.py +0 -0
  387. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/markdown.py +0 -0
  388. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/models.py +0 -0
  389. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/protocol.py +0 -0
  390. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/memory/registry.py +0 -0
  391. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/models/__init__.py +0 -0
  392. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/models/sandbox_terminal_state.py +0 -0
  393. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/permissions.py +0 -0
  394. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/runtime.py +0 -0
  395. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/README.md +0 -0
  396. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/__init__.py +0 -0
  397. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/async_filesystem.py +0 -0
  398. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/base.py +0 -0
  399. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/browser.py +0 -0
  400. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/event_loop.py +0 -0
  401. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/filesystem.py +0 -0
  402. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/local.py +0 -0
  403. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/sandbox/utils.py +0 -0
  404. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/security/__init__.py +0 -0
  405. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/security/secrets.py +0 -0
  406. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/browser.py +0 -0
  407. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/file_system.py +0 -0
  408. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/html.py +0 -0
  409. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/__init__.py +0 -0
  410. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/client.py +0 -0
  411. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/config.py +0 -0
  412. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/detector.py +0 -0
  413. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/diagnostics.py +0 -0
  414. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/edits.py +0 -0
  415. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/manager.py +0 -0
  416. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/registry.py +0 -0
  417. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/lsp/registry.yaml +0 -0
  418. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/snapshots.py +0 -0
  419. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/services/workspace_scan.py +0 -0
  420. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/__init__.py +0 -0
  421. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/control.py +0 -0
  422. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/inmemory.py +0 -0
  423. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/projection.py +0 -0
  424. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/recording.py +0 -0
  425. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/runtime.py +0 -0
  426. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/session/store.py +0 -0
  427. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/testing/__init__.py +0 -0
  428. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/testing/store_conformance.py +0 -0
  429. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/tools/param_aliases.py +0 -0
  430. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/tools/registry.py +0 -0
  431. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/utils/__init__.py +0 -0
  432. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/utils/images.py +0 -0
  433. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/__init__.py +0 -0
  434. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/assets/fold.js +0 -0
  435. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/assets/player.css +0 -0
  436. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/assets/player.html +0 -0
  437. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/assets/player.js +0 -0
  438. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/bundle.py +0 -0
  439. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/hosting.py +0 -0
  440. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/redaction.py +0 -0
  441. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/server.py +0 -0
  442. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/singlefile.py +0 -0
  443. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/web/theme_css.py +0 -0
  444. {kolega_code-0.27.1 → kolega_code-0.28.1}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,162 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.28.1 - 2026-08-12
10
+
11
+ ### Fixed
12
+
13
+ - Restored native Tinker tool dispatch so generated tool calls execute through
14
+ the agent loop instead of being returned as plain assistant output.
15
+
16
+ ## 0.28.0 - 2026-08-11
17
+
18
+ ### Added
19
+
20
+ - ATIF v1.7 trajectory export: `sessions export --format atif` converts any
21
+ session (including pre-upgrade v1 sessions, with explicit conversion
22
+ warnings) into a validated [ATIF](https://github.com/harbor-framework/harbor/blob/main/rfcs/0001-trajectory-format.md)
23
+ document, and `ask --atif-output FILE` writes one directly when a run ends —
24
+ completed, failed, or cancelled, with or without `--save`. Embedded subagent
25
+ trajectories, per-step token metrics, hydrated oversized tool results, and
26
+ atomic file+assets output; image trajectories require `--output`/a file
27
+ destination for portable relative asset paths.
28
+
29
+ - The interactive CLI and `ask` can now load one installed Python extension at
30
+ launch with `--extension MODULE:FACTORY` and an optional opaque
31
+ `--extension-config PATH`. An extension contributes ordinary prompt and tool
32
+ extensions, binds to each top-level agent generation before its first model
33
+ request, may observe structured LLM trace records (forwarded to every LLM
34
+ client like the usage ledger), and is cleaned up exactly once per generation,
35
+ including on interactive agent rebuilds. Extension contracts are exported
36
+ from the package root, alongside `llm_call_origin`/`helper_origin` and
37
+ `TinkerTraceRecord`; a minimal example package lives in `examples/extension`.
38
+
39
+ - Agent Skills can now be enabled or disabled from Settings,
40
+ `settings.json`, `KOLEGA_CODE_SKILLS`, or `--skills on|off`.
41
+
42
+ - The TUI status usage panel now shows the provider cache hit percentage
43
+ alongside the other usage figures.
44
+
45
+ - After quitting, the CLI prints the exact
46
+ `kolega-code . --resume <id>` command to resume the session that was just
47
+ saved.
48
+
49
+ - Hosts can now continue a restored conversation without inserting a user
50
+ message: `BaseAgent.continue_from_history_stream()` runs the ordinary agent
51
+ loop (compaction, tool execution, usage accounting, and cancellation
52
+ included) and yields the same chunk format. Sessions containing such a
53
+ continuation turn are not loadable by older kolega-code versions.
54
+
55
+ - Oversized terminal command output is now spilled to a file instead of being
56
+ lost: the tool result keeps the bounded head/tail preview plus a path to
57
+ the full output, and the PTY is drained before detaching so a killed
58
+ command keeps its final output.
59
+
60
+ ### Changed
61
+
62
+ - Automatic compaction now gets one recovery attempt when the ordinary pass —
63
+ which keeps the six most recent messages verbatim — still leaves a request
64
+ above the model's resolved input budget: a second pass with no retained tail
65
+ (`keep_recent=0`, journaled with trigger `auto_tail_fallback`) folds
66
+ everything before the safe boundary into the summary, still without touching
67
+ the raw history or splitting a tool call from its result. A pass that failed
68
+ at the model or hit the minimum-history guard is not retried. When the paired
69
+ `--context-window-tokens` + `--max-output-tokens` cap is active and the
70
+ request still does not fit, the run now fails closed with
71
+ `LLMContextWindowExceededError` before the primary model is called (recorded
72
+ as the `run.failed` error code) instead of dispatching the oversized request;
73
+ uncapped runs keep the legacy provider-accept-or-reject behavior.
74
+
75
+ - **Breaking:** `kolega-code ask --json` now streams the semantic session-event
76
+ protocol — one v2 event envelope per line (`schema: "kolega.session.event"`,
77
+ stable `id`/`seq`/`timestamp`, agent lineage, typed `payload`) — replacing
78
+ the former `{"kind": "message"|"event"|"summary"}` records with no
79
+ compatibility flag. Live output and the new
80
+ `sessions export --format events-jsonl` return the same records. Every run
81
+ records the full journal (LLM call ids, subagent turns and tool results,
82
+ `context.system`, compaction/rewind provenance, and `run.completed`/
83
+ `run.failed`/`run.cancelled` terminals on every exit path); unsaved runs use
84
+ an in-memory journal and leave no session state. Plain (non-JSON) `ask`
85
+ output is unchanged. Session journals now write schema v2 events (v1
86
+ sessions remain readable; resumed v1 sessions append v2 lines — older
87
+ kolega-code versions will refuse to read those journals rather than
88
+ mis-replaying them).
89
+
90
+ - Tool definitions are now explicit, checked-in artifacts. Every built-in
91
+ tool's model-visible description lives as data beside the prompt assets
92
+ (`kolega_code/agent/prompt_templates/tools/`) and its input schema as a
93
+ literal dict in `kolega_code/agent/tool_definitions.py`; nothing about what
94
+ the model sees is derived from signatures or docstrings anymore, and the
95
+ migration is byte-identical on the wire. `ToolExtension` tools (including
96
+ CLI extensions loaded with `--extension` and MCP tools) now declare an
97
+ explicit `tool_descriptions` entry alongside `tool_schemas`; a tool missing
98
+ either fails at registration with a clear error before any model request.
99
+
100
+ - TUI responsiveness for long sessions is improved: the transcript scrollback
101
+ window is capped at 120 mounted entries (scroll-up still walks the full
102
+ history), flush cadences are unified and paced by event-loop lateness,
103
+ modal inspectors stay on the unpaced base cadence, and the native Tinker
104
+ stack no longer loads at package import time — faster startup and fewer
105
+ event-loop stalls.
106
+
107
+ ### Removed
108
+
109
+ - The `tool_definition_from_callable` helper (and the `Args:`-block
110
+ strip/keep rules behind it) is gone, including its `kolega_code` package
111
+ root export: definitions are declared, not derived.
112
+
113
+ ### Fixed
114
+
115
+ - A session could be opened in two kolega-code instances at once, interleaving
116
+ duplicate event sequence numbers into the session journal until it became
117
+ unreadable (and `switch_worktree`/`save` failed with "Session event sequence
118
+ gap"). Resuming a session that is already open in another instance is now
119
+ refused with a clear error, journal appends allocate sequence numbers under
120
+ a cross-process lock, and `kolega-code sessions repair <id>` renumbers a
121
+ corrupted journal back into a contiguous sequence.
122
+
123
+ - File tools (`read`, `write`, `edit`, `multi_edit`, `read_image`) now expand
124
+ a `$KOLEGA_SCRATCHPAD` (or `${KOLEGA_SCRATCHPAD}`) reference in path
125
+ arguments to the session scratchpad at the tool-dispatch choke point, so
126
+ the shell spelling no longer creates a literal `$KOLEGA_SCRATCHPAD`
127
+ directory in the workspace.
128
+
129
+ - Runtime model-catalog caches created before input-budget conventions were
130
+ introduced are now ignored safely instead of injecting incomplete model
131
+ specs that fail later with `KeyError: 'input_budget'`. Refreshing a catalog
132
+ rewrites it in the current schema.
133
+
134
+ - Kimi Coding Plan model IDs now match the provider's real wire IDs:
135
+ `k3-256k` (fixed 256K K3 route) and `kimi-for-coding-highspeed` are
136
+ recognized, and the fabricated `k3[1m]` ID is gone (Kimi's 1M context is
137
+ the same `k3` ID, tier-gated). Kimi and Moonshot input budgets treat output
138
+ as a separate allowance (verified by live probes), so the full context
139
+ window is usable as input instead of being cut down by the output cap.
140
+
141
+ - OpenAI and ChatGPT gpt-5.x requests that reproduced reserved Harmony
142
+ control-token spellings as data (for example after a tool result read a
143
+ file containing `<|channel|>`-style tokens) were rejected with
144
+ `APIError: Request blocked`, permanently poisoning the session. The
145
+ spellings are now escaped on the transport copy only — the persisted
146
+ transcript is unchanged — and already-poisoned sessions heal on the next
147
+ request.
148
+
149
+ - Responses-based providers (OpenAI, ChatGPT, DeepSeek) now return multiple
150
+ tool calls per model round instead of one at a time.
151
+
152
+ - After history compaction (automatic or `/compact`) the approved plan and
153
+ the shared task list are re-injected into the model's context as system
154
+ reminders, so the model no longer loses track of them mid-run.
155
+
156
+ - Terminal sessions that end while a backgrounded `&` job still holds the PTY
157
+ are now reported as exited instead of spinning through the whole yield
158
+ window, and naturally exited sessions are hidden from the session listing
159
+ instead of lingering as stale entries.
160
+
161
+ - The shared terminal-tools guidance now warns that `rg -r` means
162
+ `--replace` (recursion is the default), which previously made `rg -rn`
163
+ output look like a redaction layer.
164
+
9
165
  ## 0.27.1 - 2026-08-10
10
166
 
11
167
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.27.1
3
+ Version: 0.28.1
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/
@@ -229,6 +229,7 @@ Classifier: Topic :: Software Development
229
229
  Classifier: Topic :: Utilities
230
230
  Requires-Python: >=3.11
231
231
  Requires-Dist: anthropic==0.101.0
232
+ Requires-Dist: atif==1.7.0
232
233
  Requires-Dist: beautifulsoup4==4.14.3
233
234
  Requires-Dist: cryptography==48.0.1; sys_platform == 'darwin' and platform_machine == 'x86_64'
234
235
  Requires-Dist: cryptography==50.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'
@@ -277,7 +278,8 @@ Requires-Dist: pytest==9.0.3; extra == 'dev'
277
278
  Requires-Dist: ruff==0.15.12; extra == 'dev'
278
279
  Requires-Dist: twine==6.2.0; extra == 'dev'
279
280
  Provides-Extra: tinker
280
- 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'
281
283
  Requires-Dist: tml-renderers==0.1.0; extra == 'tinker'
282
284
  Description-Content-Type: text/markdown
283
285
 
@@ -28,9 +28,22 @@ from .config import AgentConfig, ModelConfig, ModelProvider, RateLimitConfig
28
28
  from .events import AgentConnectionManager
29
29
  from .events import AgentEvent, AgentStatus
30
30
 
31
+ # CLI-selected extensions
32
+ from .extensions import (
33
+ KolegaExtensionBundle,
34
+ KolegaExtensionFactory,
35
+ KolegaExtensionHost,
36
+ KolegaExtensionLoadError,
37
+ )
38
+
31
39
  # LLM clients and message models
32
40
  from .llm.client import LLMClient
33
41
  from .llm.instrumented_client import InstrumentedLLMClient
42
+ from .llm.ledger import LlmCallOrigin, current_llm_call_origin, helper_origin, llm_call_origin
43
+
44
+ # From the dependency-free leaf module: importing .llm.providers.tinker itself
45
+ # loads the optional native stack (tinker-cookbook -> torch) when installed.
46
+ from .llm.providers.tinker_trace import TinkerTraceRecord
34
47
  from .llm.models import (
35
48
  ImageBlock,
36
49
  Message,
@@ -56,7 +69,7 @@ from .agent.prompt_provider import (
56
69
  # Tools
57
70
  from .agent.tool_backend.base_tool import BaseTool
58
71
  from .agent.tools import ToolCollection, ToolCollectionConfig, ToolExtension
59
- from .tools import Tool, ToolError, ToolPolicy, ToolRegistry, tool_definition_from_callable
72
+ from .tools import Tool, ToolError, ToolPolicy, ToolRegistry
60
73
 
61
74
  # Host environment services
62
75
  from .agent.common import LogMixin
@@ -102,9 +115,19 @@ __all__ = [
102
115
  "AgentConnectionManager",
103
116
  "AgentEvent",
104
117
  "AgentStatus",
118
+ # CLI-selected extensions
119
+ "KolegaExtensionBundle",
120
+ "KolegaExtensionFactory",
121
+ "KolegaExtensionHost",
122
+ "KolegaExtensionLoadError",
105
123
  # LLM
106
124
  "LLMClient",
107
125
  "InstrumentedLLMClient",
126
+ "LlmCallOrigin",
127
+ "current_llm_call_origin",
128
+ "helper_origin",
129
+ "llm_call_origin",
130
+ "TinkerTraceRecord",
108
131
  "ImageBlock",
109
132
  "Message",
110
133
  "MessageHistory",
@@ -130,7 +153,6 @@ __all__ = [
130
153
  "ToolError",
131
154
  "ToolPolicy",
132
155
  "ToolRegistry",
133
- "tool_definition_from_callable",
134
156
  # Services
135
157
  "LogMixin",
136
158
  "BrowserManager",
@@ -151,4 +173,4 @@ __all__ = [
151
173
  "parse_git_status_output",
152
174
  ]
153
175
 
154
- __version__ = "0.27.1"
176
+ __version__ = "0.28.1"
@@ -14,11 +14,11 @@
14
14
  },
15
15
  {
16
16
  "path": "skills/deep-research/references/gigacode-workflow.md",
17
- "sha256": "097807156d55a29d12b16a3a5d496a41fb07f152476e95e390699dec1842bc6a"
17
+ "sha256": "dbbe41f577bd96e2d6658f353b2cffd1e7971fbba255b803f781e86c3a6d5f1b"
18
18
  },
19
19
  {
20
20
  "path": "skills/deep-research/scripts/deep-research.workflow",
21
- "sha256": "5207a175f1f1b4144d1c1e53c66e351c20006444e9d31abc7ce3f9be9204df3c"
21
+ "sha256": "3928a54b360fbee4a942f2b0172ad7607a7350500f9ea5ad413a9c2dcbce2ed7"
22
22
  },
23
23
  {
24
24
  "path": "skills/deep-research/scripts/materialize_report.py",
@@ -138,7 +138,7 @@
138
138
  },
139
139
  {
140
140
  "path": "skills/pptx/references/operations.md",
141
- "sha256": "ef0a0f508b562d65d16624cf126075c33924a156b71efbe4cc0ff995a1be87d1"
141
+ "sha256": "7e65b53b63b25d6c0a84598946fcbf98c341f2d32ce356801a011ffa408b01bf"
142
142
  },
143
143
  {
144
144
  "path": "skills/pptx/requirements.txt",
@@ -146,11 +146,11 @@
146
146
  },
147
147
  {
148
148
  "path": "skills/pptx/scripts/pptx_tool.py",
149
- "sha256": "b67bf31e00ea81904b89b2dc3a48dc346e0a940f99cd86c9c042a81d8b331465"
149
+ "sha256": "71a90eb26a581e0d7f06e5b1765b4ab26cc494085d2b8ed4a8ec219a3282799e"
150
150
  },
151
151
  {
152
152
  "path": "skills/pptx/scripts/smoke_test.py",
153
- "sha256": "200d9d5f1ffdaa8497c589877f0941d8cf79a94743ddb737952e0aeab5179ba0"
153
+ "sha256": "6b52cc0be763dcf3b7d1ab5e4418f56549d858cc6415fce041b1692d078bc26d"
154
154
  },
155
155
  {
156
156
  "path": "skills/review/SKILL.md",
@@ -217,8 +217,8 @@
217
217
  "xlsx"
218
218
  ],
219
219
  "source": {
220
- "commit": "c0ba68e7aee0994318913aa9fcaad4f57cbc11d7",
220
+ "commit": "2de7491964d92e3dc78f13290d875c800ac6e22d",
221
221
  "repository": "https://github.com/kolega-ai/kolega-skills",
222
- "tag": "v0.3.0"
222
+ "tag": "v0.3.2"
223
223
  }
224
224
  }
@@ -192,7 +192,7 @@ The workflow derives every path deterministically:
192
192
 
193
193
  Scouts write their dossier with `exec_command` and return only a compact record
194
194
  plus `dossier_path`. Verification, coverage, drafting, and audit receive paths and
195
- read the depth they need with `read_file_section`. This is what keeps the
195
+ read the depth they need with `read` (offset/limit for sections). This is what keeps the
196
196
  handoffs compact without starving later stages of evidence.
197
197
 
198
198
  The scratchpad is additive and best-effort. When `workspace` is omitted, a worker
@@ -1335,9 +1335,10 @@ WRITE_INSTRUCTIONS = (
1335
1335
  )
1336
1336
 
1337
1337
  READ_INSTRUCTIONS = (
1338
- "Read the referenced files with read_file_section (preferred) or read_entire_file "
1339
- "using the absolute paths given. If a file is missing or unreadable, continue from "
1340
- "the inline records below and note the degradation in your gaps."
1338
+ "Read the referenced files with the read tool (using offset/limit for "
1339
+ "sections) using the absolute paths given. If a file is missing or "
1340
+ "unreadable, continue from the inline records below and note the "
1341
+ "degradation in your gaps."
1341
1342
  )
1342
1343
 
1343
1344
 
@@ -149,10 +149,12 @@ A create job has this top-level shape:
149
149
  }
150
150
  ```
151
151
 
152
- `template` is optional. Without one, `python-pptx`'s default presentation is used. With one, the
153
- template's masters and layouts are retained. Existing template slides are removed by default;
154
- set `keep_template_slides` to `true` to retain them. Template removal uses the same
155
- version-aware, reopen-verified relationship adapter as edit operations.
152
+ `template` is optional. Without one, `python-pptx`'s 10 × 7.5-inch (4:3) default presentation is
153
+ used. The schema does not resize a presentation; use a template with the required slide size
154
+ before authoring absolute-inch geometry for another aspect ratio. With a template, its masters,
155
+ layouts, and slide size are retained. Existing template slides are removed by default; set
156
+ `keep_template_slides` to `true` to retain them. Template removal uses the same version-aware,
157
+ reopen-verified relationship adapter as edit operations.
156
158
 
157
159
  A slide may select a `layout` with either `{"name": "Exact Layout Name"}` or `{"index": 1}`.
158
160
  If `layout` is omitted, layout index 1 is used and must exist. Duplicate layout names are
@@ -198,7 +200,9 @@ Supported actions:
198
200
  - `replace_image`: select one picture and provide `path`. The replacement must use the same media
199
201
  content type. Geometry/crop and unselected picture relationships remain unchanged; the selected
200
202
  picture receives a relationship to the validated replacement image.
201
- - `set_notes`: select a slide and provide plain `text`.
203
+ - `set_notes`: select a slide and provide plain `text`. Written decks include and verify the
204
+ presentation-level notes-master owner reference required for PowerPoint and Keynote
205
+ interoperability.
202
206
  - `remove_slide`: select exactly one slide.
203
207
  - `reorder_slides`: provide `slide_ids` containing every current slide ID exactly once.
204
208
 
@@ -263,10 +267,13 @@ Elements:
263
267
 
264
268
  Chart types are `column`, `bar`, `line`, `line_markers`, `pie`, `doughnut`, `area`, `scatter`,
265
269
  and `scatter_lines`. Add `title` and `has_legend` as needed. Tables and charts remain editable.
266
- Notes are plain text only. Resource files are bounded and validated before use. Images are limited
267
- to 50 MiB compressed, 20,000 pixels per dimension, 50 million pixels, one frame, and an estimated
268
- 200 MiB decoded raster. Each image path is read once into a bounded immutable byte snapshot;
269
- Pillow validation, full decode, and `python-pptx` ingestion all consume that same snapshot.
270
+ Notes are plain text only. The tool repairs and validates the notes-master relationship graph that
271
+ `python-pptx` 1.x can otherwise serialize without its presentation-level owner reference, which
272
+ some consumers including Keynote reject. Resource files are bounded and validated before use.
273
+ Images are limited to 50 MiB compressed, 20,000 pixels per dimension, 50 million pixels, one
274
+ frame, and an estimated 200 MiB decoded raster. Each image path is read once into a bounded
275
+ immutable byte snapshot; Pillow validation, full decode, and `python-pptx` ingestion all consume
276
+ that same snapshot.
270
277
 
271
278
  ## LibreOffice prerequisite
272
279
 
@@ -95,6 +95,7 @@ P_NS = "http://schemas.openxmlformats.org/presentationml/2006/main"
95
95
  A_NS = "http://schemas.openxmlformats.org/drawingml/2006/main"
96
96
  R_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
97
97
  NOTES_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide"
98
+ NOTES_MASTER_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster"
98
99
  SLIDE_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide"
99
100
  OFFICE_DOCUMENT_REL = (
100
101
  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
@@ -814,6 +815,92 @@ class OoxmlAdapter:
814
815
  for slide_id in ordered_ids:
815
816
  slide_id_list.append(by_id[slide_id])
816
817
 
818
+ @classmethod
819
+ def ensure_notes_master_reference(cls, presentation: Any) -> None:
820
+ """Repair python-pptx's missing presentation-level notes-master owner reference."""
821
+
822
+ cls.require_supported_version()
823
+ relationships = [
824
+ (rel_id, relationship)
825
+ for rel_id, relationship in presentation.part.rels.items()
826
+ if relationship.reltype == NOTES_MASTER_REL
827
+ ]
828
+ root = presentation.part._element
829
+ master_lists = root.findall(f"{{{P_NS}}}notesMasterIdLst")
830
+ if not relationships:
831
+ if master_lists:
832
+ raise ToolError(
833
+ "post_write_validation",
834
+ "presentation has a notes-master owner reference without a relationship",
835
+ )
836
+ return
837
+ if len(relationships) != 1 or relationships[0][1].is_external:
838
+ raise ToolError(
839
+ "post_write_validation",
840
+ "presentation must contain exactly one internal notes-master relationship",
841
+ {"relationships": len(relationships)},
842
+ )
843
+ relationship_id = relationships[0][0]
844
+ if len(master_lists) > 1:
845
+ raise ToolError(
846
+ "post_write_validation",
847
+ "presentation contains duplicate notes-master owner-reference lists",
848
+ )
849
+ if master_lists:
850
+ master_ids = master_lists[0].findall(f"{{{P_NS}}}notesMasterId")
851
+ if (
852
+ len(master_ids) != 1
853
+ or len(master_lists[0]) != 1
854
+ or master_ids[0].get(f"{{{R_NS}}}id") != relationship_id
855
+ ):
856
+ raise ToolError(
857
+ "post_write_validation",
858
+ "presentation notes-master owner reference conflicts with its relationship",
859
+ {"relationship": relationship_id},
860
+ )
861
+ return
862
+
863
+ master_list = etree.Element(f"{{{P_NS}}}notesMasterIdLst")
864
+ master_id = etree.SubElement(master_list, f"{{{P_NS}}}notesMasterId")
865
+ master_id.set(f"{{{R_NS}}}id", relationship_id)
866
+ children = list(root)
867
+ slide_master_tag = f"{{{P_NS}}}sldMasterIdLst"
868
+ successor_tags = {
869
+ f"{{{P_NS}}}handoutMasterIdLst",
870
+ f"{{{P_NS}}}sldIdLst",
871
+ f"{{{P_NS}}}sldSz",
872
+ f"{{{P_NS}}}notesSz",
873
+ f"{{{P_NS}}}smartTags",
874
+ f"{{{P_NS}}}embeddedFontLst",
875
+ f"{{{P_NS}}}custShowLst",
876
+ f"{{{P_NS}}}photoAlbum",
877
+ f"{{{P_NS}}}custDataLst",
878
+ f"{{{P_NS}}}kinsoku",
879
+ f"{{{P_NS}}}defaultTextStyle",
880
+ f"{{{P_NS}}}modifyVerifier",
881
+ f"{{{P_NS}}}extLst",
882
+ }
883
+ slide_master_indexes = [
884
+ index for index, child in enumerate(children) if child.tag == slide_master_tag
885
+ ]
886
+ if len(slide_master_indexes) > 1:
887
+ raise ToolError(
888
+ "post_write_validation",
889
+ "presentation contains duplicate slide-master ID lists",
890
+ )
891
+ insert_at = slide_master_indexes[0] + 1 if slide_master_indexes else 0
892
+ successor_indexes = [
893
+ index for index, child in enumerate(children) if child.tag in successor_tags
894
+ ]
895
+ if successor_indexes and min(successor_indexes) < insert_at:
896
+ raise ToolError(
897
+ "post_write_validation",
898
+ "presentation child order cannot accept a notes-master owner reference",
899
+ )
900
+ if not slide_master_indexes and successor_indexes:
901
+ insert_at = min(successor_indexes)
902
+ root.insert(insert_at, master_list)
903
+
817
904
  @classmethod
818
905
  def paragraph_has_field(cls, paragraph: Any) -> bool:
819
906
  cls.require_supported_version()
@@ -944,9 +1031,84 @@ def _open_presentation(path: Path, category: str = "bad_input") -> Any:
944
1031
  raise ToolError(category, "python-pptx could not reopen the presentation") from exc
945
1032
 
946
1033
 
1034
+ def _validate_notes_master_reference(path: Path) -> None:
1035
+ try:
1036
+ with zipfile.ZipFile(path) as archive:
1037
+ presentation = _safe_xml(archive.read(PRESENTATION_PART), PRESENTATION_PART)
1038
+ relationships_root = _safe_xml(
1039
+ archive.read(PRESENTATION_RELS),
1040
+ PRESENTATION_RELS,
1041
+ )
1042
+ except (OSError, RuntimeError, zipfile.BadZipFile, KeyError) as exc:
1043
+ raise ToolError(
1044
+ "post_write_validation",
1045
+ "written PPTX notes-master graph could not be inspected",
1046
+ ) from exc
1047
+
1048
+ relationships = [
1049
+ relationship
1050
+ for relationship in relationships_root.findall(f"{{{REL_NS}}}Relationship")
1051
+ if relationship.get("Type") == NOTES_MASTER_REL
1052
+ ]
1053
+ master_lists = presentation.findall(f"{{{P_NS}}}notesMasterIdLst")
1054
+ if not relationships:
1055
+ if master_lists:
1056
+ raise ToolError(
1057
+ "post_write_validation",
1058
+ "written PPTX has a notes-master owner reference without a relationship",
1059
+ )
1060
+ return
1061
+ if len(relationships) != 1 or relationships[0].get("TargetMode") == "External":
1062
+ raise ToolError(
1063
+ "post_write_validation",
1064
+ "written PPTX must contain exactly one internal notes-master relationship",
1065
+ {"relationships": len(relationships)},
1066
+ )
1067
+ if len(master_lists) != 1:
1068
+ raise ToolError(
1069
+ "post_write_validation",
1070
+ "written PPTX is missing its notes-master owner reference",
1071
+ {"owner_reference_lists": len(master_lists)},
1072
+ )
1073
+ master_ids = master_lists[0].findall(f"{{{P_NS}}}notesMasterId")
1074
+ relationship_id = relationships[0].get("Id")
1075
+ if (
1076
+ len(master_ids) != 1
1077
+ or len(master_lists[0]) != 1
1078
+ or master_ids[0].get(f"{{{R_NS}}}id") != relationship_id
1079
+ ):
1080
+ raise ToolError(
1081
+ "post_write_validation",
1082
+ "written PPTX notes-master owner reference does not match its relationship",
1083
+ {"relationship": relationship_id},
1084
+ )
1085
+
1086
+ children = list(presentation)
1087
+ notes_index = children.index(master_lists[0])
1088
+ slide_master_indexes = [
1089
+ index for index, child in enumerate(children) if child.tag == f"{{{P_NS}}}sldMasterIdLst"
1090
+ ]
1091
+ successor_indexes = [
1092
+ index
1093
+ for index, child in enumerate(children)
1094
+ if child.tag in {f"{{{P_NS}}}handoutMasterIdLst", f"{{{P_NS}}}sldIdLst"}
1095
+ ]
1096
+ if (
1097
+ slide_master_indexes
1098
+ and notes_index <= max(slide_master_indexes)
1099
+ or successor_indexes
1100
+ and notes_index >= min(successor_indexes)
1101
+ ):
1102
+ raise ToolError(
1103
+ "post_write_validation",
1104
+ "written PPTX notes-master owner reference is in an invalid presentation order",
1105
+ )
1106
+
1107
+
947
1108
  def _validate_pptx_output(path: Path, expected_ids: list[int]) -> PackageReport:
948
1109
  try:
949
1110
  report = preflight_pptx(path)
1111
+ _validate_notes_master_reference(path)
950
1112
  reopened = _open_presentation(path, "post_write_validation")
951
1113
  except ToolError as exc:
952
1114
  if exc.category in {"bad_input", "resource_limit", "unsupported_operation"}:
@@ -979,6 +1141,7 @@ def _checkpoint_graph_mutation(
979
1141
  if set(retained) != set(before_ids) & set(expected_ids):
980
1142
  raise ToolError("post_write_validation", "retained slide ID calculation failed")
981
1143
  path = checkpoint_dir / f"graph-{ordinal}.pptx"
1144
+ OoxmlAdapter.ensure_notes_master_reference(presentation)
982
1145
  try:
983
1146
  presentation.save(str(path))
984
1147
  except Exception as exc:
@@ -2341,6 +2504,7 @@ def _save_atomic_presentation(
2341
2504
  temporary = _temporary_sibling(destination, ".pptx")
2342
2505
  try:
2343
2506
  _enforce_presentation_limits(presentation)
2507
+ OoxmlAdapter.ensure_notes_master_reference(presentation)
2344
2508
  try:
2345
2509
  presentation.save(str(temporary))
2346
2510
  except Exception as exc: