klaude-code 1.4.2__tar.gz → 1.4.3__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 (210) hide show
  1. {klaude_code-1.4.2 → klaude_code-1.4.3}/PKG-INFO +1 -1
  2. {klaude_code-1.4.2 → klaude_code-1.4.3}/pyproject.toml +1 -1
  3. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/completers.py +24 -46
  4. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +121 -9
  5. {klaude_code-1.4.2 → klaude_code-1.4.3}/README.md +0 -0
  6. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/__init__.py +0 -0
  7. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/auth/__init__.py +0 -0
  8. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/auth/codex/__init__.py +0 -0
  9. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/auth/codex/exceptions.py +0 -0
  10. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  11. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/auth/codex/oauth.py +0 -0
  12. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/auth/codex/token_manager.py +0 -0
  13. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/__init__.py +0 -0
  14. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/auth_cmd.py +0 -0
  15. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/config_cmd.py +0 -0
  16. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/debug.py +0 -0
  17. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/list_model.py +0 -0
  18. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/main.py +0 -0
  19. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/runtime.py +0 -0
  20. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/self_update.py +0 -0
  21. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/cli/session_cmd.py +0 -0
  22. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/__init__.py +0 -0
  23. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/clear_cmd.py +0 -0
  24. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/command_abc.py +0 -0
  25. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/debug_cmd.py +0 -0
  26. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/export_cmd.py +0 -0
  27. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/export_online_cmd.py +0 -0
  28. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/fork_session_cmd.py +0 -0
  29. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/help_cmd.py +0 -0
  30. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/model_cmd.py +0 -0
  31. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/prompt-init.md +0 -0
  32. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/prompt-jj-describe.md +0 -0
  33. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/prompt_command.py +0 -0
  34. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/refresh_cmd.py +0 -0
  35. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/registry.py +0 -0
  36. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/release_notes_cmd.py +0 -0
  37. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/resume_cmd.py +0 -0
  38. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/status_cmd.py +0 -0
  39. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  40. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/command/thinking_cmd.py +0 -0
  41. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/config/__init__.py +0 -0
  42. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/config/assets/__init__.py +0 -0
  43. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
  44. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/config/builtin_config.py +0 -0
  45. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/config/config.py +0 -0
  46. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/config/select_model.py +0 -0
  47. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/const.py +0 -0
  48. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/__init__.py +0 -0
  49. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/agent.py +0 -0
  50. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/executor.py +0 -0
  51. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/manager/__init__.py +0 -0
  52. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/manager/llm_clients.py +0 -0
  53. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  54. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  55. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompt.py +0 -0
  56. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  57. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  58. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  59. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  60. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  61. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  62. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  63. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  64. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  65. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  66. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/reminders.py +0 -0
  67. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/task.py +0 -0
  68. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/__init__.py +0 -0
  69. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/__init__.py +0 -0
  70. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/_utils.py +0 -0
  71. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  72. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  73. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  74. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  75. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  76. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  77. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/move_tool.md +0 -0
  78. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/move_tool.py +0 -0
  79. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  80. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  81. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  82. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  83. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  84. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  85. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  86. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  87. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  88. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/skill/__init__.py +0 -0
  89. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
  90. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
  91. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  92. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  93. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  94. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  95. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  96. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  97. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  98. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_abc.py +0 -0
  99. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_context.py +0 -0
  100. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_registry.py +0 -0
  101. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_runner.py +0 -0
  102. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/truncation.py +0 -0
  103. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/__init__.py +0 -0
  104. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
  105. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  106. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  107. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  108. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  109. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  110. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/core/turn.py +0 -0
  111. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/__init__.py +0 -0
  112. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  113. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/anthropic/client.py +0 -0
  114. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/anthropic/input.py +0 -0
  115. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/client.py +0 -0
  116. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/codex/__init__.py +0 -0
  117. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/codex/client.py +0 -0
  118. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/input_common.py +0 -0
  119. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  120. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  121. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  122. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
  123. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  124. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  125. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/client.py +0 -0
  126. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/input.py +0 -0
  127. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  128. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/registry.py +0 -0
  129. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/responses/__init__.py +0 -0
  130. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/responses/client.py +0 -0
  131. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/responses/input.py +0 -0
  132. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/llm/usage.py +0 -0
  133. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/__init__.py +0 -0
  134. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/commands.py +0 -0
  135. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/events.py +0 -0
  136. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/llm_param.py +0 -0
  137. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/model.py +0 -0
  138. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/op.py +0 -0
  139. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/op_handler.py +0 -0
  140. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  141. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  142. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  143. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  144. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  145. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/protocol/tools.py +0 -0
  146. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/__init__.py +0 -0
  147. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/codec.py +0 -0
  148. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/export.py +0 -0
  149. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/selector.py +0 -0
  150. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/session.py +0 -0
  151. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/store.py +0 -0
  152. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/templates/export_session.html +0 -0
  153. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
  154. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/__init__.py +0 -0
  155. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  156. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
  157. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  158. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  159. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  160. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/loader.py +0 -0
  161. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/manager.py +0 -0
  162. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/skill/system_skills.py +0 -0
  163. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/trace/__init__.py +0 -0
  164. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/trace/log.py +0 -0
  165. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/__init__.py +0 -0
  166. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/core/__init__.py +0 -0
  167. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/core/display.py +0 -0
  168. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/core/input.py +0 -0
  169. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/core/stage_manager.py +0 -0
  170. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/__init__.py +0 -0
  171. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  172. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/debug/display.py +0 -0
  173. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  174. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/exec/display.py +0 -0
  175. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
  176. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  177. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/display.py +0 -0
  178. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/event_handler.py +0 -0
  179. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
  180. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
  181. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/__init__.py +0 -0
  182. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/assistant.py +0 -0
  183. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/bash_syntax.py +0 -0
  184. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/common.py +0 -0
  185. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/developer.py +0 -0
  186. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/diffs.py +0 -0
  187. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/errors.py +0 -0
  188. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/mermaid_viewer.py +0 -0
  189. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/metadata.py +0 -0
  190. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
  191. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/thinking.py +0 -0
  192. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/tools.py +0 -0
  193. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/user_input.py +0 -0
  194. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/__init__.py +0 -0
  195. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  196. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/code_panel.py +0 -0
  197. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/live.py +0 -0
  198. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/markdown.py +0 -0
  199. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/quote.py +0 -0
  200. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/searchable_text.py +0 -0
  201. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/status.py +0 -0
  202. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/rich/theme.py +0 -0
  203. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/__init__.py +0 -0
  204. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/color.py +0 -0
  205. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/control.py +0 -0
  206. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/notifier.py +0 -0
  207. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  208. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/selector.py +0 -0
  209. {klaude_code-1.4.2 → klaude_code-1.4.3}/src/klaude_code/ui/utils/__init__.py +0 -0
  210. {klaude_code-1.4.2 → klaude_code-1.4.3}/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.4.2
3
+ Version: 1.4.3
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "1.4.2"
7
+ version = "1.4.3"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -25,9 +25,9 @@ from typing import NamedTuple
25
25
 
26
26
  from prompt_toolkit.completion import Completer, Completion
27
27
  from prompt_toolkit.document import Document
28
- from prompt_toolkit.formatted_text import HTML
28
+ from prompt_toolkit.formatted_text import FormattedText
29
29
 
30
- from klaude_code.command import get_commands
30
+ from klaude_code.command import CommandABC, get_commands
31
31
  from klaude_code.trace.log import DebugType, log_debug
32
32
 
33
33
  # Pattern to match @token for completion refresh (used by key bindings).
@@ -88,7 +88,7 @@ class _SlashCommandCompleter(Completer):
88
88
  commands = get_commands()
89
89
 
90
90
  # Filter commands that match the fragment (preserve registration order)
91
- matched: list[tuple[str, object, str]] = []
91
+ matched: list[tuple[str, CommandABC, str]] = []
92
92
  for cmd_name, cmd_obj in commands.items():
93
93
  if cmd_name.startswith(frag):
94
94
  hint = f" [{cmd_obj.placeholder}]" if cmd_obj.support_addition_params else ""
@@ -97,25 +97,15 @@ class _SlashCommandCompleter(Completer):
97
97
  if not matched:
98
98
  return
99
99
 
100
- # Calculate max width for alignment
101
- # Find the longest command+hint length
102
- max_len = max(len(name) + len(hint) for name, _, hint in matched)
103
- # Set a minimum width (e.g. 20) and add some padding
104
- align_width = max(max_len, 20) + 2
105
-
106
100
  for cmd_name, cmd_obj, hint in matched:
107
- label_len = len(cmd_name) + len(hint)
108
- padding = " " * (align_width - label_len)
109
-
110
- # Using HTML for formatting: default color command name, normal hint, gray summary
111
- display_text = HTML(
112
- f"<style color='ansidefault'>{cmd_name}</style>{hint}{padding}<style color='ansibrightblack'>{cmd_obj.summary}</style>" # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
113
- )
114
101
  completion_text = f"/{cmd_name} "
102
+ # Use FormattedText to style the hint (placeholder) in bright black
103
+ display = FormattedText([("", cmd_name), ("ansibrightblack", hint)]) if hint else cmd_name
115
104
  yield Completion(
116
105
  text=completion_text,
117
106
  start_position=start_position,
118
- display=display_text,
107
+ display=display,
108
+ display_meta=str(cmd_obj.summary),
119
109
  )
120
110
 
121
111
  def is_slash_command_context(self, document: Document) -> bool:
@@ -171,26 +161,18 @@ class _SkillCompleter(Completer):
171
161
  if not matched:
172
162
  return
173
163
 
174
- # Calculate max width for alignment
175
- max_name_len = max(len(name) for name, _, _ in matched)
176
- align_width = max(max_name_len, 20) + 2
164
+ # Calculate max location length for alignment
165
+ max_loc_len = max(len(loc) for _, _, loc in matched)
177
166
 
178
167
  for name, desc, location in matched:
179
- # Format: name [location] description
180
- # Align location tags (max length is "project" = 7, plus brackets = 9)
181
- padding_name = " " * (align_width - len(name))
182
- location_tag = f"[{location}]".ljust(9)
183
-
184
- # Using HTML for formatting: default color skill name, cyan location tag, gray description
185
- display_text = HTML(
186
- f"<style color='ansidefault'>{name}</style>{padding_name}<style color='ansicyan'>{location_tag}</style> "
187
- f"<style color='ansibrightblack'>{desc}</style>"
188
- )
189
168
  completion_text = f"${name} "
169
+ # Pad location to align descriptions
170
+ padded_location = f"[{location}]".ljust(max_loc_len + 2) # +2 for brackets
190
171
  yield Completion(
191
172
  text=completion_text,
192
173
  start_position=start_position,
193
- display=display_text,
174
+ display=name,
175
+ display_meta=f"{padded_location} {desc}",
194
176
  )
195
177
 
196
178
  def _get_available_skills(self) -> list[tuple[str, str, str]]:
@@ -318,14 +300,12 @@ class _AtFilesCompleter(Completer):
318
300
  if not suggestions:
319
301
  return [] # type: ignore[reportUnknownVariableType]
320
302
  start_position = token_start_in_input - len(text_before)
321
- visible_suggestions = suggestions[: self._max_results]
322
- display_align = self._display_align_width(visible_suggestions)
323
-
324
- for s in visible_suggestions:
303
+ for s in suggestions[: self._max_results]:
325
304
  yield Completion(
326
305
  text=self._format_completion_text(s, is_quoted=is_quoted),
327
306
  start_position=start_position,
328
- display=self._format_display_label(s, display_align),
307
+ display=self._format_display_label(s, 0),
308
+ display_meta=s,
329
309
  )
330
310
  return [] # type: ignore[reportUnknownVariableType]
331
311
 
@@ -336,15 +316,13 @@ class _AtFilesCompleter(Completer):
336
316
 
337
317
  # Prepare Completion objects. Replace from the '@' character.
338
318
  start_position = token_start_in_input - len(text_before) # negative
339
- visible_suggestions = suggestions[: self._max_results]
340
- display_align = self._display_align_width(visible_suggestions)
341
-
342
- for s in visible_suggestions:
319
+ for s in suggestions[: self._max_results]:
343
320
  # Insert formatted text (with quoting when needed) so that subsequent typing does not keep triggering
344
321
  yield Completion(
345
322
  text=self._format_completion_text(s, is_quoted=is_quoted),
346
323
  start_position=start_position,
347
- display=self._format_display_label(s, display_align),
324
+ display=self._format_display_label(s, 0),
325
+ display_meta=s,
348
326
  )
349
327
 
350
328
  # ---- Core logic ----
@@ -539,15 +517,15 @@ class _AtFilesCompleter(Completer):
539
517
  return f'@"{suggestion}" '
540
518
  return f"@{suggestion} "
541
519
 
542
- def _format_display_label(self, suggestion: str, align_width: int) -> HTML:
520
+ def _format_display_label(self, suggestion: str, align_width: int) -> str:
543
521
  """Format visible label for a completion option.
544
522
 
545
- Shows the basename (or directory name) aligned, followed by the full path in gray.
523
+ Keep this unstyled so that the completion menu's selection style can
524
+ fully override the selected row.
546
525
  """
