klaude-code 2.19.0__tar.gz → 2.21.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 (302) hide show
  1. {klaude_code-2.19.0 → klaude_code-2.21.0}/PKG-INFO +2 -4
  2. {klaude_code-2.19.0 → klaude_code-2.21.0}/README.md +1 -3
  3. {klaude_code-2.19.0 → klaude_code-2.21.0}/pyproject.toml +6 -2
  4. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/.DS_Store +0 -0
  5. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/log_viewer.html +18 -5
  6. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/main.py +1 -23
  7. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/assets/builtin_config.yaml +36 -107
  8. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/config.py +1 -15
  9. klaude_code-2.21.0/src/klaude_code/config/sub_agent_model_helper.py +110 -0
  10. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/thinking.py +0 -4
  11. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/const.py +5 -5
  12. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/agent_profile.py +8 -108
  13. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/bash_mode.py +3 -3
  14. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/executor.py +9 -10
  15. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/loaded_skills.py +14 -0
  16. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/llm_clients_builder.py +1 -1
  17. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/sub_agent_manager.py +0 -1
  18. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/memory.py +37 -1
  19. klaude_code-2.21.0/src/klaude_code/core/prompts/auto-memory-prompt.md +29 -0
  20. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/base-system-prompt.md +13 -15
  21. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/system_prompt.py +89 -2
  22. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/reminders.py +44 -13
  23. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/task.py +7 -6
  24. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/__init__.py +0 -4
  25. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/rewind_tool.md +1 -1
  26. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/task_tool.md +1 -0
  27. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/task_tool.py +0 -8
  28. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_fetch_tool.py +24 -13
  29. klaude_code-2.21.0/src/klaude_code/core/tool/web/web_search_tool.md +2 -0
  30. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/turn.py +2 -30
  31. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/anthropic/input.py +3 -0
  32. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/google/client.py +0 -68
  33. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/google/input.py +4 -9
  34. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/image.py +0 -63
  35. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/input_common.py +15 -29
  36. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/input.py +1 -2
  37. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/stream.py +0 -50
  38. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_responses/input.py +3 -0
  39. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/client.py +0 -9
  40. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/input.py +19 -10
  41. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/reasoning.py +4 -1
  42. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/usage.py +0 -7
  43. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/events.py +1 -16
  44. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/llm_param.py +0 -18
  45. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/message.py +6 -50
  46. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/model.py +2 -17
  47. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/model_id.py +0 -21
  48. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/op.py +1 -2
  49. klaude_code-2.21.0/src/klaude_code/protocol/sub_agent/AGENTS.md +19 -0
  50. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/sub_agent/__init__.py +3 -13
  51. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/sub_agent/task.py +1 -1
  52. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/tools.py +0 -2
  53. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/export.py +13 -188
  54. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/session.py +13 -17
  55. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/store.py +3 -1
  56. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/templates/export_session.html +104 -371
  57. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/.DS_Store +0 -0
  58. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/.DS_Store +0 -0
  59. klaude_code-2.21.0/src/klaude_code/skill/assets/frontend-design/SKILL.md +42 -0
  60. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/.DS_Store +0 -0
  61. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/LICENSE.txt +201 -0
  62. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/SKILL.md +175 -0
  63. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/cli.md +132 -0
  64. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/codex-network.md +28 -0
  65. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/image-api.md +36 -0
  66. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/prompting.md +81 -0
  67. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/sample-prompts.md +384 -0
  68. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/scripts/image_gen.py +851 -0
  69. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/SKILL.md +107 -0
  70. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/cli.md +140 -0
  71. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/gemini-api.md +92 -0
  72. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/prompting.md +141 -0
  73. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/sample-prompts.md +183 -0
  74. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/vertex-setup.md +108 -0
  75. klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/scripts/gemini_image_gen.py +571 -0
  76. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/SKILL.md +315 -0
  77. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/forms.md +294 -0
  78. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/reference.md +612 -0
  79. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/check_bounding_boxes.py +69 -0
  80. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/check_fillable_fields.py +9 -0
  81. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/convert_pdf_to_images.py +31 -0
  82. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/create_validation_image.py +37 -0
  83. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/extract_form_field_info.py +123 -0
  84. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/extract_form_structure.py +116 -0
  85. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/fill_fillable_fields.py +102 -0
  86. klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/fill_pdf_form_with_annotations.py +99 -0
  87. klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/.gitignore +1 -0
  88. klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/SKILL.md +28 -0
  89. klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/bun.lock +182 -0
  90. klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/package.json +9 -0
  91. klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/scripts/render_mermaid.js +182 -0
  92. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/skill-creator/SKILL.md +75 -17
  93. klaude_code-2.21.0/src/klaude_code/skill/assets/web-search/SKILL.md +60 -0
  94. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/loader.py +54 -6
  95. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/manager.py +16 -1
  96. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/system_skills.py +2 -2
  97. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/auth_selector.py +1 -1
  98. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/copy_cmd.py +4 -39
  99. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/refresh_cmd.py +5 -1
  100. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/sub_agent_model_cmd.py +1 -1
  101. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/commands.py +0 -11
  102. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/metadata.py +0 -16
  103. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/markdown.py +70 -16
  104. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/status.py +14 -42
  105. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/theme.py +10 -5
  106. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/tools.py +74 -125
  107. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/welcome.py +33 -8
  108. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/display.py +14 -0
  109. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/completers.py +31 -1
  110. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/paste.py +1 -1
  111. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/machine.py +2 -25
  112. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/renderer.py +23 -31
  113. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/runner.py +0 -14
  114. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/image.py +46 -9
  115. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/selector.py +2 -14
  116. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/__init__.py +0 -2
  117. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/common.py +0 -10
  118. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/core/display.py +1 -1
  119. klaude_code-2.19.0/src/klaude_code/config/sub_agent_model_helper.py +0 -213
  120. klaude_code-2.19.0/src/klaude_code/core/prompts/prompt-sub-agent-image-gen.md +0 -6
  121. klaude_code-2.19.0/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -61
  122. klaude_code-2.19.0/src/klaude_code/core/tool/image_gen_tool.md +0 -16
  123. klaude_code-2.19.0/src/klaude_code/core/tool/image_gen_tool.py +0 -147
  124. klaude_code-2.19.0/src/klaude_code/core/tool/mermaid_tool.md +0 -64
  125. klaude_code-2.19.0/src/klaude_code/core/tool/mermaid_tool.py +0 -74
  126. klaude_code-2.19.0/src/klaude_code/core/tool/web/web_search_tool.md +0 -23
  127. klaude_code-2.19.0/src/klaude_code/protocol/sub_agent/AGENTS.md +0 -28
  128. klaude_code-2.19.0/src/klaude_code/protocol/sub_agent/image_gen.py +0 -38
  129. klaude_code-2.19.0/src/klaude_code/protocol/sub_agent/web.py +0 -21
  130. klaude_code-2.19.0/src/klaude_code/session/templates/mermaid_viewer.html +0 -1011
  131. klaude_code-2.19.0/src/klaude_code/tui/components/mermaid_viewer.py +0 -163
  132. klaude_code-2.19.0/src/klaude_code/ui/debug_mode.py +0 -37
  133. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/__init__.py +0 -0
  134. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/app/__init__.py +0 -0
  135. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/app/auth_flow.py +0 -0
  136. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/app/runtime.py +0 -0
  137. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/AGENTS.md +0 -0
  138. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/__init__.py +0 -0
  139. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/base.py +0 -0
  140. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/__init__.py +0 -0
  141. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/exceptions.py +0 -0
  142. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/oauth.py +0 -0
  143. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/token_manager.py +0 -0
  144. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/__init__.py +0 -0
  145. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/exceptions.py +0 -0
  146. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  147. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/oauth.py +0 -0
  148. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/token_manager.py +0 -0
  149. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/__init__.py +0 -0
  150. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/exceptions.py +0 -0
  151. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/oauth.py +0 -0
  152. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/token_manager.py +0 -0
  153. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/auth/env.py +0 -0
  154. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/__init__.py +0 -0
  155. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/auth_cmd.py +0 -0
  156. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/config_cmd.py +0 -0
  157. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/cost_cmd.py +0 -0
  158. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/debug.py +0 -0
  159. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/list_model.py +0 -0
  160. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/log_server.py +0 -0
  161. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/oauth_usage.py +0 -0
  162. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/cli/self_update.py +0 -0
  163. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/__init__.py +0 -0
  164. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/assets/__init__.py +0 -0
  165. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/builtin_config.py +0 -0
  166. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/config/model_matcher.py +0 -0
  167. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/__init__.py +0 -0
  168. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/agent.py +0 -0
  169. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/AGENTS.md +0 -0
  170. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/__init__.py +0 -0
  171. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/compaction.py +0 -0
  172. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/overflow.py +0 -0
  173. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/prompts.py +0 -0
  174. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/__init__.py +0 -0
  175. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/llm_clients.py +0 -0
  176. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  177. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  178. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/rewind/__init__.py +0 -0
  179. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/rewind/manager.py +0 -0
  180. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/context.py +0 -0
  181. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/__init__.py +0 -0
  182. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/_utils.py +0 -0
  183. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  184. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  185. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  186. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  187. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  188. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  189. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  190. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  191. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  192. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  193. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/offload.py +0 -0
  194. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  195. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/rewind_tool.py +0 -0
  196. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  197. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  198. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  199. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  200. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  201. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  202. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  203. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  204. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  205. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  206. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/tool_abc.py +0 -0
  207. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/tool_registry.py +0 -0
  208. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/tool_runner.py +0 -0
  209. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/__init__.py +0 -0
  210. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/external_content.py +0 -0
  211. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/ssrf.py +0 -0
  212. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_cache.py +0 -0
  213. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  214. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  215. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/__init__.py +0 -0
  216. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  217. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/anthropic/client.py +0 -0
  218. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/bedrock_anthropic/__init__.py +0 -0
  219. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/bedrock_anthropic/client.py +0 -0
  220. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/claude/__init__.py +0 -0
  221. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/claude/client.py +0 -0
  222. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/client.py +0 -0
  223. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/copilot/__init__.py +0 -0
  224. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/copilot/client.py +0 -0
  225. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/google/__init__.py +0 -0
  226. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/google_vertex/__init__.py +0 -0
  227. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/google_vertex/client.py +0 -0
  228. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/json_stable.py +0 -0
  229. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_codex/__init__.py +0 -0
  230. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_codex/client.py +0 -0
  231. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  232. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  233. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_responses/__init__.py +0 -0
  234. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_responses/client.py +0 -0
  235. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  236. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/partial_message.py +0 -0
  237. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/registry.py +0 -0
  238. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/llm/stream_parts.py +0 -0
  239. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/log.py +0 -0
  240. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/__init__.py +0 -0
  241. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/commands.py +0 -0
  242. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/op_handler.py +0 -0
  243. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  244. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/__init__.py +0 -0
  245. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/codec.py +0 -0
  246. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/session/selector.py +0 -0
  247. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/__init__.py +0 -0
  248. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  249. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/executing-plans/SKILL.md +0 -0
  250. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/session-logs/SKILL.md +0 -0
  251. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/writing-plans/SKILL.md +0 -0
  252. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/__init__.py +0 -0
  253. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/__init__.py +0 -0
  254. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/clear_cmd.py +0 -0
  255. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/command_abc.py +0 -0
  256. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/compact_cmd.py +0 -0
  257. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/continue_cmd.py +0 -0
  258. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/debug_cmd.py +0 -0
  259. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/export_cmd.py +0 -0
  260. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/export_online_cmd.py +0 -0
  261. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/fork_session_cmd.py +0 -0
  262. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/login_cmd.py +0 -0
  263. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/logout_cmd.py +0 -0
  264. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/model_cmd.py +0 -0
  265. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/model_picker.py +0 -0
  266. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/prompt-init.md +0 -0
  267. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/prompt_command.py +0 -0
  268. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/registry.py +0 -0
  269. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/resume_cmd.py +0 -0
  270. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/status_cmd.py +0 -0
  271. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/thinking_cmd.py +0 -0
  272. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/__init__.py +0 -0
  273. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/bash_syntax.py +0 -0
  274. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/command_output.py +0 -0
  275. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/common.py +0 -0
  276. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/developer.py +0 -0
  277. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/diffs.py +0 -0
  278. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/errors.py +0 -0
  279. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/__init__.py +0 -0
  280. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/cjk_wrap.py +0 -0
  281. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/code_panel.py +0 -0
  282. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/live.py +0 -0
  283. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/quote.py +0 -0
  284. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/sub_agent.py +0 -0
  285. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/thinking.py +0 -0
  286. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/user_input.py +0 -0
  287. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/AGENTS.md +0 -0
  288. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/__init__.py +0 -0
  289. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/drag_drop.py +0 -0
  290. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/images.py +0 -0
  291. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/key_bindings.py +0 -0
  292. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/prompt_toolkit.py +0 -0
  293. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/__init__.py +0 -0
  294. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/color.py +0 -0
  295. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/control.py +0 -0
  296. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/notifier.py +0 -0
  297. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/progress_bar.py +0 -0
  298. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/core/__init__.py +0 -0
  299. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/core/input.py +0 -0
  300. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/terminal/__init__.py +0 -0
  301. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/ui/terminal/title.py +0 -0
  302. {klaude_code-2.19.0 → klaude_code-2.21.0}/src/klaude_code/update.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 2.19.0
