kolega-code 0.45.1__tar.gz → 0.46.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 (508) hide show
  1. {kolega_code-0.45.1 → kolega_code-0.46.0}/CHANGELOG.md +44 -0
  2. {kolega_code-0.45.1 → kolega_code-0.46.0}/PKG-INFO +4 -3
  3. {kolega_code-0.45.1 → kolega_code-0.46.0}/README.md +1 -0
  4. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/__init__.py +1 -1
  5. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/__init__.py +1 -1
  6. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/baseagent.py +1 -3
  7. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/context.py +3 -5
  8. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/model_routing.py +2 -0
  9. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/terminal_tool.py +1 -3
  10. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +1 -3
  11. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/config.py +88 -4
  12. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/messages.py +7 -0
  13. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/model_catalog.py +30 -2
  14. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/model_connection.py +4 -1
  15. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/provider_registry.py +22 -0
  16. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/settings.py +6 -0
  17. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/onboarding_screen.py +30 -2
  18. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/settings_panel.py +59 -0
  19. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/settings_screen.py +17 -0
  20. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/styles.tcss +2 -1
  21. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/config.py +36 -0
  22. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/client.py +44 -13
  23. kolega_code-0.46.0/kolega_code/llm/cloudflare_workers_ai.py +82 -0
  24. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/exceptions.py +65 -0
  25. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/instrumented_client.py +11 -2
  26. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/openai.py +32 -2
  27. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/__init__.py +2 -0
  28. kolega_code-0.46.0/kolega_code/llm/specs/catalog/cloudflare_workers_ai.py +151 -0
  29. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/kimi_coding.py +32 -0
  30. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/moonshot.py +30 -0
  31. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +51 -3
  32. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/openrouter.py +1299 -1231
  33. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/tinker.py +78 -2
  34. kolega_code-0.46.0/kolega_code/llm/specs/cloudflare_workers_ai_catalog.py +249 -0
  35. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/thinking.py +11 -1
  36. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/usage.py +1 -0
  37. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/security/secrets.py +1 -0
  38. {kolega_code-0.45.1 → kolega_code-0.46.0}/pyproject.toml +13 -4
  39. {kolega_code-0.45.1 → kolega_code-0.46.0}/.gitignore +0 -0
  40. {kolega_code-0.45.1 → kolega_code-0.46.0}/CONTRIBUTING.md +0 -0
  41. {kolega_code-0.45.1 → kolega_code-0.46.0}/LICENSE +0 -0
  42. {kolega_code-0.45.1 → kolega_code-0.46.0}/MIGRATION.md +0 -0
  43. {kolega_code-0.45.1 → kolega_code-0.46.0}/RELEASING.md +0 -0
  44. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  45. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  46. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  47. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  48. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  49. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  50. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  51. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  52. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  53. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  54. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  55. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  56. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  57. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  58. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  59. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  60. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  61. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  62. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  63. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  64. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  65. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  66. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  67. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  68. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  69. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  70. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  71. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  72. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  73. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  74. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  75. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  76. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  77. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  78. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  79. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  80. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  81. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  82. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  83. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  84. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  85. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  86. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  87. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  88. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  89. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  90. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  91. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  92. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  93. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  94. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  95. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  96. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/__init__.py +0 -0
  97. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/agent_factory.py +0 -0
  98. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/bridge.py +0 -0
  99. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/diffs.py +0 -0
  100. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/permissions.py +0 -0
  101. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/plans.py +0 -0
  102. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/questions.py +0 -0
  103. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/server.py +0 -0
  104. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/session.py +0 -0
  105. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/acp/usage.py +0 -0
  106. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/browseragent.py +0 -0
  107. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/coder.py +0 -0
  108. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/common.py +0 -0
  109. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/compression.py +0 -0
  110. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/conversation.py +0 -0
  111. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/custom_agents.py +0 -0
  112. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/edit_protocols.py +0 -0
  113. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/errors.py +0 -0
  114. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/__init__.py +0 -0
  115. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/bridge.py +0 -0
  116. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  117. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  118. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/env.py +0 -0
  119. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  120. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/kernel.py +0 -0
  121. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/prelude.js +0 -0
  122. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/prelude.py +0 -0
  123. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/protocol.py +0 -0
  124. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  125. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/runner.js +0 -0
  126. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/eval/runner.py +0 -0
  127. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/generalagent.py +0 -0
  128. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/goal.py +0 -0
  129. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/handoff.py +0 -0
  130. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/investigationagent.py +0 -0
  131. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  132. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  133. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/budget.py +0 -0
  134. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/context.py +0 -0
  135. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/errors.py +0 -0
  136. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/executor.py +0 -0
  137. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/guide.py +0 -0
  138. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/journal.py +0 -0
  139. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  140. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/orchestration/types.py +0 -0
  141. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/planningagent.py +0 -0
  142. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_dump.py +0 -0
  143. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_overrides.py +0 -0
  144. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_provider.py +0 -0
  145. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  146. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  147. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  148. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  149. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  150. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.system.md +0 -0
  151. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/handoff/document.user.md.j2 +0 -0
  152. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  153. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  154. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  155. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  156. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  157. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  158. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  159. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  160. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  161. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  162. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  163. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  164. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  165. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  166. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  167. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  168. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  169. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  170. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  171. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  172. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  173. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  174. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  175. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  176. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  177. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  178. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  179. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/agent_job.md +0 -0
  180. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  181. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  182. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  183. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  184. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  185. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  186. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  187. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  188. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  189. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  190. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  191. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  192. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  193. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  194. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  195. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  196. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  197. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  198. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  199. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  200. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  201. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  202. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  203. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  204. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  205. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  206. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  207. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  208. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  209. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  210. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  211. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  212. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  213. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  214. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  215. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  216. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  217. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  218. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  219. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  220. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_agents.md +0 -0
  221. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  222. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  223. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  224. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  225. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  226. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  227. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  228. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  229. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  230. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  231. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/send_message.md +0 -0
  232. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  233. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  234. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  235. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  236. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  237. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  238. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  239. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  240. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  241. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  242. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  243. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  244. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/prompts.py +0 -0
  245. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/session_metadata.py +0 -0
  246. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  247. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  248. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  249. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  250. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  251. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  252. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  253. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  254. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  255. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  256. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  257. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  258. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  259. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  260. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  261. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  262. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  263. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  264. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  265. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  266. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  267. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  268. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  269. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  270. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  271. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  272. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  273. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  274. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  275. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  276. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  277. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  278. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tool_definitions.py +0 -0
  279. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/tools.py +0 -0
  280. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/utils/commands.py +0 -0
  281. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/agent/volatile_context.py +0 -0
  282. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/auth/__init__.py +0 -0
  283. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/auth/_jwt.py +0 -0
  284. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  285. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/auth/constants.py +0 -0
  286. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/auth/tokens.py +0 -0
  287. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/__init__.py +0 -0
  288. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/framing.py +0 -0
  289. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/installer.py +0 -0
  290. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/manager.py +0 -0
  291. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/multiplex.py +0 -0
  292. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/native_host.py +0 -0
  293. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/protocol.py +0 -0
  294. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/registry.py +0 -0
  295. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/browser_extension/runtime.py +0 -0
  296. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/__init__.py +0 -0
  297. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/acp.py +0 -0
  298. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/app.py +0 -0
  299. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/ask_output.py +0 -0
  300. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/atif_export.py +0 -0
  301. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/browser_backend.py +0 -0
  302. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/clipboard_image.py +0 -0
  303. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/connection.py +0 -0
  304. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/cron.py +0 -0
  305. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/diagnostics.py +0 -0
  306. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/file_index.py +0 -0
  307. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/gateway.py +0 -0
  308. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/goal.py +0 -0
  309. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/loop.py +0 -0
  310. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/main.py +0 -0
  311. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/mentions.py +0 -0
  312. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/peer_messaging.py +0 -0
  313. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/plan_artifacts.py +0 -0
  314. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/prompt_history.py +0 -0
  315. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/session_event_protocol.py +0 -0
  316. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/session_event_store.py +0 -0
  317. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/session_journal.py +0 -0
  318. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/session_store.py +0 -0
  319. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/session_usage.py +0 -0
  320. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/skills.py +0 -0
  321. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/slash_commands.py +0 -0
  322. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/theme.py +0 -0
  323. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/__init__.py +0 -0
  324. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
  325. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/app_base.py +0 -0
  326. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/background_status.py +0 -0
  327. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/boot_splash.py +0 -0
  328. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  329. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  330. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/constants.py +0 -0
  331. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/custom_model.py +0 -0
  332. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/discovery.py +0 -0
  333. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  334. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  335. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/metadata.py +0 -0
  336. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/pacing.py +0 -0
  337. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  338. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/session_diff.py +0 -0
  339. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/settings_widgets.py +0 -0
  340. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/shortcut_bar.py +0 -0
  341. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/startup.py +0 -0
  342. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/state.py +0 -0
  343. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  344. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  345. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/task_list.py +0 -0
  346. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  347. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/tool_presentation.py +0 -0
  348. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/transcript.py +0 -0
  349. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/turn_status.py +0 -0
  350. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/tui/widgets.py +0 -0
  351. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/cli/updater.py +0 -0
  352. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/events.py +0 -0
  353. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/extensions.py +0 -0
  354. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/__init__.py +0 -0
  355. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/access.py +0 -0
  356. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/access_settings.py +0 -0
  357. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/adapters/__init__.py +0 -0
  358. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/adapters/base.py +0 -0
  359. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/adapters/echo.py +0 -0
  360. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/adapters/telegram/__init__.py +0 -0
  361. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/adapters/telegram/adapter.py +0 -0
  362. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/adapters/telegram/formatting.py +0 -0
  363. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/bridge.py +0 -0
  364. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/commands.py +0 -0
  365. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/config.py +0 -0
  366. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/control_relay.py +0 -0
  367. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/daemon.py +0 -0
  368. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/event_router.py +0 -0
  369. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/questions.py +0 -0
  370. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/redaction.py +0 -0
  371. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/router.py +0 -0
  372. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/service.py +0 -0
  373. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/sessions.py +0 -0
  374. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/gateway/stt.py +0 -0
  375. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/git_env.py +0 -0
  376. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/__init__.py +0 -0
  377. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/backends.py +0 -0
  378. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/config.py +0 -0
  379. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/dispatcher.py +0 -0
  380. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/events.py +0 -0
  381. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/matcher.py +0 -0
  382. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/hooks/outcome.py +0 -0
  383. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/ledger.py +0 -0
  384. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/models.py +0 -0
  385. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/__init__.py +0 -0
  386. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  387. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/anthropic.py +0 -0
  388. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/base.py +0 -0
  389. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  390. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  391. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/google.py +0 -0
  392. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/mistral.py +0 -0
  393. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/models.py +0 -0
  394. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  395. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/perplexity_responses.py +0 -0
  396. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/responses_common.py +0 -0
  397. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/tinker.py +0 -0
  398. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  399. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/ratelimit.py +0 -0
  400. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/__init__.py +0 -0
  401. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/accessors.py +0 -0
  402. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  403. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  404. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  405. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  406. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  407. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/groq.py +0 -0
  408. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/minimax.py +0 -0
  409. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/mistral.py +0 -0
  410. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  411. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  412. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/perplexity_agent.py +0 -0
  413. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  414. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  415. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  416. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  417. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  418. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/mistral_catalog.py +0 -0
  419. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  420. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  421. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/perplexity_catalog.py +0 -0
  422. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  423. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/types.py +0 -0
  424. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/specs/validation.py +0 -0
  425. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/timeouts.py +0 -0
  426. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  427. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/local_state.py +0 -0
  428. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/__init__.py +0 -0
  429. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/config.py +0 -0
  430. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/oauth.py +0 -0
  431. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/service.py +0 -0
  432. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/state.py +0 -0
  433. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/tools.py +0 -0
  434. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/mcp/transport.py +0 -0
  435. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/__init__.py +0 -0
  436. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/identity.py +0 -0
  437. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/manager.py +0 -0
  438. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/manifest.py +0 -0
  439. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/markdown.py +0 -0
  440. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/models.py +0 -0
  441. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/protocol.py +0 -0
  442. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/memory/registry.py +0 -0
  443. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/models/__init__.py +0 -0
  444. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  445. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/permissions.py +0 -0
  446. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/runtime.py +0 -0
  447. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/README.md +0 -0
  448. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/__init__.py +0 -0
  449. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  450. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/base.py +0 -0
  451. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/browser.py +0 -0
  452. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/event_loop.py +0 -0
  453. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/filesystem.py +0 -0
  454. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/local.py +0 -0
  455. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/serializer.py +0 -0
  456. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/terminal.py +0 -0
  457. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/sandbox/utils.py +0 -0
  458. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/scratchpad.py +0 -0
  459. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/security/__init__.py +0 -0
  460. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/base.py +0 -0
  461. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/browser.py +0 -0
  462. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/file_system.py +0 -0
  463. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/html.py +0 -0
  464. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/__init__.py +0 -0
  465. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/client.py +0 -0
  466. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/config.py +0 -0
  467. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/detector.py +0 -0
  468. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  469. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/edits.py +0 -0
  470. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/manager.py +0 -0
  471. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/registry.py +0 -0
  472. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/lsp/registry.yaml +0 -0
  473. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/snapshots.py +0 -0
  474. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/terminal.py +0 -0
  475. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/terminal_buffer.py +0 -0
  476. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/services/workspace_scan.py +0 -0
  477. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/__init__.py +0 -0
  478. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/background.py +0 -0
  479. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/control.py +0 -0
  480. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/inbox.py +0 -0
  481. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/inmemory.py +0 -0
  482. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/projection.py +0 -0
  483. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/recording.py +0 -0
  484. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/runtime.py +0 -0
  485. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/session/store.py +0 -0
  486. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/testing/__init__.py +0 -0
  487. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/testing/store_conformance.py +0 -0
  488. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tool_subjects.py +0 -0
  489. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tools/__init__.py +0 -0
  490. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tools/ask_user.py +0 -0
  491. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tools/core.py +0 -0
  492. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tools/definitions.py +0 -0
  493. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tools/param_aliases.py +0 -0
  494. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/tools/registry.py +0 -0
  495. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/utils/__init__.py +0 -0
  496. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/utils/images.py +0 -0
  497. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/__init__.py +0 -0
  498. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/assets/fold.js +0 -0
  499. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/assets/player.css +0 -0
  500. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/assets/player.html +0 -0
  501. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/assets/player.js +0 -0
  502. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/bundle.py +0 -0
  503. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/hosting.py +0 -0
  504. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/redaction.py +0 -0
  505. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/server.py +0 -0
  506. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/singlefile.py +0 -0
  507. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/web/theme_css.py +0 -0
  508. {kolega_code-0.45.1 → kolega_code-0.46.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,50 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.46.0 - 2026-10-27
10
+
11
+ ### Added
12
+
13
+ - **Kimi K3.1 Pro support.** Moonshot's October 2026 K3.1 release is selectable
14
+ on both Kimi providers: `kimi-k3.1-pro` and `kimi-k3.1-pro-highspeed` on
15
+ `moonshot`, and `k3.1-pro` / `k3.1-pro-highspeed` on the Kimi Coding Plan.
16
+ All four always think and expose a `low`/`high`/`max` reasoning-effort ladder;
17
+ the 1M window is catalogued directly where every eligible plan has it. The
18
+ Coding Plan's `k3.1-pro` keeps a 256K budget because its 1M window is gated to
19
+ Pro-and-above plans.
20
+ - **Cloudflare Workers AI support.** Select `cloudflare_workers_ai` with a
21
+ Workers AI API token (`CLOUDFLARE_API_TOKEN` or Settings) and your account ID
22
+ (`CLOUDFLARE_ACCOUNT_ID`, or the new Account ID field on Settings → Providers
23
+ and in onboarding). The curated catalog covers tool-calling models with at
24
+ least a 128K window, led by GLM-5.3 (the default) plus GLM-5.3 Flash,
25
+ Kimi K2.7 Code, DeepSeek V4.1 Flash, GPT-OSS, and more, with Cloudflare's
26
+ per-model reasoning-effort ladders. `kolega-code models refresh --provider
27
+ cloudflare_workers_ai` discovers newer models from your account.
28
+ `CLOUDFLARE_AI_GATEWAY_ID` optionally routes requests through an AI Gateway.
29
+ Exhausted free allocations and Workers Paid-only models report a billing
30
+ error instead of retrying.
31
+
32
+ ### Changed
33
+
34
+ - Refreshed the OpenRouter, Ollama Cloud, and Tinker model catalogs from their
35
+ live endpoints (2026-10-27 snapshots) with newly available models, removal of
36
+ retired entries, updated limits and capabilities, and a refreshed OpenRouter
37
+ featured ordering. OpenRouter also stopped advertising `temperature` for the
38
+ Anthropic family, matching their adaptive thinking behavior. The Perplexity
39
+ Agent catalog is unchanged because its live endpoint could not be read.
40
+ - Updated the documentation site's undici dependency to 8.12.3.
41
+
42
+ ### Security
43
+
44
+ - Updated Brotli to 1.2.1, fixing an out-of-bounds write in the decoder
45
+ (CVE-2026-111497, GHSA-9v8h-qqgm-4m35) reachable through compressed HTTP
46
+ responses.
47
+ - Updated filelock to 4.2.4 for three `SoftFileLock`/`ReadWriteLock`
48
+ advisories (Kolega Code uses neither class) and setuptools to 84.2.0
49
+ (GHSA-xmj3-9gf7-h52w). The dev-only virtualenv pin moves to 21.14.5 so
50
+ filelock 4 resolves; its remaining advisories stay an accepted risk until
51
+ langfuse allows the fixed release.
52
+
9
53
  ## 0.45.1 - 2026-10-23
10
54
 
11
55
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.45.1
3
+ Version: 0.46.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/
@@ -35,7 +35,7 @@ Requires-Dist: cryptography==48.0.1; sys_platform == 'darwin' and platform_machi
35
35
  Requires-Dist: cryptography==50.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'
36
36
  Requires-Dist: ddgs==9.14.4
37
37
  Requires-Dist: fastapi==0.139.2
38
- Requires-Dist: filelock==3.24.2
38
+ Requires-Dist: filelock==4.2.4
39
39
  Requires-Dist: firecrawl-py==4.28.2
40
40
  Requires-Dist: google-genai==2.12.1
41
41
  Requires-Dist: httpx==0.28.1
@@ -83,7 +83,7 @@ Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
83
83
  Requires-Dist: pytest==9.0.3; extra == 'dev'
84
84
  Requires-Dist: ruff==0.15.12; extra == 'dev'
85
85
  Requires-Dist: twine==6.2.0; extra == 'dev'
86
- Requires-Dist: virtualenv==21.7.13; extra == 'dev'
86
+ Requires-Dist: virtualenv==21.14.5; extra == 'dev'
87
87
  Provides-Extra: tinker
88
88
  Requires-Dist: tinker-cookbook==0.5.4; extra == 'tinker'
89
89
  Requires-Dist: tinker==0.25.0; extra == 'tinker'
@@ -277,6 +277,7 @@ Supported model providers:
277
277
  - Z.AI / GLM Coding Plan
278
278
  - Kimi Coding Plan
279
279
  - Ollama Cloud
280
+ - Cloudflare Workers AI
280
281
  - local Llama
281
282
 
282
283
  With a paid **ChatGPT** plan (Plus, Pro, or Business), `/login chatgpt` runs
@@ -185,6 +185,7 @@ Supported model providers:
185
185
  - Z.AI / GLM Coding Plan
186
186
  - Kimi Coding Plan
187
187
  - Ollama Cloud
188
+ - Cloudflare Workers AI
188
189
  - local Llama
189
190
 
190
191
  With a paid **ChatGPT** plan (Plus, Pro, or Business), `/login chatgpt` runs
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.45.1"
177
+ __version__ = "0.46.0"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.45.1"
54
+ __version__ = "0.46.0"
@@ -1901,7 +1901,6 @@ class BaseAgent(LogMixin):
1901
1901
 
1902
1902
  from kolega_code.llm.client import LLMClient
1903
1903
 
1904
- endpoint = self.config.custom_endpoint_for(model_config)
1905
1904
  client = LLMClient(
1906
1905
  provider=model_config.provider.value,
1907
1906
  api_key=self.config.get_api_key(model_config.provider) or "",
@@ -1912,8 +1911,7 @@ class BaseAgent(LogMixin):
1912
1911
  token_manager=self.config.get_chatgpt_token_manager(),
1913
1912
  usage_ledger=self.usage_ledger,
1914
1913
  trace_sink=self.llm_trace_sink,
1915
- base_url=endpoint.base_url if endpoint else None,
1916
- api_style=endpoint.api_style if endpoint else None,
1914
+ **self.config.llm_client_kwargs(model_config),
1917
1915
  )
1918
1916
  with llm_call_origin(helper_origin("hook_prompt")):
1919
1917
  response = await client.generate(
@@ -113,7 +113,7 @@ class AgentContext:
113
113
  itself is still passed per call.
114
114
  """
115
115
  model_config = self.config.model_config_for_agent(agent_name)
116
- endpoint = self.config.custom_endpoint_for(model_config)
116
+ connection_kwargs = self.config.llm_client_kwargs(model_config)
117
117
 
118
118
  if self.telemetry.langfuse_client:
119
119
  return InstrumentedLLMClient(
@@ -136,8 +136,7 @@ class AgentContext:
136
136
  trace_sink=self.telemetry.llm_trace_sink,
137
137
  context_window_tokens=self.config.context_window_tokens,
138
138
  max_output_tokens=self.config.max_output_tokens,
139
- base_url=endpoint.base_url if endpoint else None,
140
- api_style=endpoint.api_style if endpoint else None,
139
+ **connection_kwargs,
141
140
  )
142
141
 
143
142
  return LLMClient(
@@ -152,6 +151,5 @@ class AgentContext:
152
151
  trace_sink=self.telemetry.llm_trace_sink,
153
152
  context_window_tokens=self.config.context_window_tokens,
154
153
  max_output_tokens=self.config.max_output_tokens,
155
- base_url=endpoint.base_url if endpoint else None,
156
- api_style=endpoint.api_style if endpoint else None,
154
+ **connection_kwargs,
157
155
  )
@@ -56,6 +56,8 @@ def provider_is_configured(config: AgentConfig, provider: ModelProvider) -> bool
56
56
  return True
57
57
  if provider == ModelProvider.OPENAI_CHATGPT:
58
58
  return config.openai_chatgpt_tokens is not None
59
+ if provider == ModelProvider.CLOUDFLARE_WORKERS_AI:
60
+ return bool(config.get_api_key(provider)) and bool(config.cloudflare_account_id)
59
61
  return bool(config.get_api_key(provider))
60
62
 
61
63
 
@@ -97,7 +97,6 @@ class TerminalTool(BaseTool):
97
97
  provider = self.config.fast_config.provider
98
98
  api_key = self.config.get_api_key(provider)
99
99
  rate_limits = self.config.fast_config.rate_limits
100
- endpoint = self.config.custom_endpoint_for(self.config.fast_config)
101
100
 
102
101
  client = LLMClient(
103
102
  provider=provider.value,
@@ -109,8 +108,7 @@ class TerminalTool(BaseTool):
109
108
  token_manager=self.config.get_chatgpt_token_manager(),
110
109
  usage_ledger=getattr(self.caller, "usage_ledger", None),
111
110
  trace_sink=getattr(self.caller, "llm_trace_sink", None),
112
- base_url=endpoint.base_url if endpoint else None,
113
- api_style=endpoint.api_style if endpoint else None,
111
+ **self.config.llm_client_kwargs(self.config.fast_config),
114
112
  )
115
113
 
116
114
  try:
@@ -146,7 +146,6 @@ class WebFetchTool(StreamingTool):
146
146
  def _build_client(self) -> LLMClient:
147
147
  provider = self.config.fast_config.provider
148
148
  rate_limits = self.config.fast_config.rate_limits
149
- endpoint = self.config.custom_endpoint_for(self.config.fast_config)
150
149
  client_kwargs = {
151
150
  "provider": provider.value,
152
151
  "api_key": self.config.get_api_key(provider),
@@ -157,8 +156,7 @@ class WebFetchTool(StreamingTool):
157
156
  "token_manager": self.config.get_chatgpt_token_manager(),
158
157
  "usage_ledger": getattr(self.caller, "usage_ledger", None),
159
158
  "trace_sink": getattr(self.caller, "llm_trace_sink", None),
160
- "base_url": endpoint.base_url if endpoint else None,
161
- "api_style": endpoint.api_style if endpoint else None,
159
+ **self.config.llm_client_kwargs(self.config.fast_config),
162
160
  }
163
161
  caller_llm = getattr(self.caller, "llm", None)
164
162
  if isinstance(caller_llm, InstrumentedLLMClient):
@@ -20,6 +20,7 @@ from kolega_code.config import (
20
20
  ModelProvider,
21
21
  RateLimitConfig,
22
22
  )
23
+ from kolega_code.llm import cloudflare_workers_ai
23
24
  from kolega_code.llm.specs import MODEL_SPECS, get_model_specs, model_is_known, normalize_thinking_effort
24
25
  from kolega_code.llm.specs.custom_endpoints import (
25
26
  API_STYLES,
@@ -72,6 +73,7 @@ API_KEY_ENV = {
72
73
  ModelProvider.ZAI: "ZAI_API_KEY",
73
74
  ModelProvider.KIMI_CODING: "KIMI_CODING_API_KEY",
74
75
  ModelProvider.OLLAMA_CLOUD: "OLLAMA_API_KEY",
76
+ ModelProvider.CLOUDFLARE_WORKERS_AI: cloudflare_workers_ai.API_TOKEN_ENV,
75
77
  ModelProvider.OPENROUTER: "OPENROUTER_API_KEY",
76
78
  ModelProvider.THINKING_MACHINES: "TINKER_API_KEY",
77
79
  # Native Tinker sampling authenticates with the same key.
@@ -399,6 +401,45 @@ def _api_key_for_provider(
399
401
  return None
400
402
 
401
403
 
404
+ CLOUDFLARE_MISSING_ACCOUNT_MESSAGE = (
405
+ f"Missing Cloudflare account ID: set {cloudflare_workers_ai.ACCOUNT_ID_ENV} or enter it in Settings → Providers."
406
+ )
407
+
408
+
409
+ def _cloudflare_account_id_source(env: Mapping[str, str], settings: Optional[CliSettings]) -> tuple[Optional[str], str]:
410
+ """The raw account ID and where it came from: the environment wins over Settings."""
411
+ from_env = (env.get(cloudflare_workers_ai.ACCOUNT_ID_ENV) or "").strip()
412
+ if from_env:
413
+ return from_env, cloudflare_workers_ai.ACCOUNT_ID_ENV
414
+ return (settings.cloudflare_account_id if settings else None), "the account ID saved in Settings"
415
+
416
+
417
+ def _cloudflare_route_settings(
418
+ env: Mapping[str, str], settings: Optional[CliSettings], *, required: bool
419
+ ) -> tuple[Optional[str], Optional[str]]:
420
+ """Resolve ``(account_id, gateway_id)``.
421
+
422
+ Invalid values are fatal only when a Cloudflare route is in use; otherwise they
423
+ are dropped so a stale value cannot lock the user out of other providers.
424
+ """
425
+ raw_account, account_source = _cloudflare_account_id_source(env, settings)
426
+ try:
427
+ account_id = cloudflare_workers_ai.normalize_account_id(raw_account)
428
+ except ValueError as exc:
429
+ if required:
430
+ raise CliConfigError(f"Invalid Cloudflare account ID from {account_source}: {exc}") from exc
431
+ account_id = None
432
+ if required and account_id is None:
433
+ raise CliConfigError(CLOUDFLARE_MISSING_ACCOUNT_MESSAGE)
434
+ try:
435
+ gateway_id = cloudflare_workers_ai.normalize_gateway_id(env.get(cloudflare_workers_ai.GATEWAY_ID_ENV))
436
+ except ValueError as exc:
437
+ if required:
438
+ raise CliConfigError(f"Invalid {cloudflare_workers_ai.GATEWAY_ID_ENV}: {exc}") from exc
439
+ gateway_id = None
440
+ return account_id, gateway_id
441
+
442
+
402
443
  def _resolve_chatgpt_tokens(settings: Optional[CliSettings]) -> Optional[OAuthTokens]:
403
444
  """Load stored ChatGPT OAuth tokens from settings, if present and well-formed."""
404
445
  if not settings:
@@ -952,6 +993,10 @@ def build_agent_config(
952
993
  if missing_keys:
953
994
  raise CliConfigError(f"Missing required API key environment variable(s): {', '.join(missing_keys)}")
954
995
 
996
+ cloudflare_account_id, cloudflare_ai_gateway_id = _cloudflare_route_settings(
997
+ loaded_env, settings, required=ModelProvider.CLOUDFLARE_WORKERS_AI in required_providers
998
+ )
999
+
955
1000
  chatgpt_tokens = _resolve_chatgpt_tokens(settings)
956
1001
  if ModelProvider.OPENAI_CHATGPT in required_providers and chatgpt_tokens is None:
957
1002
  raise CliConfigError("Not signed in to ChatGPT. Run /login chatgpt to sign in with your ChatGPT subscription.")
@@ -981,6 +1026,9 @@ def build_agent_config(
981
1026
  zai_api_key=_api_key_for_provider(ModelProvider.ZAI, loaded_env, settings),
982
1027
  kimi_coding_api_key=_api_key_for_provider(ModelProvider.KIMI_CODING, loaded_env, settings),
983
1028
  ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
1029
+ cloudflare_api_token=_api_key_for_provider(ModelProvider.CLOUDFLARE_WORKERS_AI, loaded_env, settings),
1030
+ cloudflare_account_id=cloudflare_account_id,
1031
+ cloudflare_ai_gateway_id=cloudflare_ai_gateway_id,
984
1032
  openrouter_api_key=_api_key_for_provider(ModelProvider.OPENROUTER, loaded_env, settings),
985
1033
  thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
986
1034
  perplexity_api_key=_api_key_for_provider(ModelProvider.PERPLEXITY_AGENT, loaded_env, settings),
@@ -1068,10 +1116,19 @@ def key_status(provider: str, project_path: Path, settings: Optional[CliSettings
1068
1116
  env = load_cli_env(project_path)
1069
1117
  env_name = API_KEY_ENV.get(provider_value)
1070
1118
  if env_name and env.get(env_name):
1071
- return f"present via {env_name}"
1072
- if settings and settings.get_api_key(provider_value.value):
1073
- return "present in local settings"
1074
- return "missing"
1119
+ status = f"present via {env_name}"
1120
+ elif settings and settings.get_api_key(provider_value.value):
1121
+ status = "present in local settings"
1122
+ else:
1123
+ return "missing"
1124
+ if provider_value == ModelProvider.CLOUDFLARE_WORKERS_AI:
1125
+ raw_account, _ = _cloudflare_account_id_source(env, settings)
1126
+ try:
1127
+ if cloudflare_workers_ai.normalize_account_id(raw_account) is None:
1128
+ status += "; account ID missing"
1129
+ except ValueError:
1130
+ status += "; account ID invalid"
1131
+ return status
1075
1132
 
1076
1133
 
1077
1134
  def resolved_api_key(provider: str, project_path: Path, settings: Optional[CliSettings] = None) -> Optional[str]:
@@ -1082,6 +1139,33 @@ def resolved_api_key(provider: str, project_path: Path, settings: Optional[CliSe
1082
1139
  return _api_key_for_provider(_provider(provider), load_cli_env(project_path), settings)
1083
1140
 
1084
1141
 
1142
+ def resolved_cloudflare_account_id(project_path: Path, settings: Optional[CliSettings] = None) -> Optional[str]:
1143
+ """The valid Cloudflare account ID a route would use (environment, then Settings), or ``None``."""
1144
+ raw_account, _ = _cloudflare_account_id_source(load_cli_env(project_path), settings)
1145
+ try:
1146
+ return cloudflare_workers_ai.normalize_account_id(raw_account)
1147
+ except ValueError:
1148
+ return None
1149
+
1150
+
1151
+ def provider_connection_kwargs(
1152
+ provider: str, project_path: Path, settings: Optional[CliSettings] = None
1153
+ ) -> dict[str, Any]:
1154
+ """Connection kwargs for probing a built-in provider's credential from a Settings draft.
1155
+
1156
+ Raises ``ValueError`` with user-facing copy when a Cloudflare account ID is
1157
+ missing or invalid; returns ``{}`` for providers with a fixed endpoint.
1158
+ """
1159
+ if _provider(provider) != ModelProvider.CLOUDFLARE_WORKERS_AI:
1160
+ return {}
1161
+ env = load_cli_env(project_path)
1162
+ raw_account, _ = _cloudflare_account_id_source(env, settings)
1163
+ return cloudflare_workers_ai.connection_kwargs(
1164
+ cloudflare_workers_ai.normalize_account_id(raw_account),
1165
+ cloudflare_workers_ai.normalize_gateway_id(env.get(cloudflare_workers_ai.GATEWAY_ID_ENV)),
1166
+ )
1167
+
1168
+
1085
1169
  def probe_token_manager(settings: Optional[CliSettings]) -> Optional[ChatGPTTokenManager]:
1086
1170
  """A ChatGPT token manager for credential probes, deliberately non-persisting.
1087
1171
 
@@ -297,6 +297,13 @@ PROVIDER_KEY_NOT_STORED = (
297
297
  )
298
298
  PROVIDER_KEY_REMOVAL_STAGED = "The locally stored API key will be removed when you Apply."
299
299
  PROVIDER_TEST_RUNNING = "Testing {provider}/{model}…"
300
+ CLOUDFLARE_ACCOUNT_ID_PLACEHOLDER = "32-character Cloudflare account ID"
301
+ CLOUDFLARE_ACCOUNT_ID_HINT = (
302
+ "Find the account ID in the Cloudflare dashboard under Workers AI → Use REST API. "
303
+ "CLOUDFLARE_ACCOUNT_ID overrides this value."
304
+ )
305
+ CLOUDFLARE_API_TOKEN_PLACEHOLDER = "Cloudflare API token (Workers AI Read)"
306
+ CLOUDFLARE_ACCOUNT_ID_REQUIRED = "Enter your Cloudflare account ID or set CLOUDFLARE_ACCOUNT_ID."
300
307
  MODEL_SLOT_INHERITED = "Using {provider}/{model} (inherited from the active model)."
301
308
  MODEL_SLOT_PINNED = "Using {provider}/{model}."
302
309
  MODEL_SLOT_HINT = (
@@ -20,7 +20,9 @@ from pathlib import Path
20
20
  from typing import Any, Iterable, Optional, Sequence
21
21
 
22
22
  from kolega_code.config import ModelProvider
23
+ from kolega_code.llm.cloudflare_workers_ai import normalize_account_id
23
24
  from kolega_code.llm.specs import MODEL_SPECS, is_featured_model
25
+ from kolega_code.llm.specs import cloudflare_workers_ai_catalog as cloudflare_workers_ai
24
26
  from kolega_code.llm.specs import mistral_catalog as mistral
25
27
  from kolega_code.llm.specs import ollama_cloud_catalog as ollama_cloud
26
28
  from kolega_code.llm.specs import openrouter_catalog as openrouter
@@ -37,13 +39,16 @@ from .settings import SettingsStore, SettingsStoreError
37
39
  # and save_cache(). The Perplexity entry is a duck-typed catalog object rather
38
40
  # than a module — same contract. An entry that publishes ``API_KEY_ENV`` is
39
41
  # authenticated: ``models refresh`` resolves that credential and passes it to
40
- # ``fetch_models(api_key=...)``; every other source is fetched anonymously.
42
+ # ``fetch_models(api_key=...)``; every other source is fetched anonymously. An
43
+ # entry that also publishes ``ACCOUNT_ID_ENV`` is account-scoped and receives
44
+ # ``account_id=...`` too.
41
45
  OVERLAY_SOURCES = {
42
46
  mistral.PROVIDER: mistral,
43
47
  ollama_cloud.PROVIDER: ollama_cloud,
44
48
  openrouter.PROVIDER: openrouter,
45
49
  tinker.PROVIDER: tinker,
46
50
  perplexity.AGENT_PROVIDER: perplexity.AGENT_CATALOG,
51
+ cloudflare_workers_ai.PROVIDER: cloudflare_workers_ai,
47
52
  }
48
53
 
49
54
  # Capture the release snapshot before startup applies any runtime caches.
@@ -83,6 +88,20 @@ def _overlay_api_key(provider: str, env_name: str) -> Optional[str]:
83
88
  return (stored or "").strip() or None
84
89
 
85
90
 
91
+ def _overlay_account_id(env_name: str, setting_name: str) -> Optional[str]:
92
+ """Resolve an account-scoped overlay's account ID: environment first, then Settings."""
93
+ value = (os.environ.get(env_name) or "").strip()
94
+ if not value:
95
+ try:
96
+ value = str(getattr(SettingsStore().load(), setting_name, None) or "").strip()
97
+ except (SettingsStoreError, OSError):
98
+ return None
99
+ try:
100
+ return normalize_account_id(value)
101
+ except ValueError:
102
+ return None
103
+
104
+
86
105
  def _overlay_fetch_kwargs(provider: str, module: Any) -> tuple[Optional[dict[str, Any]], Optional[str]]:
87
106
  """Return ``(fetch kwargs, error message)`` for one overlay source."""
88
107
  env_name = getattr(module, "API_KEY_ENV", None)
@@ -91,7 +110,16 @@ def _overlay_fetch_kwargs(provider: str, module: Any) -> tuple[Optional[dict[str
91
110
  api_key = _overlay_api_key(provider, str(env_name))
92
111
  if not api_key:
93
112
  return None, f"Refreshing the {provider} catalog needs {env_name} (or a key saved in Settings)."
94
- return {"api_key": api_key}, None
113
+ kwargs: dict[str, Any] = {"api_key": api_key}
114
+ account_env = getattr(module, "ACCOUNT_ID_ENV", None)
115
+ if account_env:
116
+ account_id = _overlay_account_id(str(account_env), str(getattr(module, "ACCOUNT_ID_SETTING", "")))
117
+ if not account_id:
118
+ return None, (
119
+ f"Refreshing the {provider} catalog needs {account_env} (or an account ID saved in Settings)."
120
+ )
121
+ kwargs["account_id"] = account_id
122
+ return kwargs, None
95
123
 
96
124
 
97
125
  def _catalog_env_names(catalog: str) -> tuple[str, str]:
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  from dataclasses import dataclass
7
- from typing import Any, Callable, Optional
7
+ from typing import Any, Callable, Mapping, Optional
8
8
 
9
9
  from kolega_code.config import ModelProvider, RateLimitConfig
10
10
  from kolega_code.llm.client import LLMClient
@@ -49,6 +49,7 @@ async def test_model_connection(
49
49
  usage_ledger: Any = None,
50
50
  base_url: Optional[str] = None,
51
51
  api_style: Optional[str] = None,
52
+ default_headers: Optional[Mapping[str, str]] = None,
52
53
  ) -> ModelConnectionResult:
53
54
  """Send a tiny no-tool prompt through one provider/model pair.
54
55
 
@@ -78,6 +79,8 @@ async def test_model_connection(
78
79
  factory_kwargs["base_url"] = base_url
79
80
  if api_style:
80
81
  factory_kwargs["api_style"] = api_style
82
+ if default_headers:
83
+ factory_kwargs["default_headers"] = dict(default_headers)
81
84
  client = client_factory(**factory_kwargs)
82
85
  messages = MessageHistory([Message(role="user", content=[TextBlock(text="Reply with OK.")])])
83
86
  await asyncio.wait_for(
@@ -45,6 +45,7 @@ PROVIDER_LABELS: dict[ModelProvider, str] = {
45
45
  ModelProvider.TOGETHER: "Together AI",
46
46
  ModelProvider.DASHSCOPE: "DashScope / Qwen",
47
47
  ModelProvider.OLLAMA_CLOUD: "Ollama Cloud",
48
+ ModelProvider.CLOUDFLARE_WORKERS_AI: "Cloudflare Workers AI",
48
49
  ModelProvider.OPENROUTER: "OpenRouter",
49
50
  ModelProvider.THINKING_MACHINES: "Thinking Machines",
50
51
  ModelProvider.TINKER: "Tinker",
@@ -63,6 +64,8 @@ MODEL_LABELS: dict[str, str] = {
63
64
  "meta-llama/llama-4-maverick-17b-128e-instruct": "Llama 4 Maverick 17B",
64
65
  # Moonshot
65
66
  "kimi-k3": "Kimi K3",
67
+ "kimi-k3.1-pro": "Kimi K3.1 Pro",
68
+ "kimi-k3.1-pro-highspeed": "Kimi K3.1 Pro (High-Speed)",
66
69
  "kimi-k2.7-code": "Kimi K2.7 Code",
67
70
  "kimi-k2.7-code-highspeed": "Kimi K2.7 Code (High-Speed)",
68
71
  "kimi-k2.6": "Kimi K2.6",
@@ -79,6 +82,8 @@ MODEL_LABELS: dict[str, str] = {
79
82
  # Kimi Coding Plan
80
83
  "k3": "Kimi K3 (256K)",
81
84
  "k3-256k": "Kimi K3-256K",
85
+ "k3.1-pro": "Kimi K3.1 Pro (256K)",
86
+ "k3.1-pro-highspeed": "Kimi K3.1 Pro (HighSpeed)",
82
87
  "kimi-for-coding": "Kimi for Coding",
83
88
  "kimi-for-coding-highspeed": "Kimi for Coding (HighSpeed)",
84
89
  # DeepSeek
@@ -196,6 +201,20 @@ MODEL_LABELS: dict[str, str] = {
196
201
  "qwen3-coder-next": "Qwen3 Coder Next",
197
202
  "qwen3-coder:480b": "Qwen3 Coder 480B",
198
203
  "qwen3.5:397b": "Qwen3.5 397B",
204
+ # Cloudflare Workers AI
205
+ "@cf/zai-org/glm-5.3": "GLM-5.3",
206
+ "@cf/zai-org/glm-5.3-flash": "GLM-5.3 Flash",
207
+ "@cf/moonshotai/kimi-k2.7-code": "Kimi K2.7 Code",
208
+ "@cf/deepseek-ai/deepseek-v4.1-flash-1017": "DeepSeek V4.1 Flash",
209
+ "@cf/deepseek-ai/deepseek-v4-pro-0813": "DeepSeek V4 Pro",
210
+ "@cf/zai-org/glm-5.2": "GLM-5.2",
211
+ "@cf/moonshotai/kimi-k2.6": "Kimi K2.6",
212
+ "@cf/qwen/qwen3.8-27b": "Qwen 3.8 27B",
213
+ "@cf/google/gemma-4-26b-a4b-it": "Gemma 4 26B A4B",
214
+ "@cf/nvidia/nemotron-3-120b-a12b": "Nemotron 3 120B A12B",
215
+ "@cf/openai/gpt-oss-120b": "GPT-OSS 120B",
216
+ "@cf/openai/gpt-oss-20b": "GPT-OSS 20B",
217
+ "@cf/zai-org/glm-4.7-flash": "GLM-4.7 Flash",
199
218
  # Thinking Machines
200
219
  "thinkingmachines/Inkling": "Inkling",
201
220
  "thinkingmachines/Inkling-Small": "Inkling Small",
@@ -219,6 +238,7 @@ PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
219
238
  ModelProvider.TOGETHER: "moonshotai/Kimi-K2.7-Code",
220
239
  ModelProvider.DASHSCOPE: "qwen3-coder-plus",
221
240
  ModelProvider.OLLAMA_CLOUD: "gpt-oss:20b",
241
+ ModelProvider.CLOUDFLARE_WORKERS_AI: "@cf/zai-org/glm-5.3",
222
242
  # Hardcoded on purpose: regenerating the OpenRouter catalog reorders it by
223
243
  # live usage, and that must never silently change what new users get.
224
244
  ModelProvider.OPENROUTER: "moonshotai/kimi-k3",
@@ -265,6 +285,8 @@ def _api_key_env(provider: ModelProvider) -> str:
265
285
  return ""
266
286
  if provider == ModelProvider.OLLAMA_CLOUD:
267
287
  return "OLLAMA_API_KEY"
288
+ if provider == ModelProvider.CLOUDFLARE_WORKERS_AI:
289
+ return "CLOUDFLARE_API_TOKEN"
268
290
  if provider == ModelProvider.THINKING_MACHINES:
269
291
  # Thinking Machines documents TINKER_API_KEY, not THINKING_MACHINES_API_KEY.
270
292
  return "TINKER_API_KEY"
@@ -311,6 +311,9 @@ class CliSettings:
311
311
  # Custom model endpoints keyed by endpoint id (provider value "custom:<id>").
312
312
  # Additive optional field — absent in older files -> empty mapping.
313
313
  custom_endpoints: dict[str, dict] = field(default_factory=dict)
314
+ # Account that scopes Cloudflare Workers AI requests (not a secret; the API
315
+ # token lives in api_keys). Additive optional field — absent -> None.
316
+ cloudflare_account_id: Optional[str] = None
314
317
  schema_version: int = SETTINGS_SCHEMA_VERSION
315
318
  # The document this instance was loaded from, used as the merge base by
316
319
  # SettingsStore.save(). Never serialized.
@@ -376,6 +379,8 @@ class CliSettings:
376
379
  compression_threshold=_coerce_compression_threshold(data.get("compression_threshold")),
377
380
  # Additive optional field; absent in older files -> empty mapping.
378
381
  custom_endpoints=_coerce_custom_endpoints(data.get("custom_endpoints")),
382
+ # Additive optional field; absent in older files -> None.
383
+ cloudflare_account_id=_coerce_optional_text(data.get("cloudflare_account_id")),
379
384
  )
380
385
 
381
386
  def to_dict(self) -> dict:
@@ -408,6 +413,7 @@ class CliSettings:
408
413
  "skills_enabled": self.skills_enabled,
409
414
  "compression_threshold": self.compression_threshold,
410
415
  "custom_endpoints": self.custom_endpoints,
416
+ "cloudflare_account_id": self.cloudflare_account_id,
411
417
  }
412
418
 
413
419
  def get_api_key(self, provider: str) -> Optional[str]:
@@ -13,7 +13,8 @@ from textual.widgets import Button, Input, Label, Select, Static
13
13
 
14
14
  from kolega_code.auth import constants as chatgpt_constants
15
15
  from kolega_code.auth.chatgpt_oauth import run_login_flow
16
- from kolega_code.cli.config import build_agent_config, key_status
16
+ from kolega_code.cli import messages
17
+ from kolega_code.cli.config import build_agent_config, key_status, resolved_cloudflare_account_id
17
18
  from kolega_code.cli.model_connection import test_model_connection
18
19
  from kolega_code.cli.provider_registry import (
19
20
  UI_DEFAULT_PROVIDER,
@@ -24,6 +25,7 @@ from kolega_code.cli.provider_registry import (
24
25
  ui_thinking_effort_options,
25
26
  )
26
27
  from kolega_code.config import ModelProvider
28
+ from kolega_code.llm import cloudflare_workers_ai
27
29
  from kolega_code.llm.specs import CUSTOM_PROVIDER_PREFIX
28
30
 
29
31
  if TYPE_CHECKING:
@@ -102,6 +104,14 @@ class OnboardingScreen(ModalScreen[None]):
102
104
  )
103
105
  yield Label("API key")
104
106
  yield Input(password=True, id="onboarding_api_key")
107
+ with Vertical(id="onboarding_account_id_panel"):
108
+ yield Label("Account ID")
109
+ yield Input(
110
+ self.draft.cloudflare_account_id or "",
111
+ id="onboarding_account_id",
112
+ placeholder=messages.CLOUDFLARE_ACCOUNT_ID_PLACEHOLDER,
113
+ )
114
+ yield Static(messages.CLOUDFLARE_ACCOUNT_ID_HINT, classes="onboarding-hint")
105
115
  yield Static("", id="onboarding_key_status", classes="onboarding-hint")
106
116
  with Vertical(id="onboarding_step_model", classes="onboarding-step"):
107
117
  yield Static("Choose the model used by default for this session and future sessions.")
@@ -206,7 +216,7 @@ class OnboardingScreen(ModalScreen[None]):
206
216
  self._reset_test_status()
207
217
 
208
218
  def on_input_changed(self, event: Input.Changed) -> None:
209
- if event.input.id == "onboarding_api_key":
219
+ if event.input.id in ("onboarding_api_key", "onboarding_account_id"):
210
220
  self._reset_test_status()
211
221
 
212
222
  def _update_api_key_status(self) -> None:
@@ -214,6 +224,7 @@ class OnboardingScreen(ModalScreen[None]):
214
224
  provider = str(self.query_one("#onboarding_provider", Select).value)
215
225
  except Exception:
216
226
  return
227
+ self.query_one("#onboarding_account_id_panel").display = provider == cloudflare_workers_ai.PROVIDER
217
228
  status = key_status(provider, self.owner.project_path, self.draft)
218
229
  widget = self.query_one("#onboarding_key_status", Static)
219
230
  widget.update(f"Credential status: {status}")
@@ -274,9 +285,25 @@ class OnboardingScreen(ModalScreen[None]):
274
285
  if key_status(provider, self.owner.project_path, self.draft) == "missing":
275
286
  self._set_status("Enter an API key or configure the provider's environment variable.")
276
287
  return False
288
+ if provider == cloudflare_workers_ai.PROVIDER and not self._collect_cloudflare_account_id():
289
+ return False
277
290
  self.draft.active_provider = provider
278
291
  return True
279
292
 
293
+ def _collect_cloudflare_account_id(self) -> bool:
294
+ typed = self.query_one("#onboarding_account_id", Input).value
295
+ try:
296
+ account_id = cloudflare_workers_ai.normalize_account_id(typed)
297
+ except ValueError as exc:
298
+ self._set_status(str(exc))
299
+ return False
300
+ if account_id:
301
+ self.draft.cloudflare_account_id = account_id
302
+ if resolved_cloudflare_account_id(self.owner.project_path, self.draft) is None:
303
+ self._set_status(messages.CLOUDFLARE_ACCOUNT_ID_REQUIRED)
304
+ return False
305
+ return True
306
+
280
307
  def _populate_models(self) -> None:
281
308
  provider = self.draft.active_provider or UI_DEFAULT_PROVIDER
282
309
  options = ui_model_options(provider)
@@ -369,6 +396,7 @@ class OnboardingScreen(ModalScreen[None]):
369
396
  token_manager=config.get_chatgpt_token_manager(),
370
397
  rate_limits=model_config.rate_limits,
371
398
  usage_ledger=getattr(self.owner, "_usage_ledger", None),
399
+ **config.llm_client_kwargs(model_config),
372
400
  )
373
401
  status.update(result.message)
374
402
  button.disabled = False