547
526
 
548
- name = self._display_name(suggestion)
549
- padding = " " * (max(align_width - len(name), 0) + 2)
550
- return HTML(f"<style color='ansidefault'>{name}</style>{padding}<style color='ansibrightblack'>{suggestion}</style>")
527
+ _ = align_width
528
+ return self._display_name(suggestion)
551
529
 
552
530
  def _display_align_width(self, suggestions: list[str]) -> int:
553
531
  """Calculate alignment width for display labels."""
@@ -6,15 +6,20 @@ from collections.abc import AsyncIterator, Callable
6
6
  from pathlib import Path
7
7
  from typing import NamedTuple, override
8
8
 
9
+ import prompt_toolkit.layout.menus as pt_menus
9
10
  from prompt_toolkit import PromptSession
10
- from prompt_toolkit.completion import ThreadedCompleter
11
+ from prompt_toolkit.application.current import get_app
12
+ from prompt_toolkit.completion import Completion, ThreadedCompleter
11
13
  from prompt_toolkit.cursor_shapes import CursorShape
12
- from prompt_toolkit.formatted_text import FormattedText
14
+ from prompt_toolkit.data_structures import Point
15
+ from prompt_toolkit.formatted_text import FormattedText, StyleAndTextTuples, to_formatted_text
13
16
  from prompt_toolkit.history import FileHistory
14
- from prompt_toolkit.layout.containers import Container, FloatContainer
17
+ from prompt_toolkit.layout.containers import Container, FloatContainer, Window
18
+ from prompt_toolkit.layout.controls import UIContent
15
19
  from prompt_toolkit.layout.menus import CompletionsMenu, MultiColumnCompletionsMenu
16
20
  from prompt_toolkit.patch_stdout import patch_stdout
17
21
  from prompt_toolkit.styles import Style
22
+ from prompt_toolkit.utils import get_cwidth
18
23
 
19
24
  from klaude_code.protocol.model import UserInputPayload
20
25
  from klaude_code.ui.core.input import InputProviderABC
@@ -31,9 +36,9 @@ class REPLStatusSnapshot(NamedTuple):
31
36
  update_message: str | None = None
32
37
 
33
38
 
34
- COMPLETION_SELECTED_DARK_BG = "#8b9bff"
35
- COMPLETION_SELECTED_LIGHT_BG = "#5869f7"
36
- COMPLETION_SELECTED_UNKNOWN_BG = "#7080f0"
39
+ COMPLETION_SELECTED_DARK_BG = "ansigreen"
40
+ COMPLETION_SELECTED_LIGHT_BG = "ansigreen"
41
+ COMPLETION_SELECTED_UNKNOWN_BG = "ansigreen"
37
42
  COMPLETION_MENU = "ansibrightblack"
38
43
  INPUT_PROMPT_STYLE = "ansimagenta bold"
39
44
  PLACEHOLDER_TEXT_STYLE_DARK_BG = "fg:#5a5a5a italic"
@@ -63,6 +68,109 @@ def _left_align_completion_menus(container: Container) -> None:
63
68
  _left_align_completion_menus(child)
64
69
 
65
70
 