3
+ Version: 2.21.0
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0,<6
@@ -29,7 +29,7 @@ Minimal code agent CLI.
29
29
  - **Keep reasoning item in context**: Interleaved thinking support
30
30
  - **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
31
31
  - **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
32
- - **Sub-agents**: Task, Explore, Web, ImageGen
32
+ - **Sub-agents**: Task, Explore, Web
33
33
  - **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
34
34
  - **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
35
35
  - **External file sync**: Monitoring for external edits (linter, manual)
@@ -37,7 +37,6 @@ Minimal code agent CLI.
37
37
  - **Output truncation**: Large outputs saved to file system with snapshot links
38
38
  - **Agent Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `//skill` or `/skill`)
39
39
  - **Sessions**: Resumable with `--continue`
40
- - **Mermaid diagrams**: Terminal image preview and Interactive local HTML viewer with zoom, pan, and SVG export
41
40
  - **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
42
41
 
43
42
  ## Installation
@@ -275,4 +274,3 @@ The main agent can spawn specialized sub-agents for specific tasks:
275
274
  | **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
276
275
  | **Task** | Handle complex multi-step tasks autonomously |
277
276
  | **WebAgent** | Search the web, fetch pages, and analyze content. Uses Brave LLM Context API when `BRAVE_API_KEY` is set, otherwise falls back to DuckDuckGo |
278
- | **ImageGen** | Generate images from text prompts via OpenRouter Nano Banana Pro |
@@ -7,7 +7,7 @@ Minimal code agent CLI.
7
7
  - **Keep reasoning item in context**: Interleaved thinking support
8
8
  - **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
9
9
  - **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
10
- - **Sub-agents**: Task, Explore, Web, ImageGen
10
+ - **Sub-agents**: Task, Explore, Web
11
11
  - **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
12
12
  - **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
13
13
  - **External file sync**: Monitoring for external edits (linter, manual)
@@ -15,7 +15,6 @@ Minimal code agent CLI.
15
15
  - **Output truncation**: Large outputs saved to file system with snapshot links
16
16
  - **Agent Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `//skill` or `/skill`)
17
17
  - **Sessions**: Resumable with `--continue`
18
- - **Mermaid diagrams**: Terminal image preview and Interactive local HTML viewer with zoom, pan, and SVG export
19
18
  - **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
20
19
 
21
20
  ## Installation
@@ -253,4 +252,3 @@ The main agent can spawn specialized sub-agents for specific tasks:
253
252
  | **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
254
253
  | **Task** | Handle complex multi-step tasks autonomously |
255
254
  | **WebAgent** | Search the web, fetch pages, and analyze content. Uses Brave LLM Context API when `BRAVE_API_KEY` is set, otherwise falls back to DuckDuckGo |
256
- | **ImageGen** | Generate images from text prompts via OpenRouter Nano Banana Pro |
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "2.19.0"
7
+ version = "2.21.0"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -40,6 +40,7 @@ dev = [
40
40
  "pyright>=1.1.407",
41
41
  "pytest>=8.4.1",
42
42
  "pytest-cov>=7.0.0",
43
+ "ruff==0.14.3",
43
44
  "ty>=0.0.8",
44
45
  ]
45
46
 
@@ -69,7 +70,10 @@ venv = ".venv"
69
70
  extraPaths = ["src"]
70
71
  reportMissingImports = "warning"
71
72
  reportMissingModuleSource = "warning"
72
- exclude = [".venv/"]
73
+ exclude = [
74
+ ".venv/",
75
+ "src/klaude_code/skill/assets/**/scripts/",
76
+ ]
73
77
 
74
78
  [[tool.pyright.executionEnvironments]]
75
79
  root = "."
@@ -93,10 +93,13 @@ body {
93
93
  flex-wrap: wrap;
94
94
  }
95
95
  .filter-btn {
96
- background: transparent;
97
- border: 1px solid transparent;
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: 6px;
99
+ background: var(--bg-surface);
100
+ border: 1px solid var(--border-strong);
98
101
  color: var(--fg-secondary);
99
- padding: 4px 8px;
102
+ padding: 4px 10px;
100
103
  border-radius: 6px;
101
104
  font-size: 16px;
102
105
  font-weight: 700;
@@ -105,13 +108,23 @@ body {
105
108
  transition: all 0.2s ease;
106
109
  line-height: 1.2;
107
110
  }
108
- .filter-btn:hover { background: #e6f0fa; color: #005fcc; }
111
+ .filter-btn:hover {
112
+ background: var(--bg-hover);
113
+ color: var(--fg);
114
+ border-color: var(--fg-tertiary);
115
+ }
109
116
  .filter-btn.active {
110
117
  background: #dbeafe;
111
118
  color: #1e3a8a;
112
- border-color: transparent;
119
+ border-color: #bfdbfe;
113
120
  box-shadow: none;
114
121
  }
122
+ .filter-btn.active::after {
123
+ content: '\00d7';
124
+ font-size: 14px;
125
+ line-height: 1;
126
+ opacity: 0.85;
127
+ }
115
128
 
116
129
  #search-box {
117
130
  background: var(--bg-surface);
@@ -35,7 +35,6 @@ def _build_env_help() -> str:
35
35
  " KLAUDE_READ_GLOBAL_LINE_CAP Max lines to read (default: 2000)",
36
36
  " KLAUDE_READ_MAX_CHARS Max total chars to read (default: 50000)",
37
37
  " KLAUDE_READ_MAX_IMAGE_BYTES Max image bytes to read (default: 64MB)",
38
- " KLAUDE_IMAGE_OUTPUT_MAX_BYTES Max decoded image bytes (default: 64MB)",
39
38
  ]
40
39
  )
41
40
  return "\n\n".join(lines)
@@ -188,12 +187,6 @@ def main_callback(
188
187
  "--vanilla",
189
188
  help="Minimal mode: basic tools only, no system prompts",
190
189
  ),
191
- banana: bool = typer.Option(
192
- False,
193
- "--banana",
194
- help="Image generation mode (alias for --model banana)",
195
- rich_help_panel="LLM",
196
- ),
197
190
  version: bool = typer.Option(
198
191
  False,
199
192
  "--version",
@@ -208,10 +201,6 @@ def main_callback(
208
201
  if ctx.invoked_subcommand is None:
209
202
  from klaude_code.log import log
210
203
 
211
- if vanilla and banana:
212
- log(("Error: --banana cannot be combined with --vanilla", "red"))
213
- raise typer.Exit(2)
214
-
215
204
  resume_by_id_value = resume_by_id.strip() if resume_by_id is not None else None
216
205
  if resume_by_id_value == "":
217
206
  log(("Error: --resume <id> cannot be empty", "red"))
@@ -249,18 +238,7 @@ def main_callback(
249
238
  update_terminal_title()
250
239
 
251
240
  chosen_model = model
252
- if banana:
253
- keywords = ["gemini-3-pro-image", "gemini-2.5-flash-image"]
254
- model_result = select_model_interactive(keywords=keywords)
255
- if model_result.status == ModelSelectStatus.SELECTED and model_result.model is not None:
256
- chosen_model = model_result.model
257
- elif model_result.status == ModelSelectStatus.CANCELLED:
258
- return
259
- else:
260
- log(("Error: no available nano-banana model", "red"))
261
- log(("Hint: set OPENROUTER_API_KEY or GOOGLE_API_KEY to enable nano-banana models", "yellow"))
262
- raise typer.Exit(2)
263
- elif model or select_model:
241
+ if model or select_model:
264
242
  model_result = select_model_interactive(preferred=model)
265
243
  if model_result.status == ModelSelectStatus.SELECTED and model_result.model is not None:
266
244
  chosen_model = model_result.model
@@ -42,28 +42,19 @@ provider_list:
42
42
  reasoning_summary: concise
43
43
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
44
44
 
45
- - model_name: gpt-5.2-medium
46
- model_id: gpt-5.2
47
- context_limit: 400000
48
- verbosity: high
45
+ - model_name: gpt-5.3-codex
46
+ model_id: gpt-5.3-codex
49
47
  thinking:
50
- reasoning_effort: medium
51
- reasoning_summary: concise
52
- cost: { input: 1.75, output: 14, cache_read: 0.17 }
53
-
54
- - model_name: gpt-5.2-low
55
- model_id: gpt-5.2
48
+ reasoning_effort: high
49
+ reasoning_summary: auto
56
50
  context_limit: 400000
57
- verbosity: low
58
- thinking:
59
- reasoning_effort: low
60
- reasoning_summary: concise
51
+ max_tokens: 128000
61
52
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
62
53
 
63
- - model_name: gpt-5.2-codex
64
- model_id: gpt-5.2-codex
54
+ - model_name: gpt-5.3-codex-xhigh
55
+ model_id: gpt-5.3-codex
65
56
  thinking:
66
- reasoning_effort: high
57
+ reasoning_effort: xhigh
67
58
  reasoning_summary: auto
68
59
  context_limit: 400000
69
60
  max_tokens: 128000
@@ -74,8 +65,8 @@ provider_list:
74
65
  api_key: ${OPENROUTER_API_KEY}
75
66
  model_list:
76
67
 
77
- - model_name: gpt-5.2-codex
78
- model_id: gpt-5.2-codex
68
+ - model_name: gpt-5.3-codex
69
+ model_id: openai/gpt-5.3-codex
79
70
  thinking:
80
71
  reasoning_effort: high
81
72
  reasoning_summary: auto
@@ -83,23 +74,22 @@ provider_list:
83
74
  max_tokens: 128000
84
75
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
85
76
 
86
- - model_name: gpt-5.2-high
87
- model_id: openai/gpt-5.2
88
- max_tokens: 128000
89
- context_limit: 400000
90
- verbosity: high
77
+ - model_name: gpt-5.3-codex-xhigh
78
+ model_id: openai/gpt-5.3-codex
91
79
  thinking:
92
- reasoning_effort: high
93
- reasoning_summary: concise
80
+ reasoning_effort: xhigh
81
+ reasoning_summary: auto
82
+ context_limit: 400000
83
+ max_tokens: 128000
94
84
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
95
85
 
96
- - model_name: gpt-5.2-medium
86
+ - model_name: gpt-5.2-high
97
87
  model_id: openai/gpt-5.2
98
88
  max_tokens: 128000
99
89
  context_limit: 400000
100
90
  verbosity: high
101
91
  thinking:
102
- reasoning_effort: medium
92
+ reasoning_effort: high
103
93
  reasoning_summary: concise
104
94
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
105
95
 
@@ -176,32 +166,6 @@ provider_list:
176
166
  reasoning_effort: medium
177
167
  cost: { input: 0.5, output: 3, cache_read: 0.05 }
178
168
 
179
- - model_name: nano-banana-pro
180
- model_id: google/gemini-3-pro-image-preview
181
- context_limit: 66000
182
- modalities:
183
- - image
184
- - text
185
- image_config:
186
- image_size: "4K"
187
- cost: { input: 2, output: 12, cache_read: 0.2, image: 120 }
188
-
189
- - model_name: nano-banana
190
- model_id: google/gemini-2.5-flash-image
191
- context_limit: 33000
192
- modalities:
193
- - image
194
- - text
195
- cost: { input: 0.3, output: 2.5, cache_read: 0.03, image: 30 }
196
-
197
- - model_name: aurora
198
- model_id: openrouter/aurora-alpha
199
- context_limit: 128000
200
- thinking:
201
- type: enabled
202
- budget_tokens: 2048
203
- cost: { input: 0, output: 0 }
204
-
205
169
  - model_name: grok
206
170
  model_id: x-ai/grok-4.1-fast
207
171
  context_limit: 2000000
@@ -230,22 +194,6 @@ provider_list:
230
194
  - z-ai
231
195
  cost: { input: 1, output: 3.2, cache_read: 0.1 }
232
196
 
233
- - model_name: seedream
234
- model_id: bytedance-seed/seedream-4.5
235
- context_limit: 4000
236
- cost: { input: 0, output: 9.581, image: 9.581 }
237
- modalities:
238
- - image
239
- - text
240
-
241
- - model_name: flux
242
- model_id: black-forest-labs/flux.2-max
243
- context_limit: 47000
244
- cost: { input: 7.32, output: 7.32, image: 7.32 }
245
- modalities:
246
- - image
247
- - text
248
-
249
197
  - provider_name: google
250
198
  protocol: google
251
199
  api_key: ${GOOGLE_API_KEY}
@@ -265,24 +213,6 @@ provider_list:
265
213
  reasoning_effort: medium
266
214
  cost: { input: 0.5, output: 3, cache_read: 0.05 }
267
215
 
268
- - model_name: nano-banana-pro
269
- model_id: gemini-3-pro-image-preview
270
- context_limit: 66000
271
- modalities:
272
- - image
273
- - text
274
- image_config:
275
- image_size: "4K"
276
- cost: { input: 2, output: 12, cache_read: 0.2, image: 120 }
277
-
278
- - model_name: nano-banana
279
- model_id: gemini-2.5-flash-image
280
- context_limit: 33000
281
- modalities:
282
- - image
283
- - text
284
- cost: { input: 0.3, output: 2.5, cache_read: 0.03, image: 30 }
285
-
286
216
  - provider_name: google-vertex
287
217
  protocol: google_vertex
288
218
  google_application_credentials: ${GOOGLE_APPLICATION_CREDENTIALS}
@@ -304,24 +234,6 @@ provider_list:
304
234
  reasoning_effort: medium
305
235
  cost: { input: 0.5, output: 3, cache_read: 0.05 }
306
236
 
307
- - model_name: nano-banana-pro
308
- model_id: gemini-3-pro-image-preview
309
- context_limit: 66000
310
- modalities:
311
- - image
312
- - text
313
- image_config:
314
- image_size: "4K"
315
- cost: { input: 2, output: 12, cache_read: 0.2, image: 120 }
316
-
317
- - model_name: nano-banana
318
- model_id: gemini-2.5-flash-image
319
- context_limit: 33000
320
- modalities:
321
- - image
322
- - text
323
- cost: { input: 0.3, output: 2.5, cache_read: 0.03, image: 30 }
324
-
325
237
  - provider_name: bedrock
326
238
  protocol: bedrock
327
239
  aws_access_key: ${AWS_ACCESS_KEY_ID}
@@ -441,6 +353,15 @@ provider_list:
441
353
  max_tokens: 128000
442
354
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
443
355
 
356
+ - model_name: gpt-5.3-codex-xhigh
357
+ model_id: gpt-5.3-codex
358
+ thinking:
359
+ reasoning_effort: xhigh
360
+ reasoning_summary: auto
361
+ context_limit: 400000
362
+ max_tokens: 128000
363
+ cost: { input: 1.75, output: 14, cache_read: 0.17 }
364
+
444
365
  - provider_name: copilot
445
366
  protocol: copilot_oauth
446
367
  model_list:
@@ -454,6 +375,15 @@ provider_list:
454
375
  max_tokens: 128000
455
376
  cost: { input: 1.75, output: 14, cache_read: 0.17 }
456
377
 
378
+ - model_name: gpt-5.3-codex-xhigh
379
+ model_id: gpt-5.3-codex
380
+ thinking:
381
+ reasoning_effort: xhigh
382
+ reasoning_summary: auto
383
+ context_limit: 400000
384
+ max_tokens: 128000
385
+ cost: { input: 1.75, output: 14, cache_read: 0.17 }
386
+
457
387
  - model_name: sonnet
458
388
  model_id: claude-sonnet-4-6
459
389
  context_limit: 200000
@@ -517,4 +447,3 @@ compact_model: gemini-flash
517
447
 
518
448
  sub_agent_models:
519
449
  Explore: sonnet-no-thinking
520
- Web: sonnet-no-thinking
@@ -383,20 +383,6 @@ class Config(BaseModel):
383
383
  if include_disabled or not model.disabled
384
384
  ]
385
385
 
386
- def has_available_image_model(self) -> bool:
387
- """Check if any image generation model is available."""
388
- for entry in self.iter_model_entries(only_available=True, include_disabled=False):
389
- if entry.modalities and "image" in entry.modalities:
390
- return True
391
- return False
392
-
393
- def get_first_available_image_model(self) -> str | None:
394
- """Get the first available image generation model, or None."""
395
- for entry in self.iter_model_entries(only_available=True, include_disabled=False):
396
- if entry.modalities and "image" in entry.modalities:
397
- return entry.model_name
398
- return None
399
-
400
386
  async def save(self) -> None:
401
387
  """Save user config to file (excludes builtin providers).
402
388
 
@@ -444,7 +430,7 @@ def get_example_config() -> UserConfig:
444
430
  return UserConfig(
445
431
  main_model="opus",
446
432
  compact_model="gemini-flash",
447
- sub_agent_models={"Explore": "haiku", "Web": "sonnet", "Task": "sonnet"},
433
+ sub_agent_models={"Explore": "haiku", "Task": "sonnet"},
448
434
  provider_list=[
449
435
  UserProviderConfig(
450
436
  provider_name="my-provider",
@@ -0,0 +1,110 @@
1
+ """Helper for sub-agent model availability and selection logic."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import TYPE_CHECKING
7
+
8
+ from klaude_code.protocol import tools
9
+ from klaude_code.protocol.sub_agent import (
10
+ SubAgentProfile,
11
+ get_sub_agent_profile,
12
+ iter_sub_agent_profiles,
13
+ )
14
+ from klaude_code.protocol.tools import SubAgentType
15
+
16
+ if TYPE_CHECKING:
17
+ from klaude_code.config.config import Config, ModelEntry
18
+
19
+
20
+ @dataclass
21
+ class SubAgentModelInfo:
22
+ """Sub-agent and its current model configuration."""
23
+
24
+ profile: SubAgentProfile
25
+ # Explicitly configured model selector (from config), if any.
26
+ configured_model: str | None
27
+
28
+ # Effective model name used by this sub-agent.
29
+ # - When configured_model is set: equals configured_model.
30
+ # - When inheriting from defaults: resolved model name.
31
+ effective_model: str | None
32
+
33
+
34
+ @dataclass(frozen=True, slots=True)
35
+ class EmptySubAgentModelBehavior:
36
+ """Human-facing description for an unset (empty) sub-agent model config."""
37
+
38
+ # Summary text for UI (kept UI-framework agnostic).
39
+ description: str
40
+
41
+ # Best-effort resolved model name (if any).
42
+ resolved_model_name: str | None
43
+
44
+
45
+ class SubAgentModelHelper:
46
+ """Centralized logic for sub-agent availability and model selection."""
47
+
48
+ def __init__(self, config: Config) -> None:
49
+ self._config = config
50
+
51
+ def describe_empty_model_config_behavior(
52
+ self,
53
+ sub_agent_type: str,
54
+ *,
55
+ main_model_name: str,
56
+ ) -> EmptySubAgentModelBehavior:
57
+ """Describe what happens when a sub-agent model is not configured.
58
+
59
+ Sub-agents default to the Task model if configured, otherwise
60
+ they inherit the main model.
61
+ """
62
+
63
+ _ = get_sub_agent_profile(sub_agent_type)
64
+ task_model = self._config.sub_agent_models.get(tools.TASK)
65
+ resolved = task_model or main_model_name
66
+ return EmptySubAgentModelBehavior(
67
+ description=f"use default behavior: {resolved}",
68
+ resolved_model_name=resolved,
69
+ )
70
+
71
+ def get_available_sub_agents(self) -> list[SubAgentModelInfo]:
72
+ """Return all available sub-agents with their current model config.
73
+
74
+ For sub-agents without explicit config, resolve from Task/main defaults.
75
+ """
76
+ result: list[SubAgentModelInfo] = []
77
+ for profile in iter_sub_agent_profiles():
78
+ configured_model = self._config.sub_agent_models.get(profile.name)
79
+ effective_model = (
80
+ configured_model or self._config.sub_agent_models.get(tools.TASK) or self._config.main_model
81
+ )
82
+ result.append(
83
+ SubAgentModelInfo(
84
+ profile=profile,
85
+ configured_model=configured_model,
86
+ effective_model=effective_model,
87
+ )
88
+ )
89
+ return result
90
+
91
+ def get_selectable_models(self, sub_agent_type: str) -> list[ModelEntry]:
92
+ """Return selectable models for a specific sub-agent type.
93
+
94
+ Returns all available models.
95
+ """
96
+ _ = get_sub_agent_profile(sub_agent_type)
97
+ all_models = self._config.iter_model_entries(only_available=True, include_disabled=False)
98
+ return all_models
99
+
100
+ def build_sub_agent_client_configs(self) -> dict[SubAgentType, str]:
101
+ """Return model names for each sub-agent that needs a dedicated client."""
102
+ result: dict[SubAgentType, str] = {}
103
+ for profile in iter_sub_agent_profiles():
104
+ model_name = self._config.sub_agent_models.get(profile.name)
105
+ if model_name:
106
+ result[profile.name] = model_name
107
+ task_model = self._config.sub_agent_models.get(tools.TASK)
108
+ if task_model:
109
+ result.setdefault(tools.TASK, task_model)
110
+ return result
@@ -10,7 +10,6 @@ from typing import Literal
10
10
  from klaude_code.protocol import llm_param
11
11
  from klaude_code.protocol.model_id import (
12
12
  is_claude_model_any,
13
- is_codex_max_model,
14
13
  is_gemini_flash_model,
15
14
  is_gpt51_model,
16
15
  is_gpt52_model,
@@ -24,7 +23,6 @@ ReasoningEffort = Literal["high", "medium", "low", "minimal", "none", "xhigh"]
24
23
  RESPONSES_LEVELS = ["low", "medium", "high"]
25
24
  RESPONSES_GPT51_LEVELS = ["none", "low", "medium", "high"]
26
25
  RESPONSES_GPT52_LEVELS = ["none", "low", "medium", "high", "xhigh"]
27
- RESPONSES_CODEX_MAX_LEVELS = ["medium", "high", "xhigh"]
28
26
  RESPONSES_GEMINI_FLASH_LEVELS = ["minimal", "low", "medium", "high"]
29
27
 
30
28
  ANTHROPIC_LEVELS: list[tuple[str, int | None]] = [
@@ -37,8 +35,6 @@ ANTHROPIC_LEVELS: list[tuple[str, int | None]] = [
37
35
 
38
36
  def get_levels_for_responses(model_name: str | None) -> list[str]:
39
37
  """Get thinking levels for responses protocol."""
40
- if is_codex_max_model(model_name):
41
- return RESPONSES_CODEX_MAX_LEVELS
42
38
  if is_gpt52_model(model_name):
43
39
  return RESPONSES_GPT52_LEVELS
44
40
  if is_gpt51_model(model_name):
@@ -51,8 +51,6 @@ OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1" # OpenRouter API base URL
51
51
  CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex" # Codex API base URL
52
52
  CODEX_USER_AGENT = "pi" # Codex user agent string
53
53
 
54
- SUPPORTED_IMAGE_SIZES = {"1K", "2K", "4K"} # Supported image sizes for ImageGen tool
55
-
56
54
  LOW_CACHE_HIT_RATE_THRESHOLD = 0.9 # Cache hit rate below this triggers a warning
57
55
  THROUGHPUT_MIN_DURATION_SEC = 0.15 # Minimum duration (seconds) for throughput calculation
58
56
  INITIAL_RETRY_DELAY_S = 1.0 # Initial delay before retrying a failed turn (seconds)
@@ -82,7 +80,6 @@ READ_CHAR_LIMIT_PER_LINE = 2000 # Maximum characters per line before truncation
82
80
  READ_GLOBAL_LINE_CAP = _get_int_env("KLAUDE_READ_GLOBAL_LINE_CAP", 2000) # Maximum lines to read from a file
83
81
  READ_MAX_CHARS = _get_int_env("KLAUDE_READ_MAX_CHARS", 50000) # Maximum total characters to read
84
82
  READ_MAX_IMAGE_BYTES = _get_int_env("KLAUDE_READ_MAX_IMAGE_BYTES", 64 * 1024 * 1024) # Max image size (64MB)
85
- IMAGE_OUTPUT_MAX_BYTES = _get_int_env("KLAUDE_IMAGE_OUTPUT_MAX_BYTES", 64 * 1024 * 1024) # Max decoded image (64MB)
86
83
  BINARY_CHECK_SIZE = 8192 # Bytes to check for binary file detection
87
84
 
88
85
 
@@ -102,13 +99,12 @@ BASH_MODE_SESSION_OUTPUT_MAX_BYTES = 200 * 1024 * 1024 # Max command output cap
102
99
  WEB_FETCH_DEFAULT_TIMEOUT_SEC = 30 # Default timeout for web fetch requests (seconds)
103
100
  WEB_FETCH_USER_AGENT = "Mozilla/5.0 (compatible; KlaudeCode/1.0)" # User-Agent header for web requests
104
101
  WEB_FETCH_MAX_RESPONSE_BYTES = 5 * 1024 * 1024 # Maximum response body size (5MB)
105
- WEB_FETCH_MAX_REDIRECTS = 3 # Maximum number of redirects to follow
102
+ WEB_FETCH_MAX_REDIRECTS = 10 # Maximum number of redirects to follow
106
103
  URL_FILENAME_MAX_LENGTH = 80 # Maximum length for extracting filename from URL
107
104
  WEB_SEARCH_DEFAULT_MAX_RESULTS = 10 # Default number of search results
108
105
  WEB_SEARCH_MAX_RESULTS_LIMIT = 20 # Maximum number of search results allowed
109
106
  WEB_CACHE_TTL_SECONDS = 900 # TTL for web search/fetch cache (15 minutes)
110
107
  WEB_CACHE_MAX_ENTRIES = 100 # Maximum entries in web cache
111
- MERMAID_LIVE_PREFIX = "https://mermaid.live/view#pako:" # Mermaid.live URL prefix
112
108
 
113
109
 
114
110
  # =============================================================================
@@ -250,3 +246,7 @@ class ProjectPaths:
250
246
 
251
247
  def meta_file(self, session_id: str) -> Path:
252
248
  return self.session_dir(session_id) / "meta.json"
249
+
250
+ @property
251
+ def memory_dir(self) -> Path:
252
+ return self.base_dir / "memory"