klaude-code 2.4.0__tar.gz → 2.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. {klaude_code-2.4.0 → klaude_code-2.4.2}/PKG-INFO +2 -2
  2. {klaude_code-2.4.0 → klaude_code-2.4.2}/pyproject.toml +2 -2
  3. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/sub_agent_model_helper.py +0 -9
  4. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/agent_profile.py +9 -23
  5. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/executor.py +13 -18
  6. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/turn.py +1 -0
  7. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/streaming.py +1 -0
  8. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/sub_agent.py +9 -1
  9. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/machine.py +38 -7
  10. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/renderer.py +1 -0
  11. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/selector.py +5 -6
  12. {klaude_code-2.4.0 → klaude_code-2.4.2}/README.md +0 -0
  13. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/__init__.py +0 -0
  14. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/app/__init__.py +0 -0
  15. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/app/runtime.py +0 -0
  16. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/__init__.py +0 -0
  17. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/base.py +0 -0
  18. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/claude/__init__.py +0 -0
  19. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/claude/exceptions.py +0 -0
  20. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/claude/oauth.py +0 -0
  21. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/claude/token_manager.py +0 -0
  22. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/codex/__init__.py +0 -0
  23. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/codex/exceptions.py +0 -0
  24. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  25. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/codex/oauth.py +0 -0
  26. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/auth/codex/token_manager.py +0 -0
  27. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/__init__.py +0 -0
  28. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/auth_cmd.py +0 -0
  29. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/config_cmd.py +0 -0
  30. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/cost_cmd.py +0 -0
  31. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/debug.py +0 -0
  32. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/list_model.py +0 -0
  33. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/main.py +0 -0
  34. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/self_update.py +0 -0
  35. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/cli/session_cmd.py +0 -0
  36. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/__init__.py +0 -0
  37. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/assets/__init__.py +0 -0
  38. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
  39. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/builtin_config.py +0 -0
  40. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/config.py +0 -0
  41. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/model_matcher.py +0 -0
  42. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/config/thinking.py +0 -0
  43. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/const.py +0 -0
  44. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/__init__.py +0 -0
  45. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/agent.py +0 -0
  46. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/manager/__init__.py +0 -0
  47. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/manager/llm_clients.py +0 -0
  48. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  49. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  50. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  51. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  52. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  53. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  54. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  55. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  56. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-nano-banana.md +0 -0
  57. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  58. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-sub-agent-image-gen.md +0 -0
  59. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  60. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  61. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/reminders.py +0 -0
  62. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/task.py +0 -0
  63. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/__init__.py +0 -0
  64. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/context.py +0 -0
  65. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/__init__.py +0 -0
  66. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/_utils.py +0 -0
  67. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  68. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  69. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  70. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  71. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  72. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  73. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  74. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  75. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  76. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  77. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  78. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  79. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  80. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  81. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  82. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  83. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  84. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  85. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  86. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  87. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  88. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  89. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/tool_abc.py +0 -0
  90. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/tool_registry.py +0 -0
  91. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/tool_runner.py +0 -0
  92. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/truncation.py +0 -0
  93. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/__init__.py +0 -0
  94. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
  95. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  96. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  97. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  98. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  99. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  100. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/__init__.py +0 -0
  101. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  102. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/anthropic/client.py +0 -0
  103. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/anthropic/input.py +0 -0
  104. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/bedrock/__init__.py +0 -0
  105. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/bedrock/client.py +0 -0
  106. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/claude/__init__.py +0 -0
  107. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/claude/client.py +0 -0
  108. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/client.py +0 -0
  109. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/codex/__init__.py +0 -0
  110. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/codex/client.py +0 -0
  111. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/google/__init__.py +0 -0
  112. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/google/client.py +0 -0
  113. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/google/input.py +0 -0
  114. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/image.py +0 -0
  115. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/input_common.py +0 -0
  116. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  117. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  118. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  119. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
  120. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  121. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  122. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openrouter/client.py +0 -0
  123. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openrouter/input.py +0 -0
  124. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  125. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/registry.py +0 -0
  126. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/responses/__init__.py +0 -0
  127. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/responses/client.py +0 -0
  128. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/responses/input.py +0 -0
  129. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/llm/usage.py +0 -0
  130. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/log.py +0 -0
  131. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/__init__.py +0 -0
  132. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/commands.py +0 -0
  133. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/__init__.py +0 -0
  134. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/base.py +0 -0
  135. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/chat.py +0 -0
  136. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/lifecycle.py +0 -0
  137. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/metadata.py +0 -0
  138. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/system.py +0 -0
  139. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/events/tools.py +0 -0
  140. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/llm_param.py +0 -0
  141. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/message.py +0 -0
  142. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/model.py +0 -0
  143. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/op.py +0 -0
  144. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/op_handler.py +0 -0
  145. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/sub_agent/AGENTS.md +0 -0
  146. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  147. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  148. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/sub_agent/image_gen.py +0 -0
  149. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  150. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  151. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/protocol/tools.py +0 -0
  152. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/__init__.py +0 -0
  153. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/codec.py +0 -0
  154. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/export.py +0 -0
  155. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/selector.py +0 -0
  156. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/session.py +0 -0
  157. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/store.py +0 -0
  158. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/templates/export_session.html +0 -0
  159. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
  160. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/__init__.py +0 -0
  161. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/assets/create-plan/SKILL.md +0 -0
  162. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  163. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  164. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  165. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  166. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/loader.py +0 -0
  167. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/manager.py +0 -0
  168. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/skill/system_skills.py +0 -0
  169. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/__init__.py +0 -0
  170. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/__init__.py +0 -0
  171. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/clear_cmd.py +0 -0
  172. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/command_abc.py +0 -0
  173. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/copy_cmd.py +0 -0
  174. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/debug_cmd.py +0 -0
  175. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/export_cmd.py +0 -0
  176. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/export_online_cmd.py +0 -0
  177. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/fork_session_cmd.py +0 -0
  178. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/model_cmd.py +0 -0
  179. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/model_picker.py +0 -0
  180. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/prompt-init.md +0 -0
  181. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/prompt_command.py +0 -0
  182. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/refresh_cmd.py +0 -0
  183. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/registry.py +0 -0
  184. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/resume_cmd.py +0 -0
  185. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/status_cmd.py +0 -0
  186. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/sub_agent_model_cmd.py +0 -0
  187. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/terminal_setup_cmd.py +0 -0
  188. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/command/thinking_cmd.py +0 -0
  189. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/commands.py +0 -0
  190. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/__init__.py +0 -0
  191. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/assistant.py +0 -0
  192. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/bash_syntax.py +0 -0
  193. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/command_output.py +0 -0
  194. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/common.py +0 -0
  195. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/developer.py +0 -0
  196. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/diffs.py +0 -0
  197. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/errors.py +0 -0
  198. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/mermaid_viewer.py +0 -0
  199. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/metadata.py +0 -0
  200. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/__init__.py +0 -0
  201. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/cjk_wrap.py +0 -0
  202. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/code_panel.py +0 -0
  203. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/live.py +0 -0
  204. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/markdown.py +0 -0
  205. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/quote.py +0 -0
  206. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/searchable_text.py +0 -0
  207. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/status.py +0 -0
  208. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/rich/theme.py +0 -0
  209. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/thinking.py +0 -0
  210. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/tools.py +0 -0
  211. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/user_input.py +0 -0
  212. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/components/welcome.py +0 -0
  213. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/display.py +0 -0
  214. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/input/__init__.py +0 -0
  215. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/input/clipboard.py +0 -0
  216. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/input/completers.py +0 -0
  217. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/input/key_bindings.py +0 -0
  218. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/input/prompt_toolkit.py +0 -0
  219. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/runner.py +0 -0
  220. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/__init__.py +0 -0
  221. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/color.py +0 -0
  222. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/control.py +0 -0
  223. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/image.py +0 -0
  224. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/notifier.py +0 -0
  225. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/tui/terminal/progress_bar.py +0 -0
  226. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/__init__.py +0 -0
  227. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/common.py +0 -0
  228. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/core/__init__.py +0 -0
  229. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/core/display.py +0 -0
  230. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/core/input.py +0 -0
  231. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/debug_mode.py +0 -0
  232. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/terminal/__init__.py +0 -0
  233. {klaude_code-2.4.0 → klaude_code-2.4.2}/src/klaude_code/ui/terminal/title.py +0 -0
  234. {klaude_code-2.4.0 → klaude_code-2.4.2}/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.4.0
3
+ Version: 2.4.2
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -17,7 +17,7 @@ Requires-Dist: rich>=14.1.0
17
17
  Requires-Dist: term-image>=0.7.2
18
18
  Requires-Dist: trafilatura>=2.0.0
19
19
  Requires-Dist: typer>=0.17.3
20
- Requires-Python: >=3.13
20
+ Requires-Python: >=3.13, <3.14
21
21
  Description-Content-Type: text/markdown
22
22
 
23
23
  # Klaude Code
@@ -4,10 +4,10 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "2.4.0"
7
+ version = "2.4.2"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
- requires-python = ">=3.13"
10
+ requires-python = ">=3.13,<3.14"
11
11
  dependencies = [
12
12
  "anthropic>=0.66.0",
13
13
  "chardet>=5.2.0",
@@ -196,15 +196,6 @@ class SubAgentModelHelper:
196
196
  result.append(name)
197
197
  return result
198
198
 
199
- def get_enabled_sub_agent_types(self) -> set[SubAgentType]:
200
- """Return set of sub-agent types that are enabled and available."""
201
- enabled: set[SubAgentType] = set()
202
- for name in sub_agent_tool_names(enabled_only=True):
203
- profile = get_sub_agent_profile_by_tool(name)
204
- if profile is not None and self.check_availability_requirement(profile.availability_requirement):
205
- enabled.add(profile.name)
206
- return enabled
207
-
208
199
  def build_sub_agent_client_configs(self) -> dict[SubAgentType, str]:
209
200
  """Return model names for each sub-agent that needs a dedicated client."""
210
201
  result: dict[SubAgentType, str] = {}
@@ -262,10 +262,6 @@ class ModelProfileProvider(Protocol):
262
262
  output_schema: dict[str, Any] | None = None,
263
263
  ) -> AgentProfile: ...
264
264
 
265
- def enabled_sub_agent_types(self) -> set[tools.SubAgentType]:
266
- """Return set of sub-agent types enabled for this provider."""
267
- ...
268
-
269
265
 
270
266
  class DefaultModelProfileProvider(ModelProfileProvider):
271
267
  """Default provider backed by global prompts/tool/reminder registries."""
@@ -281,28 +277,24 @@ class DefaultModelProfileProvider(ModelProfileProvider):
281
277
  output_schema: dict[str, Any] | None = None,
282
278
  ) -> AgentProfile:
283
279
  model_name = llm_client.model_name
280
+ llm_config = llm_client.get_llm_config()
281
+
282
+ # Image generation models should not have tools
283
+ if llm_config.modalities and "image" in llm_config.modalities:
284
+ agent_tools: list[llm_param.ToolSchema] = []
285
+ else:
286
+ agent_tools = load_agent_tools(model_name, sub_agent_type, config=self._config)
287
+
284
288
  profile = AgentProfile(
285
289
  llm_client=llm_client,
286
290
  system_prompt=load_system_prompt(model_name, llm_client.protocol, sub_agent_type),
287
- tools=load_agent_tools(model_name, sub_agent_type, config=self._config),
291
+ tools=agent_tools,
288
292
  reminders=load_agent_reminders(model_name, sub_agent_type),
289
293
  )
290
294
  if output_schema:
291
295
  return with_structured_output(profile, output_schema)
292
296
  return profile
293
297
 
294
- def enabled_sub_agent_types(self) -> set[tools.SubAgentType]:
295
- if self._config is None:
296
- from klaude_code.protocol.sub_agent import get_sub_agent_profile_by_tool, sub_agent_tool_names
297
-
298
- return {
299
- profile.name
300
- for name in sub_agent_tool_names(enabled_only=True)
301
- if (profile := get_sub_agent_profile_by_tool(name)) is not None
302
- }
303
- helper = SubAgentModelHelper(self._config)
304
- return helper.get_enabled_sub_agent_types()
305
-
306
298
 