71
+ class _KlaudeCompletionsMenuControl(pt_menus.CompletionsMenuControl):
72
+ """CompletionsMenuControl with stable 2-char left prefix.
73
+
74
+ Requirements:
75
+ - Add a 2-character prefix for every row.
76
+ - Render "→ " for the selected row, and " " for non-selected rows.
77
+
78
+ Keep completion text unstyled so that the menu's current-row style can
79
+ override it entirely.
80
+ """
81
+
82
+ _PREFIX_WIDTH = 2
83
+
84
+ def _get_menu_width(self, max_width: int, complete_state: pt_menus.CompletionState) -> int: # pyright: ignore[reportPrivateImportUsage]
85
+ """Return the width of the main column.
86
+
87
+ This is prompt_toolkit's default implementation, except we reserve one
88
+ extra character for the 2-char prefix ("→ "/" ").
89
+ """
90
+
91
+ return min(
92
+ max_width,
93
+ max(
94
+ self.MIN_WIDTH,
95
+ max(get_cwidth(c.display_text) for c in complete_state.completions) + 3,
96
+ ),
97
+ )
98
+
99
+ def create_content(self, width: int, height: int) -> UIContent:
100
+ complete_state = get_app().current_buffer.complete_state
101
+ if complete_state:
102
+ completions = complete_state.completions
103
+ index = complete_state.complete_index
104
+
105
+ menu_width = self._get_menu_width(width, complete_state)
106
+ menu_meta_width = self._get_menu_meta_width(width - menu_width, complete_state)
107
+ show_meta = self._show_meta(complete_state)
108
+
109
+ def get_line(i: int) -> StyleAndTextTuples:
110
+ completion = completions[i]
111
+ is_current_completion = i == index
112
+
113
+ result = self._get_menu_item_fragments_with_cursor(
114
+ completion,
115
+ is_current_completion,
116
+ menu_width,
117
+ space_after=True,
118
+ )
119
+ if show_meta:
120
+ result += self._get_menu_item_meta_fragments(
121
+ completion,
122
+ is_current_completion,
123
+ menu_meta_width,
124
+ )
125
+ return result
126
+
127
+ return UIContent(
128
+ get_line=get_line,
129
+ cursor_position=Point(x=0, y=index or 0),
130
+ line_count=len(completions),
131
+ )
132
+
133
+ return UIContent()
134
+
135
+ def _get_menu_item_fragments_with_cursor(
136
+ self,
137
+ completion: Completion,
138
+ is_current_completion: bool,
139
+ width: int,
140
+ *,
141
+ space_after: bool = False,
142
+ ) -> StyleAndTextTuples:
143
+ if is_current_completion:
144
+ style_str = f"class:completion-menu.completion.current {completion.style} {completion.selected_style}"
145
+ prefix = "→ "
146
+ else:
147
+ style_str = "class:completion-menu.completion " + completion.style
148
+ prefix = " "
149
+
150
+ max_text_width = width - self._PREFIX_WIDTH - (1 if space_after else 0)
151
+ text, text_width = pt_menus._trim_formatted_text(completion.display, max_text_width) # pyright: ignore[reportPrivateUsage]
152
+ padding = " " * (width - self._PREFIX_WIDTH - text_width)
153
+
154
+ return to_formatted_text(
155
+ [("", prefix), *text, ("", padding)],
156
+ style=style_str,
157
+ )
158
+
159
+
160
+ def _patch_completion_menu_controls(container: Container) -> None:
161
+ """Replace prompt_toolkit completion menu controls with customized versions."""
162
+
163
+ if isinstance(container, Window):
164
+ content = container.content
165
+ if isinstance(content, pt_menus.CompletionsMenuControl) and not isinstance(
166
+ content, _KlaudeCompletionsMenuControl
167
+ ):
168
+ container.content = _KlaudeCompletionsMenuControl()
169
+
170
+ for child in container.get_children():
171
+ _patch_completion_menu_controls(child)
172
+
173
+
66
174
  class PromptToolkitInput(InputProviderABC):
67
175
  def __init__(
68
176
  self,
@@ -119,10 +227,10 @@ class PromptToolkitInput(InputProviderABC):
119
227
  "completion-menu.border": "bg:default",
120
228
  "scrollbar.background": "bg:default",
121
229
  "scrollbar.button": "bg:default",
122
- "completion-menu.completion": f"bg:default fg:{COMPLETION_MENU}",
230
+ "completion-menu.completion": "bg:default fg:default",
123
231
  "completion-menu.meta.completion": f"bg:default fg:{COMPLETION_MENU}",
124
- "completion-menu.completion.current": f"noreverse bg:default fg:{completion_selected} bold",
125
- "completion-menu.meta.completion.current": f"bg:default fg:{completion_selected} bold",
232
+ "completion-menu.completion.current": f"noreverse bg:default fg:{completion_selected}",
233
+ "completion-menu.meta.completion.current": f"bg:default fg:{completion_selected}",
126
234
  }
127
235
  ),
128
236
  )
@@ -131,6 +239,10 @@ class PromptToolkitInput(InputProviderABC):
131
239
  with contextlib.suppress(Exception):
132
240
  _left_align_completion_menus(self._session.app.layout.container)
133
241
 
242
+ # Customize completion rendering (2-space indent + selected arrow prefix).
243
+ with contextlib.suppress(Exception):
244
+ _patch_completion_menu_controls(self._session.app.layout.container)
245
+
134
246
  def _select_first_completion_on_open(buf) -> None: # type: ignore[no-untyped-def]
135
247
  """Default to selecting the first completion without inserting it."""
136
248
 
File without changes