klaude-code 1.2.20__tar.gz → 1.2.21__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 (198) hide show
  1. {klaude_code-1.2.20 → klaude_code-1.2.21}/PKG-INFO +1 -1
  2. {klaude_code-1.2.20 → klaude_code-1.2.21}/pyproject.toml +1 -1
  3. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/main.py +23 -0
  4. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/runtime.py +13 -1
  5. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/thinking_cmd.py +10 -0
  6. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/shell/bash_tool.py +4 -3
  7. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/mermaid_tool.md +26 -0
  8. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/session.py +7 -0
  9. {klaude_code-1.2.20 → klaude_code-1.2.21}/README.md +0 -0
  10. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/__init__.py +0 -0
  11. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/auth/__init__.py +0 -0
  12. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/auth/codex/__init__.py +0 -0
  13. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/auth/codex/exceptions.py +0 -0
  14. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  15. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/auth/codex/oauth.py +0 -0
  16. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/auth/codex/token_manager.py +0 -0
  17. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/__init__.py +0 -0
  18. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/auth_cmd.py +0 -0
  19. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/config_cmd.py +0 -0
  20. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/debug.py +0 -0
  21. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/list_model.py +0 -0
  22. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/self_update.py +0 -0
  23. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/cli/session_cmd.py +0 -0
  24. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/__init__.py +0 -0
  25. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/clear_cmd.py +0 -0
  26. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/command_abc.py +0 -0
  27. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/debug_cmd.py +0 -0
  28. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/diff_cmd.py +0 -0
  29. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/export_cmd.py +0 -0
  30. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/export_online_cmd.py +0 -0
  31. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/help_cmd.py +0 -0
  32. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/model_cmd.py +0 -0
  33. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt-deslop.md +0 -0
  34. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt-dev-docs-update.md +0 -0
  35. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt-dev-docs.md +0 -0
  36. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt-handoff.md +0 -0
  37. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt-init.md +0 -0
  38. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt-jj-workspace.md +0 -0
  39. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/prompt_command.py +0 -0
  40. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/refresh_cmd.py +0 -0
  41. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/registry.py +0 -0
  42. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/release_notes_cmd.py +0 -0
  43. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/status_cmd.py +0 -0
  44. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  45. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/config/__init__.py +0 -0
  46. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/config/config.py +0 -0
  47. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/config/select_model.py +0 -0
  48. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/const/__init__.py +0 -0
  49. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/__init__.py +0 -0
  50. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/agent.py +0 -0
  51. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/executor.py +0 -0
  52. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/manager/__init__.py +0 -0
  53. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/manager/llm_clients.py +0 -0
  54. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  55. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  56. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompt.py +0 -0
  57. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  58. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  59. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1.md +0 -0
  60. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  61. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  62. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  63. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  64. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  65. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  66. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/reminders.py +0 -0
  67. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/task.py +0 -0
  68. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/__init__.py +0 -0
  69. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/__init__.py +0 -0
  70. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/_utils.py +0 -0
  71. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  72. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  73. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  74. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  75. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  76. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/multi_edit_tool.md +0 -0
  77. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/multi_edit_tool.py +0 -0
  78. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  79. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  80. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  81. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  82. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/memory/__init__.py +0 -0
  83. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/memory/memory_tool.md +0 -0
  84. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/memory/memory_tool.py +0 -0
  85. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/memory/skill_loader.py +0 -0
  86. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/memory/skill_tool.md +0 -0
  87. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/memory/skill_tool.py +0 -0
  88. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  89. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  90. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  91. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  92. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  93. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  94. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  95. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  96. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  97. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  98. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  99. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/tool_abc.py +0 -0
  100. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/tool_context.py +0 -0
  101. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/tool_registry.py +0 -0
  102. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/tool_runner.py +0 -0
  103. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/truncation.py +0 -0
  104. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/__init__.py +0 -0
  105. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  106. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  107. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  108. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  109. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  110. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/core/turn.py +0 -0
  111. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/__init__.py +0 -0
  112. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  113. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/anthropic/client.py +0 -0
  114. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/anthropic/input.py +0 -0
  115. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/client.py +0 -0
  116. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/codex/__init__.py +0 -0
  117. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/codex/client.py +0 -0
  118. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/input_common.py +0 -0
  119. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  120. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  121. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  122. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openai_compatible/stream_processor.py +0 -0
  123. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  124. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  125. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openrouter/client.py +0 -0
  126. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openrouter/input.py +0 -0
  127. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/openrouter/reasoning_handler.py +0 -0
  128. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/registry.py +0 -0
  129. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/responses/__init__.py +0 -0
  130. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/responses/client.py +0 -0
  131. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/responses/input.py +0 -0
  132. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/llm/usage.py +0 -0
  133. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/__init__.py +0 -0
  134. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/commands.py +0 -0
  135. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/events.py +0 -0
  136. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/llm_param.py +0 -0
  137. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/model.py +0 -0
  138. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/op.py +0 -0
  139. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/op_handler.py +0 -0
  140. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  141. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  142. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  143. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  144. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  145. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/protocol/tools.py +0 -0
  146. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/__init__.py +0 -0
  147. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/codec.py +0 -0
  148. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/export.py +0 -0
  149. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/selector.py +0 -0
  150. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/store.py +0 -0
  151. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/session/templates/export_session.html +0 -0
  152. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/trace/__init__.py +0 -0
  153. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/trace/log.py +0 -0
  154. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/__init__.py +0 -0
  155. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/core/__init__.py +0 -0
  156. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/core/display.py +0 -0
  157. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/core/input.py +0 -0
  158. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/core/stage_manager.py +0 -0
  159. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/__init__.py +0 -0
  160. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  161. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/debug/display.py +0 -0
  162. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  163. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/exec/display.py +0 -0
  164. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
  165. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  166. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/completers.py +0 -0
  167. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/display.py +0 -0
  168. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/event_handler.py +0 -0
  169. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +0 -0
  170. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
  171. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
  172. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/__init__.py +0 -0
  173. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/assistant.py +0 -0
  174. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/common.py +0 -0
  175. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/developer.py +0 -0
  176. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/diffs.py +0 -0
  177. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/errors.py +0 -0
  178. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/metadata.py +0 -0
  179. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
  180. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/thinking.py +0 -0
  181. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/tools.py +0 -0
  182. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/renderers/user_input.py +0 -0
  183. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/__init__.py +0 -0
  184. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  185. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/code_panel.py +0 -0
  186. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/live.py +0 -0
  187. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/markdown.py +0 -0
  188. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/quote.py +0 -0
  189. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/searchable_text.py +0 -0
  190. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/status.py +0 -0
  191. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/rich/theme.py +0 -0
  192. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/terminal/__init__.py +0 -0
  193. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/terminal/color.py +0 -0
  194. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/terminal/control.py +0 -0
  195. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/terminal/notifier.py +0 -0
  196. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  197. {klaude_code-1.2.20 → klaude_code-1.2.21}/src/klaude_code/ui/utils/__init__.py +0 -0
  198. {klaude_code-1.2.20 → klaude_code-1.2.21}/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.20
3
+ Version: 1.2.21
4
4
  Summary: Add your description here
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.2.20"
7
+ version = "1.2.21"
8
8
  description = "Add your description here"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -194,6 +194,11 @@ def main_callback(
194
194
  ),
195
195
  continue_: bool = typer.Option(False, "--continue", "-c", help="Continue from latest session"),
196
196
  resume: bool = typer.Option(False, "--resume", "-r", help="Select a session to resume for this project"),
197
+ resume_by_id: str | None = typer.Option(
198
+ None,
199
+ "--resume-by-id",
200
+ help="Resume a session by its ID (must exist)",
201
+ ),
197
202
  select_model: bool = typer.Option(
198
203
  False,
199
204
  "--select-model",
@@ -224,6 +229,7 @@ def main_callback(
224
229
  if ctx.invoked_subcommand is None:
225
230
  from klaude_code.cli.runtime import AppInitConfig, run_interactive
226
231
  from klaude_code.config.select_model import select_model_from_config
232
+ from klaude_code.trace import log
227
233
 
228
234
  update_terminal_title()
229
235
 
@@ -236,6 +242,16 @@ def main_callback(
236
242
  # Resolve session id before entering asyncio loop
237
243
  # session_id=None means create a new session
238
244
  session_id: str | None = None
245
+
246
+ resume_by_id_value = resume_by_id.strip() if resume_by_id is not None else None
247
+ if resume_by_id_value == "":
248
+ log(("Error: --resume-by-id cannot be empty", "red"))
249
+ raise typer.Exit(2)
250
+
251
+ if resume_by_id_value is not None and (resume or continue_):
252
+ log(("Error: --resume-by-id cannot be combined with --resume/--continue", "red"))
253
+ raise typer.Exit(2)
254
+
239
255
  if resume:
240
256
  session_id = resume_select_session()
241
257
  if session_id is None:
@@ -243,6 +259,13 @@ def main_callback(
243
259
  # If user didn't pick, allow fallback to --continue
244
260
  if session_id is None and continue_:
245
261
  session_id = Session.most_recent_session_id()
262
+
263
+ if resume_by_id_value is not None:
264
+ if not Session.exists(resume_by_id_value):
265
+ log((f"Error: session id '{resume_by_id_value}' not found for this project", "red"))
266
+ log(("Hint: run `klaude --resume` to select an existing session", "yellow"))
267
+ raise typer.Exit(2)
268
+ session_id = resume_by_id_value
246
269
  # If still no session_id, leave as None to create a new session
247
270
 
248
271
  if session_id is not None and chosen_model is None:
@@ -17,7 +17,7 @@ from klaude_code.core.executor import Executor
17
17
  from klaude_code.core.manager import build_llm_clients
18
18
  from klaude_code.protocol import events, op
19
19
  from klaude_code.protocol.model import UserInputPayload
20
- from klaude_code.session.session import close_default_store
20
+ from klaude_code.session.session import Session, close_default_store
21
21
  from klaude_code.trace import DebugType, log, set_debug_logging
22
22
  from klaude_code.ui.modes.repl import build_repl_status_snapshot
23
23
  from klaude_code.ui.modes.repl.input_prompt_toolkit import REPLStatusSnapshot
@@ -212,6 +212,9 @@ async def _handle_keyboard_interrupt(executor: Executor) -> None:
212
212
  """Handle Ctrl+C by logging and sending a global interrupt."""
213
213
 
214
214
  log("Bye!")
215
+ session_id = executor.context.current_session_id()
216
+ if session_id and Session.exists(session_id):
217
+ log(("Resume with:", "dim"), (f"klaude --resume-by-id {session_id}", "green"))
215
218
  # Executor might already be stopping
216
219
  with contextlib.suppress(Exception):
217
220
  await executor.submit(op.InterruptOperation(target_session_id=None))
@@ -296,6 +299,8 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
296
299
 
297
300
  restore_sigint = install_sigint_double_press_exit(_show_toast_once, _hide_progress)
298
301
 
302
+ exit_hint_printed = False
303
+
299
304
  try:
300
305
  await initialize_session(components.executor, components.event_queue, session_id=session_id)
301
306
  _backfill_session_model_config(
@@ -347,8 +352,15 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
347
352
 
348
353
  except KeyboardInterrupt:
349
354
  await _handle_keyboard_interrupt(components.executor)
355
+ exit_hint_printed = True
350
356
  finally:
351
357
  # Restore original SIGINT handler
352
358
  with contextlib.suppress(Exception):
353
359
  restore_sigint()
354
360
  await cleanup_app_components(components)
361
+
362
+ if not exit_hint_printed:
363
+ active_session_id = components.executor.context.current_session_id()
364
+ if active_session_id and Session.exists(active_session_id):
365
+ log(f"Session ID: {active_session_id}")
366
+ log(f"Resume with: klaude --resume-by-id {active_session_id}")
@@ -10,6 +10,7 @@ RESPONSES_LEVELS = ["low", "medium", "high"]
10
10
  RESPONSES_GPT51_LEVELS = ["none", "low", "medium", "high"]
11
11
  RESPONSES_GPT52_LEVELS = ["none", "low", "medium", "high", "xhigh"]
12
12
  RESPONSES_CODEX_MAX_LEVELS = ["medium", "high", "xhigh"]
13
+ RESPONSES_GEMINI_FLASH_LEVELS = ["minimal", "low", "medium", "high"]
13
14
 
14
15
  ANTHROPIC_LEVELS: list[tuple[str, int | None]] = [
15
16
  ("off", 0),
@@ -48,6 +49,13 @@ def _is_codex_max_model(model_name: str | None) -> bool:
48
49
  return "codex-max" in model_name.lower()
49
50
 
50
51
 
52
+ def _is_gemini_flash_model(model_name: str | None) -> bool:
53
+ """Check if the model is Gemini 3 Flash."""
54
+ if not model_name:
55
+ return False
56
+ return "gemini-3-flash" in model_name.lower()
57
+
58
+
51
59
  def _get_levels_for_responses(model_name: str | None) -> list[str]:
52
60
  """Get thinking levels for responses protocol."""
53
61
  if _is_codex_max_model(model_name):
@@ -56,6 +64,8 @@ def _get_levels_for_responses(model_name: str | None) -> list[str]:
56
64
  return RESPONSES_GPT52_LEVELS
57
65
  if _is_gpt51_model(model_name):
58
66
  return RESPONSES_GPT51_LEVELS
67
+ if _is_gemini_flash_model(model_name):
68
+ return RESPONSES_GEMINI_FLASH_LEVELS
59
69
  return RESPONSES_LEVELS
60
70
 
61
71
 
@@ -5,6 +5,7 @@ import re
5
5
  import signal
6
6
  import subprocess
7
7
  from pathlib import Path
8
+ from typing import Any
8
9
 
9
10
  from pydantic import BaseModel
10
11
 
@@ -122,7 +123,7 @@ class BashTool(ToolABC):
122
123
  return
123
124
 
124
125
  try:
125
- if os.name == "posix" and proc.pid is not None:
126
+ if os.name == "posix":
126
127
  os.killpg(proc.pid, signal.SIGTERM)
127
128
  else:
128
129
  proc.terminate()
@@ -138,7 +139,7 @@ class BashTool(ToolABC):
138
139
 
139
140
  # Escalate to hard kill if it didn't exit quickly.
140
141
  with contextlib.suppress(Exception):
141
- if os.name == "posix" and proc.pid is not None:
142
+ if os.name == "posix":
142
143
  os.killpg(proc.pid, signal.SIGKILL)
143
144
  else:
144
145
  proc.kill()
@@ -148,7 +149,7 @@ class BashTool(ToolABC):
148
149
  try:
149
150
  # Create a dedicated process group so we can terminate the whole tree.
150
151
  # (macOS/Linux support start_new_session; Windows does not.)
151
- kwargs: dict[str, object] = {
152
+ kwargs: dict[str, Any] = {
152
153
  "stdin": asyncio.subprocess.DEVNULL,
153
154
  "stdout": asyncio.subprocess.PIPE,
154
155
  "stderr": asyncio.subprocess.PIPE,
@@ -17,5 +17,31 @@ Diagrams are especially valuable for visualizing:
17
17
  - Sequence and timing of operations
18
18
  - Decision trees and conditional logic
19
19
 
20
+ # Syntax
21
+ - ALWAYS wrap node labels in double quotes, especially when they contain spaces, special characters, or non-ASCII text
22
+ - This applies to all node types: regular nodes, subgraph titles, and edge labels
23
+
24
+ Examples:
25
+ ```mermaid
26
+ graph LR
27
+ A["User Input"] --> B["Process Data"]
28
+ B --> C["Output Result"]
29
+ ```
30
+
31
+ ```mermaid
32
+ flowchart TD
33
+ subgraph auth["Authentication Module"]
34
+ login["Login Service"]
35
+ oauth["OAuth Provider"]
36
+ end
37
+ ```
38
+
39
+ ```mermaid
40
+ sequenceDiagram
41
+ participant client as "Web Client"
42
+ participant server as "API Server"
43
+ client ->> server: "Send Request"
44
+ ```
45
+
20
46
  # Styling
21
47
  - When defining custom classDefs, always define fill color, stroke color, and text color ("fill", "stroke", "color") explicitly
@@ -86,6 +86,13 @@ class Session(BaseModel):
86
86
  def paths(cls) -> ProjectPaths:
87
87
  return get_default_store().paths
88
88
 
89
+ @classmethod
90
+ def exists(cls, id: str) -> bool:
91
+ """Return True if a persisted session exists for the current project."""
92
+
93
+ paths = cls.paths()
94
+ return paths.meta_file(id).exists() or paths.events_file(id).exists()
95
+
89
96
  @classmethod
90
97
  def create(cls, id: str | None = None, *, work_dir: Path | None = None) -> Session:
91
98
  session = Session(id=id or uuid.uuid4().hex, work_dir=work_dir or Path.cwd())
File without changes