307
299
  class VanillaModelProfileProvider(ModelProfileProvider):
308
300
  """Provider that strips prompts, reminders, and tools for vanilla mode."""
@@ -325,9 +317,6 @@ class VanillaModelProfileProvider(ModelProfileProvider):
325
317
  return with_structured_output(profile, output_schema)
326
318
  return profile
327
319
 
328
- def enabled_sub_agent_types(self) -> set[tools.SubAgentType]:
329
- return set()
330
-
331
320
 
332
321
  class NanoBananaModelProfileProvider(ModelProfileProvider):
333
322
  """Provider for the Nano Banana image generation model.
@@ -352,6 +341,3 @@ class NanoBananaModelProfileProvider(ModelProfileProvider):
352
341
  if output_schema:
353
342
  return with_structured_output(profile, output_schema)
354
343
  return profile
355
-
356
- def enabled_sub_agent_types(self) -> set[tools.SubAgentType]:
357
- return set()
@@ -17,14 +17,14 @@ from pathlib import Path
17
17
  from klaude_code.config import load_config
18
18
  from klaude_code.config.sub_agent_model_helper import SubAgentModelHelper
19
19
  from klaude_code.core.agent import Agent
20
- from klaude_code.core.agent_profile import DefaultModelProfileProvider, ModelProfileProvider
20
+ from klaude_code.core.agent_profile import AgentProfile, DefaultModelProfileProvider, ModelProfileProvider
21
21
  from klaude_code.core.manager import LLMClients, SubAgentManager
22
22
  from klaude_code.llm.registry import create_llm_client
23
23
  from klaude_code.log import DebugType, log_debug
24
24
  from klaude_code.protocol import commands, events, message, model, op
25
25
  from klaude_code.protocol.llm_param import LLMConfigParameter, Thinking
26
26
  from klaude_code.protocol.op_handler import OperationHandler
27
- from klaude_code.protocol.sub_agent import SubAgentResult
27
+ from klaude_code.protocol.sub_agent import SubAgentResult, get_sub_agent_profile_by_tool
28
28
  from klaude_code.session.export import build_export_html, get_default_export_path
29
29
  from klaude_code.session.session import Session
30
30
 
@@ -110,13 +110,17 @@ class AgentRuntime:
110
110
  def current_agent(self) -> Agent | None:
111
111
  return self._agent
112
112
 
113
- def _get_sub_agent_models(self) -> dict[str, LLMConfigParameter]:
114
- """Build a dict of sub-agent type to LLMConfigParameter."""
115
- enabled = self._model_profile_provider.enabled_sub_agent_types()
113
+ def _get_sub_agent_models(self, profile: AgentProfile) -> dict[str, LLMConfigParameter]:
114
+ """Build a dict of sub-agent type to LLMConfigParameter based on profile tools."""
115
+ enabled_types: set[str] = set()
116
+ for tool in profile.tools:
117
+ sub_profile = get_sub_agent_profile_by_tool(tool.name)
118
+ if sub_profile is not None:
119
+ enabled_types.add(sub_profile.name)
116
120
  return {
117
121
  sub_agent_type: client.get_llm_config()
118
122
  for sub_agent_type, client in self._llm_clients.sub_clients.items()
119
- if sub_agent_type in enabled
123
+ if sub_agent_type in enabled_types
120
124
  }
121
125
 
122
126
  async def ensure_agent(self, session_id: str | None = None) -> Agent:
@@ -145,7 +149,7 @@ class AgentRuntime:
145
149
  session_id=session.id,
146
150
  work_dir=str(session.work_dir),
147
151
  llm_config=self._llm_clients.main.get_llm_config(),
148
- sub_agent_models=self._get_sub_agent_models(),
152
+ sub_agent_models=self._get_sub_agent_models(profile),
149
153
  )
150
154
  )
151
155
 
@@ -202,7 +206,7 @@ class AgentRuntime:
202
206
  session_id=agent.session.id,
203
207
  work_dir=str(agent.session.work_dir),
204
208
  llm_config=self._llm_clients.main.get_llm_config(),
205
- sub_agent_models=self._get_sub_agent_models(),
209
+ sub_agent_models=self._get_sub_agent_models(agent.profile),
206
210
  )
207
211
  )
208
212
 
@@ -226,7 +230,7 @@ class AgentRuntime:
226
230
  session_id=target_session.id,
227
231
  work_dir=str(target_session.work_dir),
228
232
  llm_config=self._llm_clients.main.get_llm_config(),
229
- sub_agent_models=self._get_sub_agent_models(),
233
+ sub_agent_models=self._get_sub_agent_models(profile),
230
234
  )
231
235
  )
232
236
 
@@ -410,15 +414,6 @@ class ExecutorContext:
410
414
  """Emit an event to the UI display system."""
411
415
  await self.event_queue.put(event)
412
416
 
413
- def _get_sub_agent_models(self) -> dict[str, LLMConfigParameter]:
414
- """Build a dict of sub-agent type to LLMConfigParameter."""
415
- enabled = self.model_profile_provider.enabled_sub_agent_types()
416
- return {
417
- sub_agent_type: client.get_llm_config()
418
- for sub_agent_type, client in self.llm_clients.sub_clients.items()
419
- if sub_agent_type in enabled
420
- }
421
-
422
417
  def current_session_id(self) -> str | None:
423
418
  """Return the primary active session id, if any.
424
419
 
@@ -366,6 +366,7 @@ class TurnExecutor:
366
366
  response_id=msg.response_id,
367
367
  tool_call_id=msg.call_id,
368
368
  tool_name=msg.name,
369
+ model_id=ctx.llm_client.model_name,
369
370
  )
370
371
  case _:
371
372
  continue
@@ -34,6 +34,7 @@ class AssistantImageDeltaEvent(ResponseEvent):
34
34
  class ToolCallStartEvent(ResponseEvent):
35
35
  tool_call_id: str
36
36
  tool_name: str
37
+ model_id: str | None = None
37
38
 
38
39
 
39
40
  class ResponseCompleteEvent(ResponseEvent):
@@ -81,6 +81,7 @@ def render_sub_agent_result(
81
81
  *,
82
82
  has_structured_output: bool = False,
83
83
  description: str | None = None,
84
+ sub_agent_color: Style | None = None,
84
85
  ) -> RenderableType:
85
86
  stripped_result = result.strip()
86
87
  main_content, agent_id_footer = _extract_agent_id_footer(stripped_result)
@@ -88,7 +89,14 @@ def render_sub_agent_result(
88
89
 
89
90
  elements: list[RenderableType] = []
90
91
  if description:
91
- elements.append(Text(f"---\n{description}", style=ThemeKey.TOOL_RESULT))
92
+ elements.append(
93
+ Text(
94
+ f"---\n{description}",
95
+ style=Style(bold=True, color=sub_agent_color.color, frame=True)
96
+ if sub_agent_color
97
+ else ThemeKey.TOOL_RESULT_BOLD,
98
+ )
99
+ )
92
100
 
93
101
  # Try structured JSON output first
94
102
  use_text_rendering = True
@@ -10,7 +10,7 @@ from klaude_code.const import (
10
10
  STATUS_DEFAULT_TEXT,
11
11
  STATUS_THINKING_TEXT,
12
12
  )
13
- from klaude_code.protocol import events, model
13
+ from klaude_code.protocol import events, model, tools
14
14
  from klaude_code.tui.commands import (
15
15
  AppendAssistant,
16
16
  AppendThinking,
@@ -48,6 +48,33 @@ from klaude_code.tui.components.rich.theme import ThemeKey
48
48
  from klaude_code.tui.components.thinking import extract_last_bold_header, normalize_thinking_content
49
49
  from klaude_code.tui.components.tools import get_tool_active_form, is_sub_agent_tool
50
50
 
51
+ # Tools that complete quickly and don't benefit from streaming activity display.
52
+ # For models without fine-grained tool JSON streaming (e.g., Gemini), showing these
53
+ # in the activity state causes a flash-and-disappear effect.
54
+ FAST_TOOLS: frozenset[str] = frozenset(
55
+ {
56
+ tools.READ,
57
+ tools.EDIT,
58
+ tools.WRITE,
59
+ tools.BASH,
60
+ tools.TODO_WRITE,
61
+ tools.UPDATE_PLAN,
62
+ tools.APPLY_PATCH,
63
+ tools.REPORT_BACK,
64
+ }
65
+ )
66
+
67
+
68
+ def _should_skip_tool_activity(tool_name: str, model_id: str | None) -> bool:
69
+ """Check if tool activity should be skipped for non-streaming models."""
70
+ if model_id is None:
71
+ return False
72
+ if tool_name not in FAST_TOOLS:
73
+ return False
74
+ # Gemini and Grok models don't stream tool JSON at fine granularity
75
+ model_lower = model_id.lower()
76
+ return "gemini" in model_lower or "grok" in model_lower
77
+
51
78
 
52
79
  @dataclass
53
80
  class SubAgentThinkingHeaderState:
@@ -142,7 +169,8 @@ class ActivityState:
142
169
 
143
170
  if self._sub_agent_tool_calls:
144
171
  _append_counts(self._sub_agent_tool_calls)
145
- activity_text.append(" | ")
172
+ if self._tool_calls:
173
+ activity_text.append(" , ")
146
174
 
147
175
  if self._tool_calls:
148
176
  _append_counts(self._tool_calls)
@@ -497,11 +525,14 @@ class DisplayStateMachine:
497
525
 
498
526
  self._spinner.set_composing(False)
499
527
 
500
- tool_active_form = get_tool_active_form(e.tool_name)
501
- if is_sub_agent_tool(e.tool_name):
502
- self._spinner.add_sub_agent_tool_call(e.tool_call_id, tool_active_form)
503
- else:
504
- self._spinner.add_tool_call(tool_active_form)
528
+ # Skip activity state for fast tools on non-streaming models (e.g., Gemini)
529
+ # to avoid flash-and-disappear effect
530
+ if not _should_skip_tool_activity(e.tool_name, e.model_id):
531
+ tool_active_form = get_tool_active_form(e.tool_name)
532
+ if is_sub_agent_tool(e.tool_name):
533
+ self._spinner.add_sub_agent_tool_call(e.tool_call_id, tool_active_form)
534
+ else:
535
+ self._spinner.add_tool_call(tool_active_form)
505
536
 
506
537
  cmds.extend(self._spinner_update_commands())
507
538
  return cmds
@@ -569,6 +569,7 @@ class TUICommandRenderer:
569
569
  event.task_result,
570
570
  has_structured_output=event.has_structured_output,
571
571
  description=description,
572
+ sub_agent_color=self._current_sub_agent_color,
572
573
  )
573
574
  )
574
575
 
@@ -54,17 +54,16 @@ def build_model_select_items(models: list[Any]) -> list[SelectItem[str]]:
54
54
  items: list[SelectItem[str]] = []
55
55
  for idx, m in enumerate(models, 1):
56
56
  model_id_str = m.model_id or "N/A"
57
- # Display the base model name only; provider stays in the meta section.
58
57
  display_name = m.model_name
59
58
  first_line_prefix = f"{display_name:<{max_model_name_length}} → "
60
- meta_parts: list[str] = [m.provider]
61
- meta_parts.extend(format_model_params(m))
62
- meta_str = " · ".join(meta_parts)
59
+ provider_model = f"{m.provider}/{model_id_str}"
60
+ meta_parts = format_model_params(m)
61
+ meta_str = " · ".join(meta_parts) if meta_parts else ""
63
62
  title = [
64
63
  ("class:meta", f"{idx:>{num_width}}. "),
65
64
  ("class:msg", first_line_prefix),
66
- ("class:msg bold", model_id_str),
67
- ("class:meta", f" {meta_str}\n"),
65
+ ("class:msg bold", provider_model),
66
+ ("class:meta", f" {meta_str}\n" if meta_str else "\n"),
68
67
  ]
69
68
  search_text = f"{m.selector} {m.model_name} {model_id_str} {m.provider}"
70
69
  items.append(SelectItem(title=title, value=m.selector, search_text=search_text))
File without changes