klaude-code 1.6.0__tar.gz → 1.7.1__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 (218) hide show
  1. {klaude_code-1.6.0 → klaude_code-1.7.1}/PKG-INFO +82 -10
  2. {klaude_code-1.6.0 → klaude_code-1.7.1}/README.md +80 -9
  3. {klaude_code-1.6.0 → klaude_code-1.7.1}/pyproject.toml +2 -1
  4. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/list_model.py +55 -4
  5. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/main.py +10 -0
  6. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/runtime.py +2 -2
  7. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/session_cmd.py +3 -2
  8. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/fork_session_cmd.py +7 -0
  9. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/assets/builtin_config.yaml +61 -2
  10. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/builtin_config.py +1 -0
  11. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/config.py +19 -0
  12. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/thinking.py +14 -0
  13. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/const.py +17 -2
  14. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/executor.py +16 -3
  15. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/task.py +5 -3
  16. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/command_safety.py +3 -5
  17. klaude_code-1.7.1/src/klaude_code/llm/anthropic/client.py +233 -0
  18. klaude_code-1.7.1/src/klaude_code/llm/bedrock/__init__.py +3 -0
  19. klaude_code-1.7.1/src/klaude_code/llm/bedrock/client.py +60 -0
  20. klaude_code-1.7.1/src/klaude_code/llm/google/__init__.py +3 -0
  21. klaude_code-1.7.1/src/klaude_code/llm/google/client.py +309 -0
  22. klaude_code-1.7.1/src/klaude_code/llm/google/input.py +215 -0
  23. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/registry.py +10 -5
  24. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/events.py +1 -0
  25. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/llm_param.py +9 -0
  26. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/export.py +14 -2
  27. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/session.py +52 -3
  28. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/store.py +3 -0
  29. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/templates/export_session.html +210 -18
  30. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +6 -46
  31. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/renderer.py +5 -1
  32. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/developer.py +1 -1
  33. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/sub_agent.py +1 -1
  34. klaude_code-1.6.0/src/klaude_code/llm/anthropic/client.py +0 -220
  35. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/__init__.py +0 -0
  36. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/__init__.py +0 -0
  37. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/__init__.py +0 -0
  38. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/exceptions.py +0 -0
  39. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  40. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/oauth.py +0 -0
  41. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/token_manager.py +0 -0
  42. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/__init__.py +0 -0
  43. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/auth_cmd.py +0 -0
  44. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/config_cmd.py +0 -0
  45. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/debug.py +0 -0
  46. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/self_update.py +0 -0
  47. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/__init__.py +0 -0
  48. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/clear_cmd.py +0 -0
  49. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/command_abc.py +0 -0
  50. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/debug_cmd.py +0 -0
  51. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/export_cmd.py +0 -0
  52. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/export_online_cmd.py +0 -0
  53. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/help_cmd.py +0 -0
  54. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/model_cmd.py +0 -0
  55. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/model_select.py +0 -0
  56. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/prompt-init.md +0 -0
  57. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/prompt-jj-describe.md +0 -0
  58. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/prompt_command.py +0 -0
  59. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/refresh_cmd.py +0 -0
  60. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/registry.py +0 -0
  61. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/release_notes_cmd.py +0 -0
  62. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/resume_cmd.py +0 -0
  63. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/status_cmd.py +0 -0
  64. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  65. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/thinking_cmd.py +0 -0
  66. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/__init__.py +0 -0
  67. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/assets/__init__.py +0 -0
  68. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/select_model.py +0 -0
  69. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/__init__.py +0 -0
  70. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/agent.py +0 -0
  71. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/__init__.py +0 -0
  72. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/llm_clients.py +0 -0
  73. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  74. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  75. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompt.py +0 -0
  76. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  77. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  78. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  79. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  80. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  81. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  82. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  83. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  84. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  85. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  86. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/reminders.py +0 -0
  87. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/__init__.py +0 -0
  88. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/__init__.py +0 -0
  89. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/_utils.py +0 -0
  90. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  91. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  92. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  93. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  94. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  95. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  96. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/move_tool.md +0 -0
  97. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/move_tool.py +0 -0
  98. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  99. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  100. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  101. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  102. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  103. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  104. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  105. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  106. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/skill/__init__.py +0 -0
  107. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
  108. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
  109. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  110. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  111. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  112. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  113. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  114. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  115. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  116. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_abc.py +0 -0
  117. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_context.py +0 -0
  118. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_registry.py +0 -0
  119. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_runner.py +0 -0
  120. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/truncation.py +0 -0
  121. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/__init__.py +0 -0
  122. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
  123. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  124. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  125. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  126. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  127. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  128. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/turn.py +0 -0
  129. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/__init__.py +0 -0
  130. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  131. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/anthropic/input.py +0 -0
  132. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/client.py +0 -0
  133. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/codex/__init__.py +0 -0
  134. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/codex/client.py +0 -0
  135. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/input_common.py +0 -0
  136. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  137. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  138. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  139. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
  140. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  141. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  142. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/client.py +0 -0
  143. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/input.py +0 -0
  144. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  145. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/responses/__init__.py +0 -0
  146. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/responses/client.py +0 -0
  147. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/responses/input.py +0 -0
  148. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/usage.py +0 -0
  149. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/__init__.py +0 -0
  150. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/commands.py +0 -0
  151. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/model.py +0 -0
  152. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/op.py +0 -0
  153. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/op_handler.py +0 -0
  154. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  155. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  156. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  157. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  158. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  159. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/tools.py +0 -0
  160. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/__init__.py +0 -0
  161. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/codec.py +0 -0
  162. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/selector.py +0 -0
  163. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
  164. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/__init__.py +0 -0
  165. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  166. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
  167. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  168. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  169. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  170. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/loader.py +0 -0
  171. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/manager.py +0 -0
  172. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/system_skills.py +0 -0
  173. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/trace/__init__.py +0 -0
  174. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/trace/log.py +0 -0
  175. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/__init__.py +0 -0
  176. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/__init__.py +0 -0
  177. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/display.py +0 -0
  178. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/input.py +0 -0
  179. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/stage_manager.py +0 -0
  180. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/__init__.py +0 -0
  181. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  182. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/debug/display.py +0 -0
  183. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  184. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/exec/display.py +0 -0
  185. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
  186. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  187. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/completers.py +0 -0
  188. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/display.py +0 -0
  189. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/event_handler.py +0 -0
  190. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
  191. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/__init__.py +0 -0
  192. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/assistant.py +0 -0
  193. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/bash_syntax.py +0 -0
  194. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/common.py +0 -0
  195. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/diffs.py +0 -0
  196. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/errors.py +0 -0
  197. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/mermaid_viewer.py +0 -0
  198. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/metadata.py +0 -0
  199. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/thinking.py +0 -0
  200. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/tools.py +0 -0
  201. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/user_input.py +0 -0
  202. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/__init__.py +0 -0
  203. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  204. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/code_panel.py +0 -0
  205. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/live.py +0 -0
  206. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/markdown.py +0 -0
  207. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/quote.py +0 -0
  208. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/searchable_text.py +0 -0
  209. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/status.py +0 -0
  210. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/theme.py +0 -0
  211. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/__init__.py +0 -0
  212. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/color.py +0 -0
  213. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/control.py +0 -0
  214. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/notifier.py +0 -0
  215. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  216. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/selector.py +0 -0
  217. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/utils/__init__.py +0 -0
  218. {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/utils/common.py +0 -0
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 1.6.0
3
+ Version: 1.7.1
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
7
7
  Requires-Dist: ddgs>=9.9.3
8
8
  Requires-Dist: diff-match-patch>=20241021
9
+ Requires-Dist: google-genai>=1.56.0
9
10
  Requires-Dist: markdown-it-py>=4.0.0
10
11
  Requires-Dist: openai>=1.102.0
11
12
  Requires-Dist: pillow>=12.0.0
@@ -34,6 +35,10 @@ Minimal code agent CLI.
34
35
  - **Output truncation**: Large outputs saved to file system with snapshot links
35
36
  - **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
36
37
  - **Sessions**: Resumable with `--continue`
38
+ - **Cost tracking**: Automatic API cost calculation and display (USD/CNY)
39
+ - **Version update check**: Background PyPI version check with upgrade prompts
40
+ - **Terminal title**: Shows current directory and model name
41
+ - **Mermaid diagrams**: Interactive local HTML viewer with zoom, pan, and SVG export
37
42
  - **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
38
43
 
39
44
  ## Installation
@@ -77,6 +82,7 @@ klaude [--model <name>] [--select-model]
77
82
  - `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
78
83
  - `--continue`/`-c`: Resume the most recent session.
79
84
  - `--resume`/`-r`: Select a session to resume for this project.
85
+ - `--resume-by-id <id>`: Resume a session by its ID directly.
80
86
  - `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
81
87
 
82
88
  **Model selection behavior:**
@@ -140,20 +146,62 @@ klaude config
140
146
 
141
147
  ##### Adding Models to Built-in Providers
142
148
 
143
- You can add custom models to existing providers without redefining the entire provider:
149
+ You can add custom models to existing built-in providers without redefining the entire provider. Just reference the `provider_name` and add your `model_list`:
144
150
 
145
151
  ```yaml
146
- # Just specify provider_name and your new models - no need for protocol/api_key
152
+ # ~/.klaude/klaude-config.yaml
147
153
  provider_list:
154
+ - provider_name: openrouter # Reference existing built-in provider
155
+ model_list:
156
+ - model_name: seed
157
+ model_params:
158
+ model: bytedance-seed/seed-1.6 # Model ID from OpenRouter
159
+ context_limit: 262000
160
+ cost:
161
+ input: 0.25
162
+ output: 2
163
+ ```
164
+
165
+ **How merging works:**
166
+ - Your models are merged with the built-in models for that provider
167
+ - You only need `provider_name` and `model_list` - protocol, api_key, etc. are inherited from the built-in config
168
+ - To override a built-in model, use the same `model_name` (e.g., `sonnet` to customize the built-in sonnet)
169
+
170
+ **More examples:**
171
+
172
+ ```yaml
173
+ provider_list:
174
+ # Add multiple models to OpenRouter
148
175
  - provider_name: openrouter
149
176
  model_list:
150
- - model_name: my-custom-model
177
+ - model_name: qwen-coder
151
178
  model_params:
152
- model: some-provider/some-model-id
179
+ model: qwen/qwen-2.5-coder-32b-instruct
180
+ context_limit: 131072
181
+ cost:
182
+ input: 0.3
183
+ output: 0.9
184
+ - model_name: llama-405b
185
+ model_params:
186
+ model: meta-llama/llama-3.1-405b-instruct
187
+ context_limit: 131072
188
+ cost:
189
+ input: 0.8
190
+ output: 0.8
191
+
192
+ # Add models to Anthropic provider
193
+ - provider_name: anthropic
194
+ model_list:
195
+ - model_name: haiku@ant
196
+ model_params:
197
+ model: claude-3-5-haiku-20241022
153
198
  context_limit: 200000
199
+ cost:
200
+ input: 1.0
201
+ output: 5.0
154
202
  ```
155
203
 
156
- Your models are merged with built-in models. To override a built-in model, use the same `model_name`.
204
+ After adding models, run `klaude list` to verify they appear in the model list.
157
205
 
158
206
  ##### Overriding Provider Settings
159
207
 
@@ -224,6 +272,8 @@ provider_list:
224
272
  - `openai` - OpenAI-compatible API
225
273
  - `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
226
274
  - `openrouter` - OpenRouter API
275
+ - `google` - Google Gemini API
276
+ - `bedrock` - AWS Bedrock (uses AWS credentials instead of api_key)
227
277
  - `codex` - OpenAI Codex CLI (OAuth-based)
228
278
 
229
279
  List configured providers and models:
@@ -251,12 +301,18 @@ klaude session clean-all
251
301
 
252
302
  Inside the interactive session (`klaude`), use these commands to streamline your workflow:
253
303
 
254
- - `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
255
- - `/export` - Export last assistant message to a temp Markdown file.
256
- - `/init` - Bootstrap a new project structure or module.
257
304
  - `/model` - Switch the active LLM during the session.
305
+ - `/thinking` - Configure model thinking/reasoning level.
258
306
  - `/clear` - Clear the current conversation context.
259
- - `/diff` - Show local git diff changes.
307
+ - `/status` - Show session usage statistics (cost, tokens, model breakdown).
308
+ - `/resume` - Select and resume a previous session.
309
+ - `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
310
+ - `/export` - Export last assistant message to a temp Markdown file.
311
+ - `/export-online` - Export and deploy session to surge.sh as a static webpage.
312
+ - `/debug [filters]` - Toggle debug mode and configure debug filters.
313
+ - `/init` - Bootstrap a new project structure or module.
314
+ - `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
315
+ - `/terminal-setup` - Configure terminal for Shift+Enter support.
260
316
  - `/help` - List all available commands.
261
317
 
262
318
 
@@ -267,6 +323,8 @@ Inside the interactive session (`klaude`), use these commands to streamline your
267
323
  | `Enter` | Submit input |
268
324
  | `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
269
325
  | `Ctrl+J` | Insert newline |
326
+ | `Ctrl+L` | Open model picker overlay |
327
+ | `Ctrl+T` | Open thinking level picker overlay |
270
328
  | `Ctrl+V` | Paste image from clipboard |
271
329
  | `Left/Right` | Move cursor (wraps across lines) |
272
330
  | `Backspace` | Delete character or selected text |
@@ -290,4 +348,18 @@ echo "generate quicksort in python" | klaude exec --model gpt-5.1
290
348
 
291
349
  # Partial/ambiguous name opens the interactive selector (filtered)
292
350
  echo "generate quicksort in python" | klaude exec --model gpt
351
+
352
+ # Stream all events as JSON lines (for programmatic processing)
353
+ klaude exec "what is 2+2?" --stream-json
293
354
  ```
355
+
356
+ ### Sub-Agents
357
+
358
+ The main agent can spawn specialized sub-agents for specific tasks:
359
+
360
+ | Sub-Agent | Purpose |
361
+ |-----------|---------|
362
+ | **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
363
+ | **Task** | Handle complex multi-step tasks autonomously |
364
+ | **WebAgent** | Search the web, fetch pages, and analyze content |
365
+ | **Oracle** | Advanced reasoning advisor for code reviews, architecture planning, and bug analysis |
@@ -14,6 +14,10 @@ Minimal code agent CLI.
14
14
  - **Output truncation**: Large outputs saved to file system with snapshot links
15
15
  - **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
16
16
  - **Sessions**: Resumable with `--continue`
17
+ - **Cost tracking**: Automatic API cost calculation and display (USD/CNY)
18
+ - **Version update check**: Background PyPI version check with upgrade prompts
19
+ - **Terminal title**: Shows current directory and model name
20
+ - **Mermaid diagrams**: Interactive local HTML viewer with zoom, pan, and SVG export
17
21
  - **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
18
22
 
19
23
  ## Installation
@@ -57,6 +61,7 @@ klaude [--model <name>] [--select-model]
57
61
  - `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
58
62
  - `--continue`/`-c`: Resume the most recent session.
59
63
  - `--resume`/`-r`: Select a session to resume for this project.
64
+ - `--resume-by-id <id>`: Resume a session by its ID directly.
60
65
  - `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
61
66
 
62
67
  **Model selection behavior:**
@@ -120,20 +125,62 @@ klaude config
120
125
 
121
126
  ##### Adding Models to Built-in Providers
122
127
 
123
- You can add custom models to existing providers without redefining the entire provider:
128
+ You can add custom models to existing built-in providers without redefining the entire provider. Just reference the `provider_name` and add your `model_list`:
124
129
 
125
130
  ```yaml
126
- # Just specify provider_name and your new models - no need for protocol/api_key
131
+ # ~/.klaude/klaude-config.yaml
127
132
  provider_list:
133
+ - provider_name: openrouter # Reference existing built-in provider
134
+ model_list:
135
+ - model_name: seed
136
+ model_params:
137
+ model: bytedance-seed/seed-1.6 # Model ID from OpenRouter
138
+ context_limit: 262000
139
+ cost:
140
+ input: 0.25
141
+ output: 2
142
+ ```
143
+
144
+ **How merging works:**
145
+ - Your models are merged with the built-in models for that provider
146
+ - You only need `provider_name` and `model_list` - protocol, api_key, etc. are inherited from the built-in config
147
+ - To override a built-in model, use the same `model_name` (e.g., `sonnet` to customize the built-in sonnet)
148
+
149
+ **More examples:**
150
+
151
+ ```yaml
152
+ provider_list:
153
+ # Add multiple models to OpenRouter
128
154
  - provider_name: openrouter
129
155
  model_list:
130
- - model_name: my-custom-model
156
+ - model_name: qwen-coder
131
157
  model_params:
132
- model: some-provider/some-model-id
158
+ model: qwen/qwen-2.5-coder-32b-instruct
159
+ context_limit: 131072
160
+ cost:
161
+ input: 0.3
162
+ output: 0.9
163
+ - model_name: llama-405b
164
+ model_params:
165
+ model: meta-llama/llama-3.1-405b-instruct
166
+ context_limit: 131072
167
+ cost:
168
+ input: 0.8
169
+ output: 0.8
170
+
171
+ # Add models to Anthropic provider
172
+ - provider_name: anthropic
173
+ model_list:
174
+ - model_name: haiku@ant
175
+ model_params:
176
+ model: claude-3-5-haiku-20241022
133
177
  context_limit: 200000
178
+ cost:
179
+ input: 1.0
180
+ output: 5.0
134
181
  ```
135
182
 
136
- Your models are merged with built-in models. To override a built-in model, use the same `model_name`.
183
+ After adding models, run `klaude list` to verify they appear in the model list.
137
184
 
138
185
  ##### Overriding Provider Settings
139
186
 
@@ -204,6 +251,8 @@ provider_list:
204
251
  - `openai` - OpenAI-compatible API
205
252
  - `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
206
253
  - `openrouter` - OpenRouter API
254
+ - `google` - Google Gemini API
255
+ - `bedrock` - AWS Bedrock (uses AWS credentials instead of api_key)
207
256
  - `codex` - OpenAI Codex CLI (OAuth-based)
208
257
 
209
258
  List configured providers and models:
@@ -231,12 +280,18 @@ klaude session clean-all
231
280
 
232
281
  Inside the interactive session (`klaude`), use these commands to streamline your workflow:
233
282
 
234
- - `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
235
- - `/export` - Export last assistant message to a temp Markdown file.
236
- - `/init` - Bootstrap a new project structure or module.
237
283
  - `/model` - Switch the active LLM during the session.
284
+ - `/thinking` - Configure model thinking/reasoning level.
238
285
  - `/clear` - Clear the current conversation context.
239
- - `/diff` - Show local git diff changes.
286
+ - `/status` - Show session usage statistics (cost, tokens, model breakdown).
287
+ - `/resume` - Select and resume a previous session.
288
+ - `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
289
+ - `/export` - Export last assistant message to a temp Markdown file.
290
+ - `/export-online` - Export and deploy session to surge.sh as a static webpage.
291
+ - `/debug [filters]` - Toggle debug mode and configure debug filters.
292
+ - `/init` - Bootstrap a new project structure or module.
293
+ - `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
294
+ - `/terminal-setup` - Configure terminal for Shift+Enter support.
240
295
  - `/help` - List all available commands.
241
296
 
242
297
 
@@ -247,6 +302,8 @@ Inside the interactive session (`klaude`), use these commands to streamline your
247
302
  | `Enter` | Submit input |
248
303
  | `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
249
304
  | `Ctrl+J` | Insert newline |
305
+ | `Ctrl+L` | Open model picker overlay |
306
+ | `Ctrl+T` | Open thinking level picker overlay |
250
307
  | `Ctrl+V` | Paste image from clipboard |
251
308
  | `Left/Right` | Move cursor (wraps across lines) |
252
309
  | `Backspace` | Delete character or selected text |
@@ -270,4 +327,18 @@ echo "generate quicksort in python" | klaude exec --model gpt-5.1
270
327
 
271
328
  # Partial/ambiguous name opens the interactive selector (filtered)
272
329
  echo "generate quicksort in python" | klaude exec --model gpt
330
+
331
+ # Stream all events as JSON lines (for programmatic processing)
332
+ klaude exec "what is 2+2?" --stream-json
273
333
  ```
334
+
335
+ ### Sub-Agents
336
+
337
+ The main agent can spawn specialized sub-agents for specific tasks:
338
+
339
+ | Sub-Agent | Purpose |
340
+ |-----------|---------|
341
+ | **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
342
+ | **Task** | Handle complex multi-step tasks autonomously |
343
+ | **WebAgent** | Search the web, fetch pages, and analyze content |
344
+ | **Oracle** | Advanced reasoning advisor for code reviews, architecture planning, and bug analysis |
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "1.6.0"
7
+ version = "1.7.1"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -13,6 +13,7 @@ dependencies = [
13
13
  "chardet>=5.2.0",
14
14
  "ddgs>=9.9.3",
15
15
  "diff-match-patch>=20241021",
16
+ "google-genai>=1.56.0",
16
17
  "markdown-it-py>=4.0.0",
17
18
  "openai>=1.102.0",
18
19
  "pillow>=12.0.0",
@@ -6,7 +6,7 @@ from rich.table import Table
6
6
  from rich.text import Text
7
7
 
8
8
  from klaude_code.config import Config
9
- from klaude_code.config.config import ModelConfig, ProviderConfig
9
+ from klaude_code.config.config import ModelConfig, ProviderConfig, parse_env_var_syntax
10
10
  from klaude_code.protocol.llm_param import LLMClientProtocol
11
11
  from klaude_code.protocol.sub_agent import iter_sub_agent_profiles
12
12
  from klaude_code.ui.rich.theme import ThemeKey, get_theme
@@ -94,6 +94,29 @@ def format_api_key_display(provider: ProviderConfig) -> Text:
94
94
  return Text("N/A")
95
95
 
96
96
 
97
+ def format_env_var_display(value: str | None) -> Text:
98
+ """Format environment variable display with warning if not set."""
99
+ env_var, resolved = parse_env_var_syntax(value)
100
+
101
+ if env_var:
102
+ # Using ${ENV_VAR} syntax
103
+ if resolved:
104
+ return Text.assemble(
105
+ (f"${{{env_var}}} = ", "dim"),
106
+ (mask_api_key(resolved), ""),
107
+ )
108
+ else:
109
+ return Text.assemble(
110
+ (f"${{{env_var}}} ", ""),
111
+ ("(not set)", ThemeKey.CONFIG_STATUS_ERROR),
112
+ )
113
+ elif value:
114
+ # Plain value
115
+ return Text(mask_api_key(value))
116
+ else:
117
+ return Text("N/A")
118
+
119
+
97
120
  def _get_model_params_display(model: ModelConfig) -> list[Text]:
98
121
  """Get display elements for model parameters."""
99
122
  params: list[Text] = []
@@ -162,15 +185,43 @@ def display_models_and_providers(config: Config):
162
185
  format_api_key_display(provider),
163
186
  )
164
187
 
188
+ # AWS Bedrock parameters
189
+ if provider.protocol == LLMClientProtocol.BEDROCK:
190
+ if provider.aws_access_key:
191
+ provider_info.add_row(
192
+ Text("AWS Key:", style=ThemeKey.CONFIG_PARAM_LABEL),
193
+ format_env_var_display(provider.aws_access_key),
194
+ )
195
+ if provider.aws_secret_key:
196
+ provider_info.add_row(
197
+ Text("AWS Secret:", style=ThemeKey.CONFIG_PARAM_LABEL),
198
+ format_env_var_display(provider.aws_secret_key),
199
+ )
200
+ if provider.aws_region:
201
+ provider_info.add_row(
202
+ Text("AWS Region:", style=ThemeKey.CONFIG_PARAM_LABEL),
203
+ format_env_var_display(provider.aws_region),
204
+ )
205
+ if provider.aws_session_token:
206
+ provider_info.add_row(
207
+ Text("AWS Token:", style=ThemeKey.CONFIG_PARAM_LABEL),
208
+ format_env_var_display(provider.aws_session_token),
209
+ )
210
+ if provider.aws_profile:
211
+ provider_info.add_row(
212
+ Text("AWS Profile:", style=ThemeKey.CONFIG_PARAM_LABEL),
213
+ format_env_var_display(provider.aws_profile),
214
+ )
215
+
165
216
  # Check if provider has valid API key
166
217
  provider_available = not provider.is_api_key_missing()
167
218
 
168
219
  # Models table for this provider
169
220
  models_table = Table.grid(padding=(0, 1), expand=True)
170
221
  models_table.add_column(width=2, no_wrap=True) # Status
171
- models_table.add_column(overflow="fold", ratio=1) # Name
172
- models_table.add_column(overflow="fold", ratio=2) # Model
173
- models_table.add_column(overflow="fold", ratio=3) # Params
222
+ models_table.add_column(overflow="fold", ratio=2) # Name
223
+ models_table.add_column(overflow="fold", ratio=3) # Model
224
+ models_table.add_column(overflow="fold", ratio=4) # Params
174
225
 
175
226
  # Add header
176
227
  models_table.add_row(
@@ -95,10 +95,20 @@ def read_input_content(cli_argument: str) -> str | None:
95
95
  return content
96
96
 
97
97
 
98
+ ENV_HELP = """\
99
+ Environment Variables:
100
+
101
+ KLAUDE_READ_GLOBAL_LINE_CAP Max lines to read (default: 2000)
102
+
103
+ KLAUDE_READ_MAX_CHARS Max total chars to read (default: 50000)
104
+ """
105
+
98
106
  app = typer.Typer(
99
107
  add_completion=False,
100
108
  pretty_exceptions_enable=False,
101
109
  no_args_is_help=False,
110
+ rich_markup_mode="rich",
111
+ epilog=ENV_HELP,
102
112
  )
103
113
 
104
114
  # Register subcommands from modules
@@ -379,7 +379,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
379
379
  model_name=model_name,
380
380
  save_as_default=False,
381
381
  defer_thinking_selection=True,
382
- emit_welcome_event=False,
382
+ emit_welcome_event=True,
383
383
  emit_switch_message=False,
384
384
  )
385
385
  )
