kolega-code 0.27.0__tar.gz → 0.28.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. {kolega_code-0.27.0 → kolega_code-0.28.0}/CHANGELOG.md +179 -0
  2. {kolega_code-0.27.0 → kolega_code-0.28.0}/PKG-INFO +5 -1
  3. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/__init__.py +25 -3
  4. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/manifest.json +7 -7
  5. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +1 -1
  6. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +4 -3
  7. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +16 -9
  8. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +164 -0
  9. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +146 -1
  10. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/__init__.py +1 -1
  11. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/baseagent.py +419 -164
  12. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/browseragent.py +2 -0
  13. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/coder.py +2 -0
  14. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/compression.py +27 -12
  15. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/context.py +11 -0
  16. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/custom_agents.py +2 -0
  17. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/generalagent.py +2 -0
  18. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/investigationagent.py +2 -0
  19. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/planningagent.py +17 -12
  20. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +1 -1
  21. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/apply_patch.md +1 -0
  22. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +10 -0
  23. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_click.md +7 -0
  24. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_close.md +1 -0
  25. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +5 -0
  26. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_drag.md +1 -0
  27. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_drop.md +1 -0
  28. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +1 -0
  29. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +1 -0
  30. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +1 -0
  31. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_find.md +8 -0
  32. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +1 -0
  33. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_hover.md +1 -0
  34. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_navigate.md +1 -0
  35. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +1 -0
  36. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_network_request.md +5 -0
  37. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +1 -0
  38. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_press_key.md +6 -0
  39. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_resize.md +1 -0
  40. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_scroll.md +5 -0
  41. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_select_option.md +1 -0
  42. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +9 -0
  43. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_tabs.md +11 -0
  44. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +9 -0
  45. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_type.md +1 -0
  46. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +1 -0
  47. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/build_backend.md +12 -0
  48. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/build_frontend.md +12 -0
  49. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/claude_edit.md +8 -0
  50. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/claude_write.md +6 -0
  51. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +18 -0
  52. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/edit.md +53 -0
  53. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/eval.md +14 -0
  54. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/exec_command.md +27 -0
  55. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/get_host.md +2 -0
  56. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/get_task_list.md +6 -0
  57. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +8 -0
  58. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/hashline_edit.md +22 -0
  59. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/hashline_write.md +7 -0
  60. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/kill_command.md +8 -0
  61. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/list_sessions.md +9 -0
  62. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +9 -0
  63. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +10 -0
  64. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/lsp.md +19 -0
  65. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/lsp_edit.md +7 -0
  66. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/multi_edit.md +24 -0
  67. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/read.md +4 -0
  68. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/read_image.md +4 -0
  69. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/resolve.md +8 -0
  70. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/run_workflow.md +17 -0
  71. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/set_goal.md +21 -0
  72. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/skill.md +8 -0
  73. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/snapshot.md +9 -0
  74. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/switch_worktree.md +22 -0
  75. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/update_task_list.md +8 -0
  76. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/web_fetch.md +11 -0
  77. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/web_search.md +9 -0
  78. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/write.md +7 -0
  79. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/write_plan.md +7 -0
  80. kolega_code-0.28.0/kolega_code/agent/prompt_templates/tools/write_stdin.md +17 -0
  81. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/agent_tool.py +124 -0
  82. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/terminal_tool.py +170 -33
  83. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +1 -0
  84. kolega_code-0.28.0/kolega_code/agent/tool_definitions.py +767 -0
  85. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tools.py +175 -1132
  86. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/utils/commands.py +5 -4
  87. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/volatile_context.py +2 -0
  88. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/app.py +65 -21
  89. kolega_code-0.28.0/kolega_code/cli/ask_output.py +24 -0
  90. kolega_code-0.28.0/kolega_code/cli/atif_export.py +1076 -0
  91. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/config.py +241 -8
  92. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/diagnostics.py +21 -0
  93. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/main.py +757 -370
  94. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/messages.py +4 -0
  95. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/model_catalog.py +104 -38
  96. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/model_connection.py +4 -0
  97. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/provider_registry.py +26 -2
  98. kolega_code-0.28.0/kolega_code/cli/session_event_protocol.py +295 -0
  99. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/session_journal.py +538 -54
  100. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/session_store.py +118 -3
  101. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/session_usage.py +19 -2
  102. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/settings.py +38 -0
  103. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/skills.py +14 -13
  104. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/slash_commands.py +18 -5
  105. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/theme.py +2 -12
  106. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/agent_runtime.py +226 -125
  107. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/app_base.py +13 -0
  108. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/changes_screen.py +5 -1
  109. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/command_handlers.py +4 -1
  110. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/custom_model.py +9 -6
  111. kolega_code-0.28.0/kolega_code/cli/tui/pacing.py +58 -0
  112. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/prompt_flows.py +23 -46
  113. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/settings_panel.py +144 -0
  114. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/settings_screen.py +44 -0
  115. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/status_dashboard.py +4 -3
  116. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/sub_agent_screen.py +5 -1
  117. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/terminal_display.py +22 -0
  118. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/transcript.py +11 -7
  119. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/config.py +45 -0
  120. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/events.py +6 -1
  121. kolega_code-0.28.0/kolega_code/extensions.py +182 -0
  122. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/client.py +127 -3
  123. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/exceptions.py +31 -1
  124. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/instrumented_client.py +48 -5
  125. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/ledger.py +33 -2
  126. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/models.py +16 -3
  127. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/anthropic.py +4 -0
  128. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/responses_common.py +80 -11
  129. kolega_code-0.28.0/kolega_code/llm/providers/tinker.py +585 -0
  130. kolega_code-0.28.0/kolega_code/llm/providers/tinker_trace.py +37 -0
  131. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/__init__.py +7 -0
  132. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/accessors.py +71 -7
  133. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/__init__.py +12 -0
  134. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/anthropic.py +10 -0
  135. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/dashscope.py +2 -0
  136. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/deepseek.py +2 -0
  137. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/fireworks.py +8 -0
  138. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/google.py +4 -0
  139. kolega_code-0.28.0/kolega_code/llm/specs/catalog/kimi_coding.py +73 -0
  140. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/moonshot.py +9 -0
  141. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +53 -154
  142. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/openai.py +7 -1
  143. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +13 -5
  144. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/openrouter.py +1174 -886
  145. kolega_code-0.28.0/kolega_code/llm/specs/catalog/thinking_machines.py +36 -0
  146. kolega_code-0.28.0/kolega_code/llm/specs/catalog/tinker.py +244 -0
  147. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/together.py +2 -0
  148. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/xai.py +3 -0
  149. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/catalog/zai.py +2 -0
  150. kolega_code-0.28.0/kolega_code/llm/specs/ollama_cloud_catalog.py +364 -0
  151. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/openrouter_catalog.py +8 -1
  152. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/thinking.py +18 -0
  153. kolega_code-0.28.0/kolega_code/llm/specs/tinker_catalog.py +240 -0
  154. kolega_code-0.28.0/kolega_code/llm/specs/validation.py +17 -0
  155. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/usage.py +1 -1
  156. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/tools.py +3 -2
  157. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/serializer.py +3 -1
  158. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/terminal.py +216 -29
  159. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/scratchpad.py +21 -0
  160. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/base.py +26 -5
  161. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/terminal.py +321 -47
  162. kolega_code-0.28.0/kolega_code/services/terminal_buffer.py +587 -0
  163. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/tools/__init__.py +0 -4
  164. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/tools/core.py +26 -0
  165. kolega_code-0.28.0/kolega_code/tools/definitions.py +68 -0
  166. {kolega_code-0.27.0 → kolega_code-0.28.0}/pyproject.toml +16 -2
  167. kolega_code-0.27.0/kolega_code/cli/ask_output.py +0 -104
  168. kolega_code-0.27.0/kolega_code/llm/specs/catalog/kimi_coding.py +0 -41
  169. kolega_code-0.27.0/kolega_code/services/terminal_buffer.py +0 -135
  170. kolega_code-0.27.0/kolega_code/tools/definitions.py +0 -194
  171. {kolega_code-0.27.0 → kolega_code-0.28.0}/.gitignore +0 -0
  172. {kolega_code-0.27.0 → kolega_code-0.28.0}/CONTRIBUTING.md +0 -0
  173. {kolega_code-0.27.0 → kolega_code-0.28.0}/LICENSE +0 -0
  174. {kolega_code-0.27.0 → kolega_code-0.28.0}/MIGRATION.md +0 -0
  175. {kolega_code-0.27.0 → kolega_code-0.28.0}/README.md +0 -0
  176. {kolega_code-0.27.0 → kolega_code-0.28.0}/RELEASING.md +0 -0
  177. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  178. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  179. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  180. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  181. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  182. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  183. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  184. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  185. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  186. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  187. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  188. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  189. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  190. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  191. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  192. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  193. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  194. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  195. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  196. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  197. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  198. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  199. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  200. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  201. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  202. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  203. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  204. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  205. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  206. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  207. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  208. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  209. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  210. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  211. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  212. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  213. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  214. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  215. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  216. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  217. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  218. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  219. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  220. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  221. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  222. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  223. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/common.py +0 -0
  224. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/conversation.py +0 -0
  225. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/edit_protocols.py +0 -0
  226. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/errors.py +0 -0
  227. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/__init__.py +0 -0
  228. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/bridge.py +0 -0
  229. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  230. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  231. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/env.py +0 -0
  232. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  233. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/kernel.py +0 -0
  234. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/prelude.js +0 -0
  235. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/prelude.py +0 -0
  236. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/protocol.py +0 -0
  237. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  238. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/runner.js +0 -0
  239. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/eval/runner.py +0 -0
  240. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/goal.py +0 -0
  241. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/model_routing.py +0 -0
  242. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  243. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  244. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/budget.py +0 -0
  245. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/context.py +0 -0
  246. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/errors.py +0 -0
  247. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/executor.py +0 -0
  248. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/guide.py +0 -0
  249. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/journal.py +0 -0
  250. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  251. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/orchestration/types.py +0 -0
  252. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_dump.py +0 -0
  253. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_overrides.py +0 -0
  254. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_provider.py +0 -0
  255. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  256. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  257. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  258. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  259. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  260. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  261. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  262. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  263. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  264. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  265. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  266. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  267. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  268. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  269. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  270. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  271. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  272. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  273. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  274. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  275. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  276. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  277. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  278. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  279. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  280. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  281. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  282. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  283. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  284. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  285. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  286. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  287. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  288. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/prompts.py +0 -0
  289. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  290. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  291. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  292. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  293. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  294. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  295. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  296. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  297. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  298. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  299. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  300. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  301. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  302. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  303. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  304. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  305. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  306. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  307. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  308. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  309. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  310. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  311. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  312. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  313. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  314. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  315. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  316. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  317. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  318. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  319. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  320. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/auth/__init__.py +0 -0
  321. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/auth/_jwt.py +0 -0
  322. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  323. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/auth/constants.py +0 -0
  324. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/auth/tokens.py +0 -0
  325. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/__init__.py +0 -0
  326. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/framing.py +0 -0
  327. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/installer.py +0 -0
  328. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/manager.py +0 -0
  329. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/multiplex.py +0 -0
  330. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/native_host.py +0 -0
  331. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/protocol.py +0 -0
  332. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/registry.py +0 -0
  333. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/browser_extension/runtime.py +0 -0
  334. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/__init__.py +0 -0
  335. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/browser_backend.py +0 -0
  336. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/clipboard_image.py +0 -0
  337. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/connection.py +0 -0
  338. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/cron.py +0 -0
  339. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/file_index.py +0 -0
  340. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/goal.py +0 -0
  341. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/loop.py +0 -0
  342. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/mentions.py +0 -0
  343. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/plan_artifacts.py +0 -0
  344. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/session_event_store.py +0 -0
  345. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/__init__.py +0 -0
  346. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/constants.py +0 -0
  347. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  348. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  349. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  350. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/session_diff.py +0 -0
  351. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/state.py +0 -0
  352. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/styles.tcss +0 -0
  353. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/tui/widgets.py +0 -0
  354. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/cli/updater.py +0 -0
  355. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/git_env.py +0 -0
  356. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/__init__.py +0 -0
  357. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/backends.py +0 -0
  358. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/config.py +0 -0
  359. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/dispatcher.py +0 -0
  360. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/events.py +0 -0
  361. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/matcher.py +0 -0
  362. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/hooks/outcome.py +0 -0
  363. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/__init__.py +0 -0
  364. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  365. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/base.py +0 -0
  366. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  367. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  368. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/google.py +0 -0
  369. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/models.py +0 -0
  370. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/openai.py +0 -0
  371. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  372. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/ratelimit.py +0 -0
  373. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/specs/types.py +0 -0
  374. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/timeouts.py +0 -0
  375. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  376. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/local_state.py +0 -0
  377. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/__init__.py +0 -0
  378. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/config.py +0 -0
  379. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/oauth.py +0 -0
  380. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/service.py +0 -0
  381. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/state.py +0 -0
  382. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/mcp/transport.py +0 -0
  383. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/__init__.py +0 -0
  384. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/identity.py +0 -0
  385. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/manager.py +0 -0
  386. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/manifest.py +0 -0
  387. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/markdown.py +0 -0
  388. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/models.py +0 -0
  389. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/protocol.py +0 -0
  390. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/memory/registry.py +0 -0
  391. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/models/__init__.py +0 -0
  392. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  393. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/permissions.py +0 -0
  394. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/runtime.py +0 -0
  395. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/README.md +0 -0
  396. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/__init__.py +0 -0
  397. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  398. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/base.py +0 -0
  399. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/browser.py +0 -0
  400. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/event_loop.py +0 -0
  401. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/filesystem.py +0 -0
  402. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/local.py +0 -0
  403. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/sandbox/utils.py +0 -0
  404. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/security/__init__.py +0 -0
  405. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/security/secrets.py +0 -0
  406. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/browser.py +0 -0
  407. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/file_system.py +0 -0
  408. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/html.py +0 -0
  409. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/__init__.py +0 -0
  410. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/client.py +0 -0
  411. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/config.py +0 -0
  412. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/detector.py +0 -0
  413. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  414. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/edits.py +0 -0
  415. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/manager.py +0 -0
  416. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/registry.py +0 -0
  417. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/lsp/registry.yaml +0 -0
  418. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/snapshots.py +0 -0
  419. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/services/workspace_scan.py +0 -0
  420. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/__init__.py +0 -0
  421. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/control.py +0 -0
  422. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/inmemory.py +0 -0
  423. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/projection.py +0 -0
  424. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/recording.py +0 -0
  425. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/runtime.py +0 -0
  426. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/session/store.py +0 -0
  427. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/testing/__init__.py +0 -0
  428. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/testing/store_conformance.py +0 -0
  429. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/tools/param_aliases.py +0 -0
  430. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/tools/registry.py +0 -0
  431. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/utils/__init__.py +0 -0
  432. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/utils/images.py +0 -0
  433. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/__init__.py +0 -0
  434. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/assets/fold.js +0 -0
  435. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/assets/player.css +0 -0
  436. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/assets/player.html +0 -0
  437. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/assets/player.js +0 -0
  438. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/bundle.py +0 -0
  439. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/hosting.py +0 -0
  440. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/redaction.py +0 -0
  441. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/server.py +0 -0
  442. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/singlefile.py +0 -0
  443. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/web/theme_css.py +0 -0
  444. {kolega_code-0.27.0 → kolega_code-0.28.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,185 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.28.0 - 2026-08-11
10
+
11
+ ### Added
12
+
13
+ - ATIF v1.7 trajectory export: `sessions export --format atif` converts any
14
+ session (including pre-upgrade v1 sessions, with explicit conversion
15
+ warnings) into a validated [ATIF](https://github.com/harbor-framework/harbor/blob/main/rfcs/0001-trajectory-format.md)
16
+ document, and `ask --atif-output FILE` writes one directly when a run ends —
17
+ completed, failed, or cancelled, with or without `--save`. Embedded subagent
18
+ trajectories, per-step token metrics, hydrated oversized tool results, and
19
+ atomic file+assets output; image trajectories require `--output`/a file
20
+ destination for portable relative asset paths.
21
+
22
+ - The interactive CLI and `ask` can now load one installed Python extension at
23
+ launch with `--extension MODULE:FACTORY` and an optional opaque
24
+ `--extension-config PATH`. An extension contributes ordinary prompt and tool
25
+ extensions, binds to each top-level agent generation before its first model
26
+ request, may observe structured LLM trace records (forwarded to every LLM
27
+ client like the usage ledger), and is cleaned up exactly once per generation,
28
+ including on interactive agent rebuilds. Extension contracts are exported
29
+ from the package root, alongside `llm_call_origin`/`helper_origin` and
30
+ `TinkerTraceRecord`; a minimal example package lives in `examples/extension`.
31
+
32
+ - Agent Skills can now be enabled or disabled from Settings,
33
+ `settings.json`, `KOLEGA_CODE_SKILLS`, or `--skills on|off`.
34
+
35
+ - The TUI status usage panel now shows the provider cache hit percentage
36
+ alongside the other usage figures.
37
+
38
+ - After quitting, the CLI prints the exact
39
+ `kolega-code . --resume <id>` command to resume the session that was just
40
+ saved.
41
+
42
+ - Hosts can now continue a restored conversation without inserting a user
43
+ message: `BaseAgent.continue_from_history_stream()` runs the ordinary agent
44
+ loop (compaction, tool execution, usage accounting, and cancellation
45
+ included) and yields the same chunk format. Sessions containing such a
46
+ continuation turn are not loadable by older kolega-code versions.
47
+
48
+ - Oversized terminal command output is now spilled to a file instead of being
49
+ lost: the tool result keeps the bounded head/tail preview plus a path to
50
+ the full output, and the PTY is drained before detaching so a killed
51
+ command keeps its final output.
52
+
53
+ ### Changed
54
+
55
+ - Automatic compaction now gets one recovery attempt when the ordinary pass —
56
+ which keeps the six most recent messages verbatim — still leaves a request
57
+ above the model's resolved input budget: a second pass with no retained tail
58
+ (`keep_recent=0`, journaled with trigger `auto_tail_fallback`) folds
59
+ everything before the safe boundary into the summary, still without touching
60
+ the raw history or splitting a tool call from its result. A pass that failed
61
+ at the model or hit the minimum-history guard is not retried. When the paired
62
+ `--context-window-tokens` + `--max-output-tokens` cap is active and the
63
+ request still does not fit, the run now fails closed with
64
+ `LLMContextWindowExceededError` before the primary model is called (recorded
65
+ as the `run.failed` error code) instead of dispatching the oversized request;
66
+ uncapped runs keep the legacy provider-accept-or-reject behavior.
67
+
68
+ - **Breaking:** `kolega-code ask --json` now streams the semantic session-event
69
+ protocol — one v2 event envelope per line (`schema: "kolega.session.event"`,
70
+ stable `id`/`seq`/`timestamp`, agent lineage, typed `payload`) — replacing
71
+ the former `{"kind": "message"|"event"|"summary"}` records with no
72
+ compatibility flag. Live output and the new
73
+ `sessions export --format events-jsonl` return the same records. Every run
74
+ records the full journal (LLM call ids, subagent turns and tool results,
75
+ `context.system`, compaction/rewind provenance, and `run.completed`/
76
+ `run.failed`/`run.cancelled` terminals on every exit path); unsaved runs use
77
+ an in-memory journal and leave no session state. Plain (non-JSON) `ask`
78
+ output is unchanged. Session journals now write schema v2 events (v1
79
+ sessions remain readable; resumed v1 sessions append v2 lines — older
80
+ kolega-code versions will refuse to read those journals rather than
81
+ mis-replaying them).
82
+
83
+ - Tool definitions are now explicit, checked-in artifacts. Every built-in
84
+ tool's model-visible description lives as data beside the prompt assets
85
+ (`kolega_code/agent/prompt_templates/tools/`) and its input schema as a
86
+ literal dict in `kolega_code/agent/tool_definitions.py`; nothing about what
87
+ the model sees is derived from signatures or docstrings anymore, and the
88
+ migration is byte-identical on the wire. `ToolExtension` tools (including
89
+ CLI extensions loaded with `--extension` and MCP tools) now declare an
90
+ explicit `tool_descriptions` entry alongside `tool_schemas`; a tool missing
91
+ either fails at registration with a clear error before any model request.
92
+
93
+ - TUI responsiveness for long sessions is improved: the transcript scrollback
94
+ window is capped at 120 mounted entries (scroll-up still walks the full
95
+ history), flush cadences are unified and paced by event-loop lateness,
96
+ modal inspectors stay on the unpaced base cadence, and the native Tinker
97
+ stack no longer loads at package import time — faster startup and fewer
98
+ event-loop stalls.
99
+
100
+ ### Removed
101
+
102
+ - The `tool_definition_from_callable` helper (and the `Args:`-block
103
+ strip/keep rules behind it) is gone, including its `kolega_code` package
104
+ root export: definitions are declared, not derived.
105
+
106
+ ### Fixed
107
+
108
+ - A session could be opened in two kolega-code instances at once, interleaving
109
+ duplicate event sequence numbers into the session journal until it became
110
+ unreadable (and `switch_worktree`/`save` failed with "Session event sequence
111
+ gap"). Resuming a session that is already open in another instance is now
112
+ refused with a clear error, journal appends allocate sequence numbers under
113
+ a cross-process lock, and `kolega-code sessions repair <id>` renumbers a
114
+ corrupted journal back into a contiguous sequence.
115
+
116
+ - File tools (`read`, `write`, `edit`, `multi_edit`, `read_image`) now expand
117
+ a `$KOLEGA_SCRATCHPAD` (or `${KOLEGA_SCRATCHPAD}`) reference in path
118
+ arguments to the session scratchpad at the tool-dispatch choke point, so
119
+ the shell spelling no longer creates a literal `$KOLEGA_SCRATCHPAD`
120
+ directory in the workspace.
121
+
122
+ - Runtime model-catalog caches created before input-budget conventions were
123
+ introduced are now ignored safely instead of injecting incomplete model
124
+ specs that fail later with `KeyError: 'input_budget'`. Refreshing a catalog
125
+ rewrites it in the current schema.
126
+
127
+ - Kimi Coding Plan model IDs now match the provider's real wire IDs:
128
+ `k3-256k` (fixed 256K K3 route) and `kimi-for-coding-highspeed` are
129
+ recognized, and the fabricated `k3[1m]` ID is gone (Kimi's 1M context is
130
+ the same `k3` ID, tier-gated). Kimi and Moonshot input budgets treat output
131
+ as a separate allowance (verified by live probes), so the full context
132
+ window is usable as input instead of being cut down by the output cap.
133
+
134
+ - OpenAI and ChatGPT gpt-5.x requests that reproduced reserved Harmony
135
+ control-token spellings as data (for example after a tool result read a
136
+ file containing `<|channel|>`-style tokens) were rejected with
137
+ `APIError: Request blocked`, permanently poisoning the session. The
138
+ spellings are now escaped on the transport copy only — the persisted
139
+ transcript is unchanged — and already-poisoned sessions heal on the next
140
+ request.
141
+
142
+ - Responses-based providers (OpenAI, ChatGPT, DeepSeek) now return multiple
143
+ tool calls per model round instead of one at a time.
144
+
145
+ - After history compaction (automatic or `/compact`) the approved plan and
146
+ the shared task list are re-injected into the model's context as system
147
+ reminders, so the model no longer loses track of them mid-run.
148
+
149
+ - Terminal sessions that end while a backgrounded `&` job still holds the PTY
150
+ are now reported as exited instead of spinning through the whole yield
151
+ window, and naturally exited sessions are hidden from the session listing
152
+ instead of lingering as stale entries.
153
+
154
+ - The shared terminal-tools guidance now warns that `rg -r` means
155
+ `--replace` (recursion is the default), which previously made `rg -rn`
156
+ output look like a redaction layer.
157
+
158
+ ## 0.27.1 - 2026-08-10
159
+
160
+ ### Added
161
+
162
+ - Thinking Machines models can now be used through either the hosted API or
163
+ the native Tinker `SamplingClient`, with model discovery, settings, usage
164
+ tracking, and connection testing integrated across the CLI and TUI.
165
+ - History compression thresholds can now be configured from Settings,
166
+ `settings.json`, `KOLEGA_CODE_COMPRESSION_THRESHOLD`, or
167
+ `--compression-threshold`.
168
+ - Sub-agent dispatch can now be enabled or disabled for a session from
169
+ Settings, `settings.json`, `KOLEGA_CODE_SUBAGENTS`, or `--subagents on|off`.
170
+
171
+ ### Changed
172
+
173
+ - Compression summaries can use up to 8,192 tokens, reducing the risk that
174
+ important context is lost in longer sessions.
175
+ - The bundled OpenRouter catalogue was refreshed from the 2026-08-10 model
176
+ list and weekly rankings. It now includes 260 tool-capable models, including
177
+ featured `deepseek/deepseek-v4-flash-0731`.
178
+
179
+ ### Fixed
180
+
181
+ - Provider connection tests now send a system message, improving compatibility
182
+ with models that reject probes containing only a user message.
183
+
184
+ ### Security
185
+
186
+ - Updated `h2` to `4.4.1` to address `GHSA-6hr6-w5qg-qmwg`.
187
+
9
188
  ## 0.27.0 - 2026-08-06
10
189
 
11
190
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.27.0
3
+ Version: 0.28.0
4
4
  Summary: Multi-agent coding in the terminal
5
5
  Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
6
6
  Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
@@ -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'
@@ -276,6 +277,9 @@ Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
276
277
  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'
280
+ Provides-Extra: tinker
281
+ Requires-Dist: tinker-cookbook==0.5.3; extra == 'tinker'
282
+ Requires-Dist: tml-renderers==0.1.0; extra == 'tinker'
279
283
  Description-Content-Type: text/markdown
280
284
 
281
285
  # Kolega Code
@@ -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.0"
176
+ __version__ = "0.28.0"
@@ -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: