klaude-code 1.2.30__tar.gz → 1.4.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 (211) hide show
  1. {klaude_code-1.2.30 → klaude_code-1.4.0}/PKG-INFO +1 -2
  2. {klaude_code-1.2.30 → klaude_code-1.4.0}/pyproject.toml +1 -2
  3. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/runtime.py +2 -2
  4. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/session_cmd.py +24 -9
  5. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/model_cmd.py +19 -14
  6. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/thinking_cmd.py +24 -19
  7. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/config/select_model.py +40 -30
  8. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/__init__.py +2 -0
  9. klaude_code-1.4.0/src/klaude_code/core/tool/file/move_tool.md +41 -0
  10. klaude_code-1.4.0/src/klaude_code/core/tool/file/move_tool.py +435 -0
  11. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/tool_registry.py +3 -3
  12. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/sub_agent/task.py +1 -1
  13. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/tools.py +1 -0
  14. klaude_code-1.4.0/src/klaude_code/session/selector.py +98 -0
  15. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/event_handler.py +8 -2
  16. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +21 -1
  17. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/key_bindings.py +113 -9
  18. klaude_code-1.4.0/src/klaude_code/ui/renderers/bash_syntax.py +178 -0
  19. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/developer.py +15 -6
  20. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/errors.py +1 -1
  21. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/tools.py +60 -148
  22. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/searchable_text.py +4 -7
  23. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/status.py +55 -2
  24. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/theme.py +3 -1
  25. klaude_code-1.4.0/src/klaude_code/ui/terminal/selector.py +273 -0
  26. klaude_code-1.2.30/src/klaude_code/session/selector.py +0 -81
  27. {klaude_code-1.2.30 → klaude_code-1.4.0}/README.md +0 -0
  28. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/__init__.py +0 -0
  29. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/auth/__init__.py +0 -0
  30. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/auth/codex/__init__.py +0 -0
  31. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/auth/codex/exceptions.py +0 -0
  32. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  33. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/auth/codex/oauth.py +0 -0
  34. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/auth/codex/token_manager.py +0 -0
  35. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/__init__.py +0 -0
  36. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/auth_cmd.py +0 -0
  37. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/config_cmd.py +0 -0
  38. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/debug.py +0 -0
  39. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/list_model.py +0 -0
  40. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/main.py +0 -0
  41. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/cli/self_update.py +0 -0
  42. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/__init__.py +0 -0
  43. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/clear_cmd.py +0 -0
  44. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/command_abc.py +0 -0
  45. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/debug_cmd.py +0 -0
  46. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/export_cmd.py +0 -0
  47. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/export_online_cmd.py +0 -0
  48. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/fork_session_cmd.py +0 -0
  49. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/help_cmd.py +0 -0
  50. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/prompt-init.md +0 -0
  51. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/prompt-jj-describe.md +0 -0
  52. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/prompt_command.py +0 -0
  53. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/refresh_cmd.py +0 -0
  54. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/registry.py +0 -0
  55. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/release_notes_cmd.py +0 -0
  56. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/resume_cmd.py +0 -0
  57. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/status_cmd.py +0 -0
  58. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  59. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/config/__init__.py +0 -0
  60. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/config/assets/__init__.py +0 -0
  61. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
  62. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/config/builtin_config.py +0 -0
  63. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/config/config.py +0 -0
  64. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/const.py +0 -0
  65. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/__init__.py +0 -0
  66. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/agent.py +0 -0
  67. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/executor.py +0 -0
  68. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/manager/__init__.py +0 -0
  69. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/manager/llm_clients.py +0 -0
  70. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  71. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  72. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompt.py +0 -0
  73. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  74. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  75. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  76. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  77. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  78. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  79. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  80. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  81. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  82. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  83. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/reminders.py +0 -0
  84. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/task.py +0 -0
  85. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/__init__.py +0 -0
  86. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/_utils.py +0 -0
  87. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  88. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  89. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  90. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  91. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  92. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  93. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  94. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  95. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  96. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  97. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  98. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  99. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  100. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  101. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  102. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/skill/__init__.py +0 -0
  103. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
  104. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
  105. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  106. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  107. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  108. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  109. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  110. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  111. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  112. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/tool_abc.py +0 -0
  113. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/tool_context.py +0 -0
  114. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/tool_runner.py +0 -0
  115. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/truncation.py +0 -0
  116. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/__init__.py +0 -0
  117. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
  118. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  119. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  120. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  121. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  122. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  123. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/core/turn.py +0 -0
  124. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/__init__.py +0 -0
  125. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  126. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/anthropic/client.py +0 -0
  127. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/anthropic/input.py +0 -0
  128. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/client.py +0 -0
  129. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/codex/__init__.py +0 -0
  130. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/codex/client.py +0 -0
  131. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/input_common.py +0 -0
  132. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  133. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  134. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  135. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
  136. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  137. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  138. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openrouter/client.py +0 -0
  139. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openrouter/input.py +0 -0
  140. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  141. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/registry.py +0 -0
  142. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/responses/__init__.py +0 -0
  143. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/responses/client.py +0 -0
  144. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/responses/input.py +0 -0
  145. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/llm/usage.py +0 -0
  146. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/__init__.py +0 -0
  147. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/commands.py +0 -0
  148. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/events.py +0 -0
  149. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/llm_param.py +0 -0
  150. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/model.py +0 -0
  151. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/op.py +0 -0
  152. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/op_handler.py +0 -0
  153. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  154. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  155. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  156. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  157. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/__init__.py +0 -0
  158. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/codec.py +0 -0
  159. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/export.py +0 -0
  160. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/session.py +0 -0
  161. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/store.py +0 -0
  162. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/templates/export_session.html +0 -0
  163. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
  164. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/__init__.py +0 -0
  165. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  166. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
  167. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  168. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  169. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  170. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/loader.py +0 -0
  171. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/manager.py +0 -0
  172. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/skill/system_skills.py +0 -0
  173. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/trace/__init__.py +0 -0
  174. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/trace/log.py +0 -0
  175. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/__init__.py +0 -0
  176. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/core/__init__.py +0 -0
  177. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/core/display.py +0 -0
  178. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/core/input.py +0 -0
  179. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/core/stage_manager.py +0 -0
  180. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/__init__.py +0 -0
  181. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  182. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/debug/display.py +0 -0
  183. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  184. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/exec/display.py +0 -0
  185. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
  186. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  187. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/completers.py +0 -0
  188. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/display.py +0 -0
  189. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
  190. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/__init__.py +0 -0
  191. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/assistant.py +0 -0
  192. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/common.py +0 -0
  193. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/diffs.py +0 -0
  194. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/mermaid_viewer.py +0 -0
  195. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/metadata.py +0 -0
  196. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
  197. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/thinking.py +0 -0
  198. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/renderers/user_input.py +0 -0
  199. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/__init__.py +0 -0
  200. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  201. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/code_panel.py +0 -0
  202. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/live.py +0 -0
  203. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/markdown.py +0 -0
  204. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/rich/quote.py +0 -0
  205. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/terminal/__init__.py +0 -0
  206. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/terminal/color.py +0 -0
  207. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/terminal/control.py +0 -0
  208. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/terminal/notifier.py +0 -0
  209. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  210. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/utils/__init__.py +0 -0
  211. {klaude_code-1.2.30 → klaude_code-1.4.0}/src/klaude_code/ui/utils/common.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 1.2.30
3
+ Version: 1.4.0
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -12,7 +12,6 @@ Requires-Dist: pillow>=12.0.0
12
12
  Requires-Dist: prompt-toolkit>=3.0.52
13
13
  Requires-Dist: pydantic>=2.11.7
14
14
  Requires-Dist: pyyaml>=6.0.2
15
- Requires-Dist: questionary>=2.1.1
16
15
  Requires-Dist: rich>=14.1.0
17
16
  Requires-Dist: trafilatura>=2.0.0
18
17
  Requires-Dist: typer>=0.17.3
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "1.2.30"
7
+ version = "1.4.0"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -19,7 +19,6 @@ dependencies = [
19
19
  "prompt-toolkit>=3.0.52",
20
20
  "pydantic>=2.11.7",
21
21
  "pyyaml>=6.0.2",
22
- "questionary>=2.1.1",
23
22
  "rich>=14.1.0",
24
23
  "trafilatura>=2.0.0",
25
24
  "typer>=0.17.3",
@@ -273,7 +273,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
273
273
  display.wrapped_display.renderer.stop_bottom_live()
274
274
 
275
275
  # Pass the pre-detected theme to avoid redundant TTY queries.
276
- # Querying the terminal background again after questionary's interactive selection
276
+ # Querying the terminal background again after an interactive selection
277
277
  # can interfere with prompt_toolkit's terminal state and break history navigation.
278
278
  is_light_background: bool | None = None
279
279
  if components.theme == "light":
@@ -352,7 +352,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
352
352
  op.UserInputOperation(input=user_input, session_id=active_session_id)
353
353
  )