@@ -398,7 +398,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
398
398
  op.ChangeThinkingOperation(
399
399
  session_id=sid,
400
400
  thinking=thinking,
401
- emit_welcome_event=False,
401
+ emit_welcome_event=True,
402
402
  emit_switch_message=False,
403
403
  )
404
404
  )
@@ -22,8 +22,9 @@ def _session_confirm(sessions: list[Session.SessionMetaBrief], message: str) ->
22
22
  log(f"Sessions to delete ({len(sessions)}):")
23
23
  for s in sessions:
24
24
  msg_count_display = "N/A" if s.messages_count == -1 else str(s.messages_count)
25
- first_msg = (s.first_user_message or "").strip().replace("\n", " ")[:50]
26
- if len(s.first_user_message or "") > 50:
25
+ first_msg_text = s.user_messages[0] if s.user_messages else ""
26
+ first_msg = first_msg_text.strip().replace("\n", " ")[:50]
27
+ if len(first_msg_text) > 50:
27
28
  first_msg += "..."
28
29
  log(f" {_fmt(s.updated_at)} {msg_count_display:>3} msgs {first_msg}")
29
30
 
@@ -7,6 +7,7 @@ from prompt_toolkit.styles import Style
7
7
 
8
8
  from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
9
9
  from klaude_code.protocol import commands, events, model
10
+ from klaude_code.ui.modes.repl.clipboard import copy_to_clipboard
10
11
  from klaude_code.ui.terminal.selector import SelectItem, select_one
11
12
 
12
13
  FORK_SELECT_STYLE = Style(
@@ -215,6 +216,9 @@ class ForkSessionCommand(CommandABC):
215
216
  new_session = agent.session.fork()
216
217
  await new_session.wait_for_flush()
217
218
 
219
+ resume_cmd = f"klaude --resume-by-id {new_session.id}"
220
+ copy_to_clipboard(resume_cmd)
221
+
218
222
  event = events.DeveloperMessageEvent(
219
223
  session_id=agent.session.id,
220
224
  item=model.DeveloperMessageItem(
@@ -247,6 +251,9 @@ class ForkSessionCommand(CommandABC):
247
251
  # Build result message
248
252
  fork_description = "entire conversation" if selected is None else f"up to message index {selected}"
249
253
 
254
+ resume_cmd = f"klaude --resume-by-id {new_session.id}"
255
+ copy_to_clipboard(resume_cmd)
256
+
250
257
  event = events.DeveloperMessageEvent(
251
258
  session_id=agent.session.id,
252
259
  item=model.DeveloperMessageItem(
@@ -7,7 +7,7 @@ provider_list:
7
7
  protocol: anthropic
8
8
  api_key: ${ANTHROPIC_API_KEY}
9
9
  model_list:
10
- - model_name: sonnet
10
+ - model_name: sonnet@ant
11
11
  model_params:
12
12
  model: claude-sonnet-4-5-20250929
13
13
  context_limit: 200000
@@ -18,7 +18,7 @@ provider_list:
18
18
  output: 15.0
19
19
  cache_read: 0.3
20
20
  cache_write: 3.75
21
- - model_name: opus
21
+ - model_name: opus@ant
22
22
  model_params:
23
23
  model: claude-opus-4-5-20251101
24
24
  context_limit: 200000
@@ -87,6 +87,30 @@ provider_list:
87
87
  input: 1.75
88
88
  output: 14.0
89
89
  cache_read: 0.17
90
+ - model_name: gpt-5.2-medium
91
+ model_params:
92
+ model: openai/gpt-5.2
93
+ max_tokens: 128000
94
+ context_limit: 400000
95
+ verbosity: high
96
+ thinking:
97
+ reasoning_effort: medium
98
+ cost:
99
+ input: 1.75
100
+ output: 14.0
101
+ cache_read: 0.17
102
+ - model_name: gpt-5.2-low
103
+ model_params:
104
+ model: openai/gpt-5.2
105
+ max_tokens: 128000
106
+ context_limit: 400000
107
+ verbosity: low
108
+ thinking:
109
+ reasoning_effort: low
110
+ cost:
111
+ input: 1.75
112
+ output: 14.0
113
+ cache_read: 0.17
90
114
  - model_name: gpt-5.2-fast
91
115
  model_params:
92
116
  model: openai/gpt-5.2
@@ -194,6 +218,41 @@ provider_list:
194
218
  output: 1.74
195
219
  cache_read: 0.04
196
220
 
221
+ - provider_name: google
222
+ protocol: google
223
+ api_key: ${GOOGLE_API_KEY}
224
+ model_list:
225
+ - model_name: gemini-pro@google
226
+ model_params:
227
+ model: gemini-3-pro-preview
228
+ context_limit: 1048576
229
+ cost:
230
+ input: 2.0
231
+ output: 12.0
232
+ cache_read: 0.2
233
+ - model_name: gemini-flash@google
234
+ model_params:
235
+ model: gemini-3-flash-preview
236
+ context_limit: 1048576
237
+ cost:
238
+ input: 0.5
239
+ output: 3.0
240
+ cache_read: 0.05
241
+ - provider_name: bedrock
242
+ protocol: bedrock
243
+ aws_access_key: ${AWS_ACCESS_KEY_ID}
244
+ aws_secret_key: ${AWS_SECRET_ACCESS_KEY}
245
+ aws_region: ${AWS_REGION}
246
+ model_list:
247
+ - model_name: sonnet@bedrock
248
+ model_params:
249
+ model: us.anthropic.claude-sonnet-4-5-20250929-v1:0
250
+ context_limit: 200000
251
+ cost:
252
+ input: 3.0
253
+ output: 15.0
254
+ cache_read: 0.3
255
+ cache_write: 3.75
197
256
  - provider_name: deepseek
198
257
  protocol: anthropic
199
258
  api_key: ${DEEPSEEK_API_KEY}
@@ -17,6 +17,7 @@ if TYPE_CHECKING:
17
17
  # All supported API key environment variables
18
18
  SUPPORTED_API_KEY_ENVS = [
19
19
  "ANTHROPIC_API_KEY",
20
+ "GOOGLE_API_KEY",
20
21
  "OPENAI_API_KEY",
21
22
  "OPENROUTER_API_KEY",
22
23
  "DEEPSEEK_API_KEY",
@@ -77,6 +77,7 @@ class ProviderConfig(llm_param.LLMConfigProviderParameter):
77
77
  """Check if the API key is missing (either not set or env var not found).
78
78
 
79
79
  For codex protocol, checks OAuth login status instead of API key.
80
+ For bedrock protocol, checks AWS credentials instead of API key.
80
81
  """
81
82
  from klaude_code.protocol.llm_param import LLMClientProtocol
82
83
 
@@ -89,6 +90,19 @@ class ProviderConfig(llm_param.LLMConfigProviderParameter):
89
90
  # Consider available if logged in and token not expired
90
91
  return state is None or state.is_expired()
91
92
 
93
+ if self.protocol == LLMClientProtocol.BEDROCK:
94
+ # Bedrock uses AWS credentials, not API key. Region is always required.
95
+ _, resolved_profile = parse_env_var_syntax(self.aws_profile)
96
+ _, resolved_region = parse_env_var_syntax(self.aws_region)
97
+
98
+ # When using profile, we still need region to initialize the client.
99
+ if resolved_profile:
100
+ return resolved_region is None
101
+
102
+ _, resolved_access_key = parse_env_var_syntax(self.aws_access_key)
103
+ _, resolved_secret_key = parse_env_var_syntax(self.aws_secret_key)
104
+ return resolved_region is None or resolved_access_key is None or resolved_secret_key is None
105
+
92
106
  return self.get_resolved_api_key() is None
93
107
 
94
108
 
@@ -243,6 +257,11 @@ def get_example_config() -> UserConfig:
243
257
  model="model-id-from-provider",
244
258
  max_tokens=16000,
245
259
  context_limit=200000,
260
+ cost=llm_param.Cost(
261
+ input=1,
262
+ output=10,
263
+ cache_read=0.1,
264
+ ),
246
265
  ),
247
266
  ),
248
267
  ],
@@ -121,6 +121,13 @@ def format_current_thinking(config: llm_param.LLMConfigParameter) -> str:
121
121
  return f"enabled (budget_tokens={thinking.budget_tokens})"
122
122
  return "not set"
123
123
 
124
+ if protocol == llm_param.LLMClientProtocol.GOOGLE:
125
+ if thinking.type == "disabled":
126
+ return "off"
127
+ if thinking.type == "enabled":
128
+ return f"enabled (budget_tokens={thinking.budget_tokens})"
129
+ return "not set"
130
+
124
131
  return "unknown protocol"
125
132
 
126
133
 
@@ -230,6 +237,13 @@ def get_thinking_picker_data(config: llm_param.LLMConfigParameter) -> ThinkingPi
230
237
  current_value=_get_current_budget_value(thinking),
231
238
  )
232
239
 
240
+ if protocol == llm_param.LLMClientProtocol.GOOGLE:
241
+ return ThinkingPickerData(
242
+ options=_build_budget_options(),
243
+ message="Select thinking level:",
244
+ current_value=_get_current_budget_value(thinking),
245
+ )
246
+
233
247
  return None
234
248
 
235
249