354
354
  # If it's an interactive command (e.g., /model), avoid starting the ESC monitor
355
- # to prevent TTY conflicts with interactive prompts (questionary/prompt_toolkit).
355
+ # to prevent TTY conflicts with interactive prompt_toolkit UIs.
356
356
  if has_interactive_command(user_input.text):
357
357
  await components.executor.wait_for(submission_id)
358
358
  else:
@@ -7,8 +7,11 @@ from klaude_code.trace import log
7
7
 
8
8
 
9
9
  def _session_confirm(sessions: list[Session.SessionMetaBrief], message: str) -> bool:
10
- """Show session list and confirm deletion using questionary."""
11
- import questionary
10
+ """Show session list and confirm deletion using prompt_toolkit."""
11
+
12
+ from prompt_toolkit.styles import Style
13
+
14
+ from klaude_code.ui.terminal.selector import SelectItem, select_one
12
15
 
13
16
  def _fmt(ts: float) -> str:
14
17
  try:
@@ -24,14 +27,26 @@ def _session_confirm(sessions: list[Session.SessionMetaBrief], message: str) ->
24
27
  first_msg += "..."
25
28
  log(f" {_fmt(s.updated_at)} {msg_count_display:>3} msgs {first_msg}")
26
29
 
27
- return (
28
- questionary.confirm(
29
- message,
30
- default=False,
31
- style=questionary.Style([("question", "bold")]),
32
- ).ask()
33
- or False
30
+ items: list[SelectItem[bool]] = [
31
+ SelectItem(title=[("class:text", "No\n")], value=False, search_text="No"),
32
+ SelectItem(title=[("class:text", "Yes\n")], value=True, search_text="Yes"),
33
+ ]
34
+
35
+ result = select_one(
36
+ message=message,
37
+ items=items,
38
+ pointer="→",
39
+ style=Style(
40
+ [
41
+ ("question", "bold"),
42
+ ("pointer", "ansigreen"),
43
+ ("highlighted", "ansigreen"),
44
+ ("text", ""),
45
+ ]
46
+ ),
47
+ use_search_filter=False,
34
48
  )
49
+ return bool(result)
35
50
 
36
51
 
37
52
  def session_clean(
@@ -1,38 +1,43 @@
1
1
  import asyncio
2
2
 
3
- import questionary
3
+ from prompt_toolkit.styles import Style
4
4
 
5
5
  from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
6
6
  from klaude_code.config.select_model import select_model_from_config
7
7
  from klaude_code.protocol import commands, events, model, op
8
+ from klaude_code.ui.terminal.selector import SelectItem, select_one
8
9
 
9
- SELECT_STYLE = questionary.Style(
10
+ SELECT_STYLE = Style(
10
11
  [
11
12
  ("instruction", "ansibrightblack"),
12
- ("pointer", "ansicyan"),
13
- ("highlighted", "ansicyan"),
13
+ ("pointer", "ansigreen"),
14
+ ("highlighted", "ansigreen"),
14
15
  ("text", "ansibrightblack"),
16
+ ("question", ""),
15
17
  ]
16
18
  )
17
19
 
18
20
 
19
21
  def _confirm_change_default_model_sync(selected_model: str) -> bool:
20
- choices: list[questionary.Choice] = [
21
- questionary.Choice(title="No (session only)", value=False),
22
- questionary.Choice(title="Yes (save as default)", value=True),
22
+ items: list[SelectItem[bool]] = [
23
+ SelectItem(title=[("class:text", "No (session only)\n")], value=False, search_text="No"),
24
+ SelectItem(
25
+ title=[("class:text", "Yes (save as default main_model in ~/.klaude/klaude-config.yaml)\n")],
26
+ value=True,
27
+ search_text="Yes",
28
+ ),
23
29
  ]
24
30
 
25
31
  try:
26
32
  # Add a blank line between the model selector and this confirmation prompt.
27
- questionary.print("")
28
- result = questionary.select(
29
- message=f"Save '{selected_model}' as default model (main_model)?",
30
- choices=choices,
33
+ print("")
34
+ result = select_one(
35
+ message=f"Save '{selected_model}' as default model?",
36
+ items=items,
31
37
  pointer="→",
32
- instruction="Use arrow keys to move, Enter to select",
33
- use_jk_keys=False,
34
38
  style=SELECT_STYLE,
35
- ).ask()
39
+ use_search_filter=False,
40
+ )
36
41
  except KeyboardInterrupt:
37
42
  return False
38
43
 
@@ -1,9 +1,10 @@
1
1
  import asyncio
2
2
 
3
- import questionary
3
+ from prompt_toolkit.styles import Style
4
4
 
5
5
  from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
6
6
  from klaude_code.protocol import commands, events, llm_param, model
7
+ from klaude_code.ui.terminal.selector import SelectItem, select_one
7
8
 
8
9
  # Thinking level options for different protocols
9
10
  RESPONSES_LEVELS = ["low", "medium", "high"]
@@ -118,12 +119,13 @@ def format_current_thinking(config: llm_param.LLMConfigParameter) -> str:
118
119
  return "unknown protocol"
119
120
 
120
121
 
121
- SELECT_STYLE = questionary.Style(
122
+ SELECT_STYLE = Style(
122
123
  [
123
124
  ("instruction", "ansibrightblack"),
124
- ("pointer", "ansicyan"),
125
- ("highlighted", "ansicyan"),
125
+ ("pointer", "ansigreen"),
126
+ ("highlighted", "ansigreen"),
126
127
  ("text", "ansibrightblack"),
128
+ ("question", ""),
127
129
  ]
128
130
  )
129
131
 
@@ -131,17 +133,18 @@ SELECT_STYLE = questionary.Style(
131
133
  def _select_responses_thinking_sync(model_name: str | None) -> llm_param.Thinking | None:
132
134
  """Select thinking level for responses/codex protocol (sync version)."""
133
135
  levels = _get_levels_for_responses(model_name)
134
- choices: list[questionary.Choice] = [questionary.Choice(title=level, value=level) for level in levels]
136
+ items: list[SelectItem[str]] = [
137
+ SelectItem(title=[("class:text", level + "\n")], value=level, search_text=level) for level in levels
138
+ ]
135
139
 
136
140
  try:
137
- result = questionary.select(
141
+ result = select_one(
138
142
  message="Select reasoning effort:",
139
- choices=choices,
143
+ items=items,
140
144
  pointer="→",
141
- instruction="Use arrow keys to move, Enter to select",
142
- use_jk_keys=False,
143
145
  style=SELECT_STYLE,
144
- ).ask()
146
+ use_search_filter=False,
147
+ )
145
148
 
146
149
  if result is None:
147
150
  return None
@@ -152,22 +155,24 @@ def _select_responses_thinking_sync(model_name: str | None) -> llm_param.Thinkin
152
155
 
153
156
  def _select_anthropic_thinking_sync() -> llm_param.Thinking | None:
154
157
  """Select thinking level for anthropic/openai_compatible protocol (sync version)."""
155
- choices: list[questionary.Choice] = [
156
- questionary.Choice(title=label, value=tokens) for label, tokens in ANTHROPIC_LEVELS
158
+ items: list[SelectItem[int]] = [
159
+ SelectItem(title=[("class:text", label + "\n")], value=tokens or 0, search_text=label)
160
+ for label, tokens in ANTHROPIC_LEVELS
157
161
  ]
158
162
 
159
163
  try:
160
- result = questionary.select(
164
+ result = select_one(
161
165
  message="Select thinking level:",
162
- choices=choices,
166
+ items=items,
163
167
  pointer="→",
164
- instruction="Use arrow keys to move, Enter to select",
165
- use_jk_keys=False,
166
168
  style=SELECT_STYLE,
167
- ).ask()
168
- if not result:
169
+ use_search_filter=False,
170
+ )
171
+ if result is None:
172
+ return None
173
+ if result == 0:
169
174
  return llm_param.Thinking(type="disabled", budget_tokens=0)
170
- return llm_param.Thinking(type="enabled", budget_tokens=result or 0)
175
+ return llm_param.Thinking(type="enabled", budget_tokens=result)
171
176
  except KeyboardInterrupt:
172
177
  return None
173
178
 
@@ -108,60 +108,70 @@ def select_model_from_config(preferred: str | None = None) -> str | None:
108
108
  return None
109
109
 
110
110
  try:
111
- import questionary
111
+ from prompt_toolkit.styles import Style
112
112
 
113
- choices: list[questionary.Choice] = []
113
+ from klaude_code.ui.terminal.selector import SelectItem, select_one
114
114
 
115
115
  max_model_name_length = max(len(m.model_name) for m in filtered_models)
116
116
 
117
- # Build model_id with thinking suffix as a single unit
118
- def build_model_id_with_thinking(m: ModelEntry) -> str:
119
- model_id = m.model_params.model or "N/A"
117
+ def _thinking_info(m: ModelEntry) -> str:
120
118
  thinking = m.model_params.thinking
121
- if thinking:
122
- if thinking.reasoning_effort:
123
- return f"{model_id} ({thinking.reasoning_effort})"
124
- elif thinking.budget_tokens:
125
- return f"{model_id} (think {thinking.budget_tokens})"
126
- return model_id
127
-
128
- model_id_with_thinking = {m.model_name: build_model_id_with_thinking(m) for m in filtered_models}
129
- max_model_id_length = max(len(v) for v in model_id_with_thinking.values())
130
-
119
+ if not thinking:
120
+ return ""
121
+ if thinking.reasoning_effort:
122
+ return f"reasoning effort {thinking.reasoning_effort}"
123
+ if thinking.budget_tokens:
124
+ return f"thinking budget {thinking.budget_tokens}"
125
+ return "thinking (configured)"
126
+
127
+ items: list[SelectItem[str]] = []
131
128
  for m in filtered_models:
132
- star = "★ " if m.model_name == config.main_model else " "
133
- model_id_str = model_id_with_thinking[m.model_name]
134
- title = f"{star}{m.model_name:<{max_model_name_length}} → {model_id_str:<{max_model_id_length}} @ {m.provider}"
135
- choices.append(questionary.Choice(title=title, value=m.model_name))
129
+ model_id = m.model_params.model or "N/A"
130
+ first_line_prefix = f"{m.model_name:<{max_model_name_length}} → "
131
+ thinking_info = _thinking_info(m)
132
+ meta_parts = [m.provider]
133
+ if thinking_info:
134
+ meta_parts.append(thinking_info)
135
+ if m.model_params.verbosity:
136
+ meta_parts.append(f"verbosity {m.model_params.verbosity}")
137
+ meta_line = " " + " · ".join(meta_parts)
138
+ title = [
139
+ ("class:msg", first_line_prefix),
140
+ ("class:msg bold", f"{model_id}\n"),
141
+ ("class:meta", f"{meta_line}\n\n"),
142
+ ]
143
+ search_text = f"{m.model_name} {model_id} {m.provider}"
144
+ items.append(SelectItem(title=title, value=m.model_name, search_text=search_text))
136
145
 
137
146
  try:
138
147
  message = f"Select a model (filtered by '{preferred}'):" if preferred else "Select a model:"
139
- result = questionary.select(
148
+ result = select_one(
140
149
  message=message,
141
- choices=choices,
150
+ items=items,
142
151
  pointer="→",
143
- instruction="↑↓ to move • Enter to select",
144
- use_jk_keys=False,
145
152
  use_search_filter=True,
146
- style=questionary.Style(
153
+ initial_value=config.main_model,
154
+ style=Style(
147
155
  [
148
- ("instruction", "ansibrightblack"),
149
- ("pointer", "ansicyan"),
150
- ("highlighted", "ansicyan"),
156
+ ("pointer", "ansigreen"),
157
+ ("highlighted", "ansigreen"),
158
+ ("msg", ""),
159
+ ("meta", "fg:ansibrightblack"),
151
160
  ("text", "ansibrightblack"),
161
+ ("question", ""),
162
+ ("search_prefix", "ansibrightblack"),
152
163
  # search filter colors at the bottom
153
164
  ("search_success", "noinherit fg:ansigreen"),
154
165
  ("search_none", "noinherit fg:ansired"),
155
- ("question-mark", "fg:ansigreen"),
156
166
  ]
157
167
  ),
158
- ).ask()
168
+ )
159
169
  if isinstance(result, str) and result in names:
160
170
  return result
161
171
  except KeyboardInterrupt:
162
172
  return None
163
173
  except Exception as e:
164
- log((f"Failed to use questionary for model selection: {e}", "yellow"))
174
+ log((f"Failed to use prompt_toolkit for model selection: {e}", "yellow"))
165
175
  # Never return an unvalidated model name here.
166
176
  # If we can't interactively select, fall back to a known configured model.
167
177
  if isinstance(preferred, str) and preferred in names:
@@ -1,6 +1,7 @@
1
1
  from .file.apply_patch import DiffError, process_patch
2
2
  from .file.apply_patch_tool import ApplyPatchTool
3
3
  from .file.edit_tool import EditTool
4
+ from .file.move_tool import MoveTool
4
5
  from .file.read_tool import ReadTool
5
6
  from .file.write_tool import WriteTool
6
7
  from .report_back_tool import ReportBackTool
@@ -35,6 +36,7 @@ __all__ = [
35
36
  "EditTool",
36
37
  "FileTracker",
37
38
  "MermaidTool",
39
+ "MoveTool",
38
40
  "ReadTool",
39
41
  "ReportBackTool",
40
42
  "SafetyCheckResult",
@@ -0,0 +1,41 @@
1
+ Moves a range of lines from one file to another.
2
+
3
+ Usage:
4
+ - Cuts lines from `start_line` to `end_line` (inclusive, 1-indexed) from the source file
5
+ - Pastes them into the target file at `insert_line` (inserted before that line)
6
+ - Both files must have been read first using the Read tool
7
+ - To create a new target file, set `insert_line` to 1 and ensure target file does not exist
8
+ - For same-file moves, line numbers refer to the original file state before any changes
9
+ - Use this tool when refactoring code into separate modules to avoid passing large code blocks twice
10
+ - To move files or directories, use the Bash tool with `mv` command instead
11
+
12
+ Return format:
13
+ The tool returns context snippets showing the state after the operation:
14
+
15
+ 1. Source file context (after cut): Shows 3 lines before and after the cut location
16
+ 2. Target file context (after insert): Shows 3 lines before the inserted content, the inserted content itself, and 3 lines after
17
+
18
+ Example output:
19
+ ```
20
+ Cut 8 lines from /path/source.py (lines 9-16) and pasted into /path/target.py (updated) at line 10.
21
+
22
+ Source file context (after cut):
23
+ 6 return value
24
+ 7
25
+ 8
26
+ -------- cut here --------
27
+ 9 class NextClass:
28
+ 10 pass
29
+ 11
30
+
31
+ Target file context (after insert):
32
+ 7 return {}
33
+ 8
34
+ 9
35
+ -------- inserted --------
36
+ 10 class MovedClass:
37
+ ...
38
+ 17 return result
39
+ -------- end --------
40
+ 18 # Next section
41
+ ```