klaude-code 2.21.0__tar.gz → 2.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. {klaude_code-2.21.0 → klaude_code-2.23.0}/PKG-INFO +66 -15
  2. {klaude_code-2.21.0 → klaude_code-2.23.0}/README.md +61 -12
  3. {klaude_code-2.21.0 → klaude_code-2.23.0}/pyproject.toml +8 -4
  4. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/app/__init__.py +1 -1
  5. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/app/auth_flow.py +7 -7
  6. {klaude_code-2.21.0/src/klaude_code/cli → klaude_code-2.23.0/src/klaude_code/app}/log_viewer.html +136 -7
  7. klaude_code-2.21.0/src/klaude_code/cli/log_server.py → klaude_code-2.23.0/src/klaude_code/app/log_viewer.py +71 -8
  8. klaude_code-2.23.0/src/klaude_code/app/ports/__init__.py +5 -0
  9. klaude_code-2.23.0/src/klaude_code/app/ports/display.py +36 -0
  10. klaude_code-2.23.0/src/klaude_code/app/ports/input.py +21 -0
  11. klaude_code-2.23.0/src/klaude_code/app/ports/interaction.py +14 -0
  12. klaude_code-2.23.0/src/klaude_code/app/runtime.py +310 -0
  13. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/copilot/oauth.py +3 -1
  14. klaude_code-2.23.0/src/klaude_code/auth/copilot/token_manager.py +64 -0
  15. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/auth_cmd.py +2 -2
  16. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/config_cmd.py +2 -2
  17. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/cost_cmd.py +1 -1
  18. klaude_code-2.23.0/src/klaude_code/cli/list_model.py +293 -0
  19. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/main.py +13 -10
  20. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/oauth_usage.py +8 -8
  21. klaude_code-2.23.0/src/klaude_code/cli/web_cmd.py +34 -0
  22. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/__init__.py +2 -0
  23. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/assets/builtin_config.yaml +312 -218
  24. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/builtin_config.py +3 -2
  25. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/config.py +157 -40
  26. klaude_code-2.21.0/src/klaude_code/ui/common.py → klaude_code-2.23.0/src/klaude_code/config/formatters.py +8 -22
  27. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/sub_agent_model_helper.py +15 -15
  28. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/thinking.py +5 -5
  29. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/const.py +10 -4
  30. klaude_code-2.23.0/src/klaude_code/core/agent/__init__.py +3 -0
  31. {klaude_code-2.21.0/src/klaude_code/core → klaude_code-2.23.0/src/klaude_code/core/agent}/agent.py +19 -4
  32. {klaude_code-2.21.0/src/klaude_code/core → klaude_code-2.23.0/src/klaude_code/core/agent}/reminders.py +4 -93
  33. klaude_code-2.23.0/src/klaude_code/core/agent/runtime_agent_ops.py +823 -0
  34. klaude_code-2.23.0/src/klaude_code/core/agent/runtime_config_ops.py +576 -0
  35. klaude_code-2.23.0/src/klaude_code/core/agent/runtime_dispatcher.py +377 -0
  36. klaude_code-2.23.0/src/klaude_code/core/agent/runtime_llm.py +131 -0
  37. klaude_code-2.21.0/src/klaude_code/core/manager/sub_agent_manager.py → klaude_code-2.23.0/src/klaude_code/core/agent/runtime_sub_agent.py +17 -37
  38. klaude_code-2.23.0/src/klaude_code/core/agent/session_title.py +116 -0
  39. {klaude_code-2.21.0/src/klaude_code/core → klaude_code-2.23.0/src/klaude_code/core/agent}/task.py +27 -6
  40. {klaude_code-2.21.0/src/klaude_code/core → klaude_code-2.23.0/src/klaude_code/core/agent}/turn.py +87 -39
  41. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/agent_profile.py +26 -25
  42. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/compaction/compaction.py +95 -12
  43. klaude_code-2.23.0/src/klaude_code/core/control/__init__.py +16 -0
  44. klaude_code-2.23.0/src/klaude_code/core/control/event_bus.py +215 -0
  45. klaude_code-2.23.0/src/klaude_code/core/control/event_relay.py +160 -0
  46. klaude_code-2.23.0/src/klaude_code/core/control/runtime_facade.py +508 -0
  47. klaude_code-2.23.0/src/klaude_code/core/control/session_actor.py +535 -0
  48. klaude_code-2.23.0/src/klaude_code/core/control/session_registry.py +420 -0
  49. klaude_code-2.23.0/src/klaude_code/core/control/user_interaction.py +16 -0
  50. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/memory.py +50 -15
  51. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/prompts/base-system-prompt.md +2 -0
  52. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/prompts/system_prompt.py +58 -14
  53. klaude_code-2.23.0/src/klaude_code/core/session_stats.py +127 -0
  54. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/__init__.py +14 -3
  55. klaude_code-2.21.0/src/klaude_code/core/tool/task_tool.md → klaude_code-2.23.0/src/klaude_code/core/tool/agent_tool.md +3 -3
  56. klaude_code-2.21.0/src/klaude_code/core/tool/task_tool.py → klaude_code-2.23.0/src/klaude_code/core/tool/agent_tool.py +21 -19
  57. klaude_code-2.23.0/src/klaude_code/core/tool/ask_user_question_tool.md +10 -0
  58. klaude_code-2.23.0/src/klaude_code/core/tool/ask_user_question_tool.py +298 -0
  59. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/context.py +24 -1
  60. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/apply_patch_tool.py +57 -5
  61. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/diff_builder.py +16 -1
  62. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/edit_tool.py +7 -0
  63. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/read_tool.py +77 -2
  64. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/write_tool.py +13 -1
  65. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/rewind_tool.md +1 -1
  66. klaude_code-2.23.0/src/klaude_code/core/tool/shell/bash_tool.md +5 -0
  67. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/shell/bash_tool.py +56 -10
  68. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/shell/command_safety.py +9 -9
  69. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/todo/todo_write_tool.py +3 -1
  70. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/tool_runner.py +50 -12
  71. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/web_search_tool.py +70 -53
  72. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/anthropic/client.py +9 -5
  73. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/anthropic/input.py +6 -2
  74. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/bedrock_anthropic/client.py +0 -1
  75. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/claude/client.py +0 -1
  76. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/copilot/client.py +4 -4
  77. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/google/client.py +12 -5
  78. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/google/input.py +11 -3
  79. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/google_vertex/client.py +7 -2
  80. klaude_code-2.23.0/src/klaude_code/llm/image.py +310 -0
  81. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/input_common.py +8 -13
  82. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_codex/client.py +0 -4
  83. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_compatible/client.py +0 -2
  84. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_compatible/stream.py +1 -1
  85. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_responses/client.py +49 -9
  86. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_responses/input.py +6 -3
  87. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openrouter/client.py +0 -2
  88. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openrouter/input.py +13 -0
  89. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openrouter/reasoning.py +1 -1
  90. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/registry.py +1 -1
  91. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/stream_parts.py +2 -0
  92. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/log.py +3 -6
  93. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/__init__.py +1 -1
  94. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/events.py +205 -7
  95. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/llm_param.py +18 -4
  96. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/message.py +6 -1
  97. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/model.py +73 -4
  98. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/model_id.py +8 -0
  99. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/op.py +81 -30
  100. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/op_handler.py +30 -5
  101. klaude_code-2.23.0/src/klaude_code/protocol/sub_agent/AGENTS.md +18 -0
  102. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/sub_agent/__init__.py +4 -4
  103. klaude_code-2.21.0/src/klaude_code/protocol/sub_agent/task.py → klaude_code-2.23.0/src/klaude_code/protocol/sub_agent/general_purpose.py +2 -2
  104. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/tools.py +2 -1
  105. klaude_code-2.23.0/src/klaude_code/protocol/user_interaction.py +75 -0
  106. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/codec.py +12 -4
  107. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/export.py +32 -10
  108. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/selector.py +5 -2
  109. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/session.py +223 -61
  110. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/store.py +83 -5
  111. klaude_code-2.23.0/src/klaude_code/skill/AGENTS.md +28 -0
  112. klaude_code-2.23.0/src/klaude_code/skill/assets/.git +1 -0
  113. klaude_code-2.23.0/src/klaude_code/skill/assets/.gitignore +2 -0
  114. klaude_code-2.23.0/src/klaude_code/skill/assets/SOURCES.md +3 -0
  115. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/SKILL.md +567 -0
  116. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/authentication.md +202 -0
  117. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/commands.md +264 -0
  118. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/profiling.md +120 -0
  119. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/proxy-support.md +194 -0
  120. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/session-management.md +193 -0
  121. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/snapshot-refs.md +194 -0
  122. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/references/video-recording.md +173 -0
  123. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/templates/authenticated-session.sh +105 -0
  124. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/templates/capture-workflow.sh +69 -0
  125. klaude_code-2.23.0/src/klaude_code/skill/assets/agent-browser/templates/form-automation.sh +62 -0
  126. klaude_code-2.23.0/src/klaude_code/skill/assets/download-yt-sub/SKILL.md +27 -0
  127. klaude_code-2.23.0/src/klaude_code/skill/assets/download-yt-sub/scripts/download_subtitles.sh +77 -0
  128. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/SKILL.md +8 -7
  129. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/references/cli.md +16 -7
  130. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/references/gemini-api.md +15 -6
  131. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/references/prompting.md +4 -3
  132. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/references/sample-prompts.md +1 -1
  133. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/scripts/gemini_image_gen.py +118 -49
  134. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/SKILL.md +61 -0
  135. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/3d.md +86 -0
  136. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/animations.md +27 -0
  137. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  138. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  139. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  140. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/assets.md +78 -0
  141. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/audio-visualization.md +198 -0
  142. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/audio.md +169 -0
  143. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/calculate-metadata.md +134 -0
  144. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/can-decode.md +75 -0
  145. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/charts.md +120 -0
  146. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/compositions.md +154 -0
  147. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/display-captions.md +184 -0
  148. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/extract-frames.md +229 -0
  149. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/ffmpeg.md +38 -0
  150. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/fonts.md +152 -0
  151. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/get-audio-duration.md +58 -0
  152. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  153. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/get-video-duration.md +60 -0
  154. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/gifs.md +141 -0
  155. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/images.md +134 -0
  156. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/import-srt-captions.md +69 -0
  157. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/light-leaks.md +73 -0
  158. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/lottie.md +70 -0
  159. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/maps.md +412 -0
  160. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  161. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/measuring-text.md +140 -0
  162. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/parameters.md +109 -0
  163. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/sequencing.md +118 -0
  164. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/sfx.md +30 -0
  165. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/subtitles.md +36 -0
  166. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/tailwind.md +11 -0
  167. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/text-animations.md +20 -0
  168. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/timing.md +179 -0
  169. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/transcribe-captions.md +70 -0
  170. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/transitions.md +197 -0
  171. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/transparent-videos.md +106 -0
  172. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/trimming.md +51 -0
  173. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/videos.md +171 -0
  174. klaude_code-2.23.0/src/klaude_code/skill/assets/remotion-best-practices/rules/voiceover.md +99 -0
  175. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/render-mermaid/SKILL.md +9 -2
  176. klaude_code-2.23.0/src/klaude_code/skill/assets/render-mermaid/scripts/render_mermaid.js +431 -0
  177. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/loader.py +43 -2
  178. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/__init__.py +0 -3
  179. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/__init__.py +11 -18
  180. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/auth_selector.py +15 -9
  181. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/command_abc.py +11 -4
  182. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/compact_cmd.py +6 -5
  183. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/continue_cmd.py +6 -6
  184. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/copy_cmd.py +6 -8
  185. klaude_code-2.23.0/src/klaude_code/tui/command/debug_cmd.py +37 -0
  186. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/export_cmd.py +5 -4
  187. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/fork_session_cmd.py +11 -14
  188. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/login_cmd.py +9 -13
  189. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/logout_cmd.py +9 -13
  190. klaude_code-2.23.0/src/klaude_code/tui/command/model_cmd.py +40 -0
  191. klaude_code-2.21.0/src/klaude_code/tui/command/clear_cmd.py → klaude_code-2.23.0/src/klaude_code/tui/command/new_cmd.py +7 -6
  192. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/refresh_cmd.py +4 -3
  193. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/registry.py +15 -37
  194. klaude_code-2.23.0/src/klaude_code/tui/command/status_cmd.py +20 -0
  195. klaude_code-2.23.0/src/klaude_code/tui/command/sub_agent_model_cmd.py +28 -0
  196. klaude_code-2.23.0/src/klaude_code/tui/command/thinking_cmd.py +24 -0
  197. klaude_code-2.21.0/src/klaude_code/protocol/commands.py → klaude_code-2.23.0/src/klaude_code/tui/command/types.py +1 -3
  198. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/commands.py +8 -2
  199. klaude_code-2.23.0/src/klaude_code/tui/components/command_output.py +130 -0
  200. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/developer.py +1 -1
  201. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/metadata.py +153 -54
  202. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/markdown.py +23 -0
  203. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/status.py +11 -16
  204. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/theme.py +18 -7
  205. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/tools.py +108 -20
  206. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/welcome.py +14 -5
  207. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/display.py +28 -5
  208. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/completers.py +113 -26
  209. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/images.py +0 -127
  210. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/key_bindings.py +1 -1
  211. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/prompt_toolkit.py +55 -4
  212. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/machine.py +371 -79
  213. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/renderer.py +74 -51
  214. klaude_code-2.23.0/src/klaude_code/tui/runner.py +550 -0
  215. klaude_code-2.23.0/src/klaude_code/tui/terminal/ask_user_question.py +837 -0
  216. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/control.py +27 -0
  217. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/notifier.py +1 -0
  218. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/selector.py +69 -22
  219. klaude_code-2.21.0/src/klaude_code/tui/command/resume_cmd.py → klaude_code-2.23.0/src/klaude_code/tui/terminal/session_selector.py +3 -47
  220. klaude_code-2.23.0/src/klaude_code/tui/terminal/title.py +60 -0
  221. klaude_code-2.23.0/src/klaude_code/web/__init__.py +5 -0
  222. klaude_code-2.23.0/src/klaude_code/web/app.py +99 -0
  223. klaude_code-2.23.0/src/klaude_code/web/display.py +21 -0
  224. klaude_code-2.23.0/src/klaude_code/web/dist/assets/abap-BdImnpbu.js +1 -0
  225. klaude_code-2.23.0/src/klaude_code/web/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  226. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ada-bCR0ucgS.js +1 -0
  227. klaude_code-2.23.0/src/klaude_code/web/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  228. klaude_code-2.23.0/src/klaude_code/web/dist/assets/angular-html-CU67Zn6k.js +1 -0
  229. klaude_code-2.23.0/src/klaude_code/web/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  230. klaude_code-2.23.0/src/klaude_code/web/dist/assets/apache-Pmp26Uib.js +1 -0
  231. klaude_code-2.23.0/src/klaude_code/web/dist/assets/apex-D8_7TLub.js +1 -0
  232. klaude_code-2.23.0/src/klaude_code/web/dist/assets/apl-dKokRX4l.js +1 -0
  233. klaude_code-2.23.0/src/klaude_code/web/dist/assets/applescript-Co6uUVPk.js +1 -0
  234. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ara-BRHolxvo.js +1 -0
  235. klaude_code-2.23.0/src/klaude_code/web/dist/assets/asciidoc-Ve4PFQV2.js +1 -0
  236. klaude_code-2.23.0/src/klaude_code/web/dist/assets/asm-D_Q5rh1f.js +1 -0
  237. klaude_code-2.23.0/src/klaude_code/web/dist/assets/astro-CbQHKStN.js +1 -0
  238. klaude_code-2.23.0/src/klaude_code/web/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  239. klaude_code-2.23.0/src/klaude_code/web/dist/assets/awk-DMzUqQB5.js +1 -0
  240. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
  241. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ayu-light-BA47KaF1.js +1 -0
  242. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
  243. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ballerina-BFfxhgS-.js +1 -0
  244. klaude_code-2.23.0/src/klaude_code/web/dist/assets/bat-BkioyH1T.js +1 -0
  245. klaude_code-2.23.0/src/klaude_code/web/dist/assets/beancount-k_qm7-4y.js +1 -0
  246. klaude_code-2.23.0/src/klaude_code/web/dist/assets/berry-uYugtg8r.js +1 -0
  247. klaude_code-2.23.0/src/klaude_code/web/dist/assets/bibtex-CHM0blh-.js +1 -0
  248. klaude_code-2.23.0/src/klaude_code/web/dist/assets/bicep-Bmn6On1c.js +1 -0
  249. klaude_code-2.23.0/src/klaude_code/web/dist/assets/bird2-DPOp833l.js +1 -0
  250. klaude_code-2.23.0/src/klaude_code/web/dist/assets/blade-D4QpJJKB.js +1 -0
  251. klaude_code-2.23.0/src/klaude_code/web/dist/assets/bsl-BO_Y6i37.js +1 -0
  252. klaude_code-2.23.0/src/klaude_code/web/dist/assets/c-BIGW1oBm.js +1 -0
  253. klaude_code-2.23.0/src/klaude_code/web/dist/assets/c3-eo99z4R2.js +1 -0
  254. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  255. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cairo-KRGpt6FW.js +1 -0
  256. klaude_code-2.23.0/src/klaude_code/web/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  257. klaude_code-2.23.0/src/klaude_code/web/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  258. klaude_code-2.23.0/src/klaude_code/web/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  259. klaude_code-2.23.0/src/klaude_code/web/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  260. klaude_code-2.23.0/src/klaude_code/web/dist/assets/clarity-D53aC0YG.js +1 -0
  261. klaude_code-2.23.0/src/klaude_code/web/dist/assets/clojure-P80f7IUj.js +1 -0
  262. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cmake-D1j8_8rp.js +1 -0
  263. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cobol-nwyudZeR.js +1 -0
  264. klaude_code-2.23.0/src/klaude_code/web/dist/assets/codeowners-Bp6g37R7.js +1 -0
  265. klaude_code-2.23.0/src/klaude_code/web/dist/assets/codeql-DsOJ9woJ.js +1 -0
  266. klaude_code-2.23.0/src/klaude_code/web/dist/assets/coffee-Ch7k5sss.js +1 -0
  267. klaude_code-2.23.0/src/klaude_code/web/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  268. klaude_code-2.23.0/src/klaude_code/web/dist/assets/coq-DkFqJrB1.js +1 -0
  269. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cpp-CofmeUqb.js +1 -0
  270. klaude_code-2.23.0/src/klaude_code/web/dist/assets/crystal-tKQVLTB8.js +1 -0
  271. klaude_code-2.23.0/src/klaude_code/web/dist/assets/csharp-COcwbKMJ.js +1 -0
  272. klaude_code-2.23.0/src/klaude_code/web/dist/assets/css-DPfMkruS.js +1 -0
  273. klaude_code-2.23.0/src/klaude_code/web/dist/assets/csv-fuZLfV_i.js +1 -0
  274. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cue-D82EKSYY.js +1 -0
  275. klaude_code-2.23.0/src/klaude_code/web/dist/assets/cypher-COkxafJQ.js +1 -0
  276. klaude_code-2.23.0/src/klaude_code/web/dist/assets/d-85-TOEBH.js +1 -0
  277. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  278. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dart-CF10PKvl.js +1 -0
  279. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dax-CEL-wOlO.js +1 -0
  280. klaude_code-2.23.0/src/klaude_code/web/dist/assets/desktop-BmXAJ9_W.js +1 -0
  281. klaude_code-2.23.0/src/klaude_code/web/dist/assets/diff-D97Zzqfu.js +1 -0
  282. klaude_code-2.23.0/src/klaude_code/web/dist/assets/docker-BcOcwvcX.js +1 -0
  283. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dotenv-Da5cRb03.js +1 -0
  284. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dracula-BzJJZx-M.js +1 -0
  285. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  286. klaude_code-2.23.0/src/klaude_code/web/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  287. klaude_code-2.23.0/src/klaude_code/web/dist/assets/edge-BkV0erSs.js +1 -0
  288. klaude_code-2.23.0/src/klaude_code/web/dist/assets/elixir-CDX3lj18.js +1 -0
  289. klaude_code-2.23.0/src/klaude_code/web/dist/assets/elm-DbKCFpqz.js +1 -0
  290. klaude_code-2.23.0/src/klaude_code/web/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  291. klaude_code-2.23.0/src/klaude_code/web/dist/assets/erb-B12qg9BL.js +1 -0
  292. klaude_code-2.23.0/src/klaude_code/web/dist/assets/erlang-DsQrWhSR.js +1 -0
  293. klaude_code-2.23.0/src/klaude_code/web/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  294. klaude_code-2.23.0/src/klaude_code/web/dist/assets/everforest-light-C8M2exoo.js +1 -0
  295. klaude_code-2.23.0/src/klaude_code/web/dist/assets/fennel-BYunw83y.js +1 -0
  296. klaude_code-2.23.0/src/klaude_code/web/dist/assets/fish-BvzEVeQv.js +1 -0
  297. klaude_code-2.23.0/src/klaude_code/web/dist/assets/fluent-C4IJs8-o.js +1 -0
  298. klaude_code-2.23.0/src/klaude_code/web/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  299. klaude_code-2.23.0/src/klaude_code/web/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  300. klaude_code-2.23.0/src/klaude_code/web/dist/assets/fsharp-CXgrBDvD.js +1 -0
  301. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gdresource-BOOCDP_w.js +1 -0
  302. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  303. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gdshader-DkwncUOv.js +1 -0
  304. klaude_code-2.23.0/src/klaude_code/web/dist/assets/genie-D0YGMca9.js +1 -0
  305. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gherkin-DyxjwDmM.js +1 -0
  306. klaude_code-2.23.0/src/klaude_code/web/dist/assets/git-commit-F4YmCXRG.js +1 -0
  307. klaude_code-2.23.0/src/klaude_code/web/dist/assets/git-rebase-r7XF79zn.js +1 -0
  308. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-dark-DHJKELXO.js +1 -0
  309. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  310. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  311. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  312. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-light-DAi9KRSo.js +1 -0
  313. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  314. klaude_code-2.23.0/src/klaude_code/web/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  315. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gleam-BspZqrRM.js +1 -0
  316. klaude_code-2.23.0/src/klaude_code/web/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  317. klaude_code-2.23.0/src/klaude_code/web/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  318. klaude_code-2.23.0/src/klaude_code/web/dist/assets/glsl-DplSGwfg.js +1 -0
  319. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gn-n2N0HUVH.js +1 -0
  320. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gnuplot-DdkO51Og.js +1 -0
  321. klaude_code-2.23.0/src/klaude_code/web/dist/assets/go-CxLEBnE3.js +1 -0
  322. klaude_code-2.23.0/src/klaude_code/web/dist/assets/graphql-ChdNCCLP.js +1 -0
  323. klaude_code-2.23.0/src/klaude_code/web/dist/assets/groovy-gcz8RCvz.js +1 -0
  324. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  325. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  326. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  327. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  328. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  329. klaude_code-2.23.0/src/klaude_code/web/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  330. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hack-CaT9iCJl.js +1 -0
  331. klaude_code-2.23.0/src/klaude_code/web/dist/assets/haml-B8DHNrY2.js +1 -0
  332. klaude_code-2.23.0/src/klaude_code/web/dist/assets/handlebars-BL8al0AC.js +1 -0
  333. klaude_code-2.23.0/src/klaude_code/web/dist/assets/haskell-Df6bDoY_.js +1 -0
  334. klaude_code-2.23.0/src/klaude_code/web/dist/assets/haxe-CzTSHFRz.js +1 -0
  335. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hcl-BWvSN4gD.js +1 -0
  336. klaude_code-2.23.0/src/klaude_code/web/dist/assets/highlighted-body-B3W2YXNL-OfBXblVk.js +1 -0
  337. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hjson-D5-asLiD.js +1 -0
  338. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hlsl-D3lLCCz7.js +1 -0
  339. klaude_code-2.23.0/src/klaude_code/web/dist/assets/horizon-BUw7H-hv.js +1 -0
  340. klaude_code-2.23.0/src/klaude_code/web/dist/assets/horizon-bright-Cn-bp-IR.js +1 -0
  341. klaude_code-2.23.0/src/klaude_code/web/dist/assets/houston-DnULxvSX.js +1 -0
  342. klaude_code-2.23.0/src/klaude_code/web/dist/assets/html-GMplVEZG.js +1 -0
  343. klaude_code-2.23.0/src/klaude_code/web/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  344. klaude_code-2.23.0/src/klaude_code/web/dist/assets/http-jrhK8wxY.js +1 -0
  345. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hurl-irOxFIW8.js +1 -0
  346. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  347. klaude_code-2.23.0/src/klaude_code/web/dist/assets/hy-DFXneXwc.js +1 -0
  348. klaude_code-2.23.0/src/klaude_code/web/dist/assets/imba-DGztddWO.js +1 -0
  349. klaude_code-2.23.0/src/klaude_code/web/dist/assets/index-B7rfFyoU.js +1790 -0
  350. klaude_code-2.23.0/src/klaude_code/web/dist/assets/index-SQlcC1zl.css +1 -0
  351. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ini-BEwlwnbL.js +1 -0
  352. klaude_code-2.23.0/src/klaude_code/web/dist/assets/java-CylS5w8V.js +1 -0
  353. klaude_code-2.23.0/src/klaude_code/web/dist/assets/javascript-wDzz0qaB.js +1 -0
  354. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  355. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jison-wvAkD_A8.js +1 -0
  356. klaude_code-2.23.0/src/klaude_code/web/dist/assets/json-Cp-IABpG.js +1 -0
  357. klaude_code-2.23.0/src/klaude_code/web/dist/assets/json5-C9tS-k6U.js +1 -0
  358. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jsonc-Des-eS-w.js +1 -0
  359. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jsonl-DcaNXYhu.js +1 -0
  360. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jsonnet-DFQXde-d.js +1 -0
  361. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jssm-C2t-YnRu.js +1 -0
  362. klaude_code-2.23.0/src/klaude_code/web/dist/assets/jsx-g9-lgVsj.js +1 -0
  363. klaude_code-2.23.0/src/klaude_code/web/dist/assets/julia-CxzCAyBv.js +1 -0
  364. klaude_code-2.23.0/src/klaude_code/web/dist/assets/just-Cw27pwNe.js +1 -0
  365. klaude_code-2.23.0/src/klaude_code/web/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  366. klaude_code-2.23.0/src/klaude_code/web/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  367. klaude_code-2.23.0/src/klaude_code/web/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  368. klaude_code-2.23.0/src/klaude_code/web/dist/assets/kdl-DV7GczEv.js +1 -0
  369. klaude_code-2.23.0/src/klaude_code/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
  370. klaude_code-2.23.0/src/klaude_code/web/dist/assets/kusto-DZf3V79B.js +1 -0
  371. klaude_code-2.23.0/src/klaude_code/web/dist/assets/laserwave-DUszq2jm.js +1 -0
  372. klaude_code-2.23.0/src/klaude_code/web/dist/assets/latex-CWtU0Tv5.js +1 -0
  373. klaude_code-2.23.0/src/klaude_code/web/dist/assets/lean-BZvkOJ9d.js +1 -0
  374. klaude_code-2.23.0/src/klaude_code/web/dist/assets/less-B1dDrJ26.js +1 -0
  375. klaude_code-2.23.0/src/klaude_code/web/dist/assets/light-plus-B7mTdjB0.js +1 -0
  376. klaude_code-2.23.0/src/klaude_code/web/dist/assets/liquid-DYVedYrR.js +1 -0
  377. klaude_code-2.23.0/src/klaude_code/web/dist/assets/llvm-DjAJT7YJ.js +1 -0
  378. klaude_code-2.23.0/src/klaude_code/web/dist/assets/log-2UxHyX5q.js +1 -0
  379. klaude_code-2.23.0/src/klaude_code/web/dist/assets/logo-BtOb2qkB.js +1 -0
  380. klaude_code-2.23.0/src/klaude_code/web/dist/assets/lua-BaeVxFsk.js +1 -0
  381. klaude_code-2.23.0/src/klaude_code/web/dist/assets/luau-C-HG3fhB.js +1 -0
  382. klaude_code-2.23.0/src/klaude_code/web/dist/assets/make-CHLpvVh8.js +1 -0
  383. klaude_code-2.23.0/src/klaude_code/web/dist/assets/markdown-Cvjx9yec.js +1 -0
  384. klaude_code-2.23.0/src/klaude_code/web/dist/assets/marko-CnJfTvn9.js +1 -0
  385. klaude_code-2.23.0/src/klaude_code/web/dist/assets/material-theme-D5KoaKCx.js +1 -0
  386. klaude_code-2.23.0/src/klaude_code/web/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  387. klaude_code-2.23.0/src/klaude_code/web/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  388. klaude_code-2.23.0/src/klaude_code/web/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  389. klaude_code-2.23.0/src/klaude_code/web/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  390. klaude_code-2.23.0/src/klaude_code/web/dist/assets/matlab-D7o27uSR.js +1 -0
  391. klaude_code-2.23.0/src/klaude_code/web/dist/assets/mdc-BMNejdWA.js +1 -0
  392. klaude_code-2.23.0/src/klaude_code/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  393. klaude_code-2.23.0/src/klaude_code/web/dist/assets/mermaid-mWjccvbQ.js +1 -0
  394. klaude_code-2.23.0/src/klaude_code/web/dist/assets/min-dark-CafNBF8u.js +1 -0
  395. klaude_code-2.23.0/src/klaude_code/web/dist/assets/min-light-CTRr51gU.js +1 -0
  396. klaude_code-2.23.0/src/klaude_code/web/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  397. klaude_code-2.23.0/src/klaude_code/web/dist/assets/mojo-rZm6bMo-.js +1 -0
  398. klaude_code-2.23.0/src/klaude_code/web/dist/assets/monokai-D4h5O-jR.js +1 -0
  399. klaude_code-2.23.0/src/klaude_code/web/dist/assets/moonbit-_H4v1dQx.js +1 -0
  400. klaude_code-2.23.0/src/klaude_code/web/dist/assets/move-IF9eRakj.js +1 -0
  401. klaude_code-2.23.0/src/klaude_code/web/dist/assets/narrat-DRg8JJMk.js +1 -0
  402. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nextflow-Zz6hmt5N.js +1 -0
  403. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  404. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nginx-BpAMiNFr.js +1 -0
  405. klaude_code-2.23.0/src/klaude_code/web/dist/assets/night-owl-C39BiMTA.js +1 -0
  406. klaude_code-2.23.0/src/klaude_code/web/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  407. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nim-CVrawwO9.js +1 -0
  408. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nix-CwoSXNpI.js +1 -0
  409. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nord-Ddv68eIx.js +1 -0
  410. klaude_code-2.23.0/src/klaude_code/web/dist/assets/nushell-Cz2AlsmD.js +1 -0
  411. klaude_code-2.23.0/src/klaude_code/web/dist/assets/objective-c-DXmwc3jG.js +1 -0
  412. klaude_code-2.23.0/src/klaude_code/web/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  413. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ocaml-C0hk2d4L.js +1 -0
  414. klaude_code-2.23.0/src/klaude_code/web/dist/assets/odin-BBf5iR-q.js +1 -0
  415. klaude_code-2.23.0/src/klaude_code/web/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  416. klaude_code-2.23.0/src/klaude_code/web/dist/assets/one-light-C3Wv6jpd.js +1 -0
  417. klaude_code-2.23.0/src/klaude_code/web/dist/assets/openscad-C4EeE6gA.js +1 -0
  418. klaude_code-2.23.0/src/klaude_code/web/dist/assets/pascal-D93ZcfNL.js +1 -0
  419. klaude_code-2.23.0/src/klaude_code/web/dist/assets/perl-C0TMdlhV.js +1 -0
  420. klaude_code-2.23.0/src/klaude_code/web/dist/assets/php-Dhbhpdrm.js +1 -0
  421. klaude_code-2.23.0/src/klaude_code/web/dist/assets/pierre-dark-BXuwtOqb.js +1 -0
  422. klaude_code-2.23.0/src/klaude_code/web/dist/assets/pierre-light-dckrK0oj.js +1 -0
  423. klaude_code-2.23.0/src/klaude_code/web/dist/assets/pkl-u5AG7uiY.js +1 -0
  424. klaude_code-2.23.0/src/klaude_code/web/dist/assets/plastic-3e1v2bzS.js +1 -0
  425. klaude_code-2.23.0/src/klaude_code/web/dist/assets/plsql-ChMvpjG-.js +1 -0
  426. klaude_code-2.23.0/src/klaude_code/web/dist/assets/po-BTJTHyun.js +1 -0
  427. klaude_code-2.23.0/src/klaude_code/web/dist/assets/poimandres-CS3Unz2-.js +1 -0
  428. klaude_code-2.23.0/src/klaude_code/web/dist/assets/polar-C0HS_06l.js +1 -0
  429. klaude_code-2.23.0/src/klaude_code/web/dist/assets/postcss-CXtECtnM.js +1 -0
  430. klaude_code-2.23.0/src/klaude_code/web/dist/assets/powerquery-CEu0bR-o.js +1 -0
  431. klaude_code-2.23.0/src/klaude_code/web/dist/assets/powershell-Dpen1YoG.js +1 -0
  432. klaude_code-2.23.0/src/klaude_code/web/dist/assets/prisma-Dd19v3D-.js +1 -0
  433. klaude_code-2.23.0/src/klaude_code/web/dist/assets/prolog-CbFg5uaA.js +1 -0
  434. klaude_code-2.23.0/src/klaude_code/web/dist/assets/proto-C7zT0LnQ.js +1 -0
  435. klaude_code-2.23.0/src/klaude_code/web/dist/assets/pug-CGlum2m_.js +1 -0
  436. klaude_code-2.23.0/src/klaude_code/web/dist/assets/puppet-BMWR74SV.js +1 -0
  437. klaude_code-2.23.0/src/klaude_code/web/dist/assets/purescript-CklMAg4u.js +1 -0
  438. klaude_code-2.23.0/src/klaude_code/web/dist/assets/python-B6aJPvgy.js +1 -0
  439. klaude_code-2.23.0/src/klaude_code/web/dist/assets/qml-3beO22l8.js +1 -0
  440. klaude_code-2.23.0/src/klaude_code/web/dist/assets/qmldir-C8lEn-DE.js +1 -0
  441. klaude_code-2.23.0/src/klaude_code/web/dist/assets/qss-IeuSbFQv.js +1 -0
  442. klaude_code-2.23.0/src/klaude_code/web/dist/assets/r-Dspwwk_N.js +1 -0
  443. klaude_code-2.23.0/src/klaude_code/web/dist/assets/racket-BqYA7rlc.js +1 -0
  444. klaude_code-2.23.0/src/klaude_code/web/dist/assets/raku-DXvB9xmW.js +1 -0
  445. klaude_code-2.23.0/src/klaude_code/web/dist/assets/razor-Uh8Bk_45.js +1 -0
  446. klaude_code-2.23.0/src/klaude_code/web/dist/assets/red-bN70gL4F.js +1 -0
  447. klaude_code-2.23.0/src/klaude_code/web/dist/assets/reg-C-SQnVFl.js +1 -0
  448. klaude_code-2.23.0/src/klaude_code/web/dist/assets/regexp-CDVJQ6XC.js +1 -0
  449. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rel-C3B-1QV4.js +1 -0
  450. klaude_code-2.23.0/src/klaude_code/web/dist/assets/riscv-BM1_JUlF.js +1 -0
  451. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ron-D8l8udqQ.js +1 -0
  452. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  453. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  454. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  455. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  456. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rst-BrH8l1NY.js +1 -0
  457. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ruby-Dw2BHqvy.js +1 -0
  458. klaude_code-2.23.0/src/klaude_code/web/dist/assets/rust-B1yitclQ.js +1 -0
  459. klaude_code-2.23.0/src/klaude_code/web/dist/assets/sas-cz2c8ADy.js +1 -0
  460. klaude_code-2.23.0/src/klaude_code/web/dist/assets/sass-Cj5Yp3dK.js +1 -0
  461. klaude_code-2.23.0/src/klaude_code/web/dist/assets/scala-C151Ov-r.js +1 -0
  462. klaude_code-2.23.0/src/klaude_code/web/dist/assets/scheme-C98Dy4si.js +1 -0
  463. klaude_code-2.23.0/src/klaude_code/web/dist/assets/scss-OYdSNvt2.js +1 -0
  464. klaude_code-2.23.0/src/klaude_code/web/dist/assets/sdbl-DVxCFoDh.js +1 -0
  465. klaude_code-2.23.0/src/klaude_code/web/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  466. klaude_code-2.23.0/src/klaude_code/web/dist/assets/shellscript-Yzrsuije.js +1 -0
  467. klaude_code-2.23.0/src/klaude_code/web/dist/assets/shellsession-BADoaaVG.js +1 -0
  468. klaude_code-2.23.0/src/klaude_code/web/dist/assets/slack-dark-BthQWCQV.js +1 -0
  469. klaude_code-2.23.0/src/klaude_code/web/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  470. klaude_code-2.23.0/src/klaude_code/web/dist/assets/smalltalk-BERRCDM3.js +1 -0
  471. klaude_code-2.23.0/src/klaude_code/web/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  472. klaude_code-2.23.0/src/klaude_code/web/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  473. klaude_code-2.23.0/src/klaude_code/web/dist/assets/solarized-light-L9t79GZl.js +1 -0
  474. klaude_code-2.23.0/src/klaude_code/web/dist/assets/solidity-rGO070M0.js +1 -0
  475. klaude_code-2.23.0/src/klaude_code/web/dist/assets/soy-Brmx7dQM.js +1 -0
  476. klaude_code-2.23.0/src/klaude_code/web/dist/assets/sparql-rVzFXLq3.js +1 -0
  477. klaude_code-2.23.0/src/klaude_code/web/dist/assets/splunk-BtCnVYZw.js +1 -0
  478. klaude_code-2.23.0/src/klaude_code/web/dist/assets/sql-BLtJtn59.js +1 -0
  479. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  480. klaude_code-2.23.0/src/klaude_code/web/dist/assets/stata-BH5u7GGu.js +1 -0
  481. klaude_code-2.23.0/src/klaude_code/web/dist/assets/stylus-BEDo0Tqx.js +1 -0
  482. klaude_code-2.23.0/src/klaude_code/web/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  483. klaude_code-2.23.0/src/klaude_code/web/dist/assets/svelte-C_ipcX3V.js +1 -0
  484. klaude_code-2.23.0/src/klaude_code/web/dist/assets/swift-D82vCrfD.js +1 -0
  485. klaude_code-2.23.0/src/klaude_code/web/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  486. klaude_code-2.23.0/src/klaude_code/web/dist/assets/system-verilog-CnnmHF94.js +1 -0
  487. klaude_code-2.23.0/src/klaude_code/web/dist/assets/systemd-4A_iFExJ.js +1 -0
  488. klaude_code-2.23.0/src/klaude_code/web/dist/assets/talonscript-CkByrt1z.js +1 -0
  489. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tasl-QIJgUcNo.js +1 -0
  490. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tcl-dwOrl1Do.js +1 -0
  491. klaude_code-2.23.0/src/klaude_code/web/dist/assets/templ-P3uqSqPl.js +1 -0
  492. klaude_code-2.23.0/src/klaude_code/web/dist/assets/terraform-BETggiCN.js +1 -0
  493. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tex-idrVyKtj.js +1 -0
  494. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tokyo-night-hegEt444.js +1 -0
  495. klaude_code-2.23.0/src/klaude_code/web/dist/assets/toml-vGWfd6FD.js +1 -0
  496. klaude_code-2.23.0/src/klaude_code/web/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  497. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tsv-B_m7g4N7.js +1 -0
  498. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tsx-COt5Ahok.js +1 -0
  499. klaude_code-2.23.0/src/klaude_code/web/dist/assets/turtle-BsS91CYL.js +1 -0
  500. klaude_code-2.23.0/src/klaude_code/web/dist/assets/twig-DNn4PbVi.js +1 -0
  501. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tx-02-DbvgyCYI.woff2 +0 -0
  502. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tx-02-bold-CqgdGFuf.otf +0 -0
  503. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tx-02-bold-italic-CT94kmNX.otf +0 -0
  504. klaude_code-2.23.0/src/klaude_code/web/dist/assets/tx-02-italic-Cz7l_g8k.otf +0 -0
  505. klaude_code-2.23.0/src/klaude_code/web/dist/assets/typescript-BPQ3VLAy.js +1 -0
  506. klaude_code-2.23.0/src/klaude_code/web/dist/assets/typespec-BGHnOYBU.js +1 -0
  507. klaude_code-2.23.0/src/klaude_code/web/dist/assets/typst-DHCkPAjA.js +1 -0
  508. klaude_code-2.23.0/src/klaude_code/web/dist/assets/v-BcVCzyr7.js +1 -0
  509. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vala-CsfeWuGM.js +1 -0
  510. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vb-D17OF-Vu.js +1 -0
  511. klaude_code-2.23.0/src/klaude_code/web/dist/assets/verilog-BQ8w6xss.js +1 -0
  512. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vesper-DU1UobuO.js +1 -0
  513. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  514. klaude_code-2.23.0/src/klaude_code/web/dist/assets/viml-CJc9bBzg.js +1 -0
  515. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  516. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  517. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  518. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vue-DN_0RTcg.js +1 -0
  519. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  520. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  521. klaude_code-2.23.0/src/klaude_code/web/dist/assets/vyper-CDx5xZoG.js +1 -0
  522. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wasm-CG6Dc4jp.js +1 -0
  523. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wasm-MzD3tlZU.js +1 -0
  524. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wenyan-BV7otONQ.js +1 -0
  525. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  526. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wikitext-BhOHFoWU.js +1 -0
  527. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wit-5i3qLPDT.js +1 -0
  528. klaude_code-2.23.0/src/klaude_code/web/dist/assets/wolfram-lXgVvXCa.js +1 -0
  529. klaude_code-2.23.0/src/klaude_code/web/dist/assets/xml-sdJ4AIDG.js +1 -0
  530. klaude_code-2.23.0/src/klaude_code/web/dist/assets/xsl-CtQFsRM5.js +1 -0
  531. klaude_code-2.23.0/src/klaude_code/web/dist/assets/yaml-Buea-lGh.js +1 -0
  532. klaude_code-2.23.0/src/klaude_code/web/dist/assets/zenscript-DVFEvuxE.js +1 -0
  533. klaude_code-2.23.0/src/klaude_code/web/dist/assets/zig-VOosw3JB.js +1 -0
  534. klaude_code-2.23.0/src/klaude_code/web/dist/favicon.svg +4 -0
  535. klaude_code-2.23.0/src/klaude_code/web/dist/index.html +20 -0
  536. klaude_code-2.23.0/src/klaude_code/web/file_access.py +51 -0
  537. klaude_code-2.23.0/src/klaude_code/web/interaction.py +56 -0
  538. klaude_code-2.23.0/src/klaude_code/web/live_events.py +51 -0
  539. klaude_code-2.23.0/src/klaude_code/web/routes/__init__.py +6 -0
  540. klaude_code-2.23.0/src/klaude_code/web/routes/config.py +27 -0
  541. klaude_code-2.23.0/src/klaude_code/web/routes/files.py +27 -0
  542. klaude_code-2.23.0/src/klaude_code/web/routes/sessions.py +369 -0
  543. klaude_code-2.23.0/src/klaude_code/web/routes/ws.py +415 -0
  544. klaude_code-2.23.0/src/klaude_code/web/server.py +167 -0
  545. klaude_code-2.23.0/src/klaude_code/web/session_access.py +51 -0
  546. klaude_code-2.23.0/src/klaude_code/web/session_index.py +273 -0
  547. klaude_code-2.23.0/src/klaude_code/web/state.py +39 -0
  548. klaude_code-2.21.0/src/klaude_code/app/runtime.py +0 -184
  549. klaude_code-2.21.0/src/klaude_code/auth/copilot/token_manager.py +0 -27
  550. klaude_code-2.21.0/src/klaude_code/cli/list_model.py +0 -589
  551. klaude_code-2.21.0/src/klaude_code/core/executor.py +0 -1042
  552. klaude_code-2.21.0/src/klaude_code/core/manager/__init__.py +0 -17
  553. klaude_code-2.21.0/src/klaude_code/core/manager/llm_clients.py +0 -42
  554. klaude_code-2.21.0/src/klaude_code/core/manager/llm_clients_builder.py +0 -78
  555. klaude_code-2.21.0/src/klaude_code/core/tool/shell/bash_tool.md +0 -1
  556. klaude_code-2.21.0/src/klaude_code/llm/image.py +0 -67
  557. klaude_code-2.21.0/src/klaude_code/protocol/sub_agent/AGENTS.md +0 -19
  558. klaude_code-2.21.0/src/klaude_code/skill/assets/.DS_Store +0 -0
  559. klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/.DS_Store +0 -0
  560. klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/scripts/render_mermaid.js +0 -182
  561. klaude_code-2.21.0/src/klaude_code/tui/command/debug_cmd.py +0 -42
  562. klaude_code-2.21.0/src/klaude_code/tui/command/export_online_cmd.py +0 -150
  563. klaude_code-2.21.0/src/klaude_code/tui/command/model_cmd.py +0 -55
  564. klaude_code-2.21.0/src/klaude_code/tui/command/prompt-init.md +0 -45
  565. klaude_code-2.21.0/src/klaude_code/tui/command/prompt_command.py +0 -78
  566. klaude_code-2.21.0/src/klaude_code/tui/command/status_cmd.py +0 -152
  567. klaude_code-2.21.0/src/klaude_code/tui/command/sub_agent_model_cmd.py +0 -238
  568. klaude_code-2.21.0/src/klaude_code/tui/command/thinking_cmd.py +0 -85
  569. klaude_code-2.21.0/src/klaude_code/tui/components/command_output.py +0 -97
  570. klaude_code-2.21.0/src/klaude_code/tui/runner.py +0 -338
  571. klaude_code-2.21.0/src/klaude_code/ui/__init__.py +0 -16
  572. klaude_code-2.21.0/src/klaude_code/ui/core/__init__.py +0 -1
  573. klaude_code-2.21.0/src/klaude_code/ui/core/display.py +0 -103
  574. klaude_code-2.21.0/src/klaude_code/ui/core/input.py +0 -72
  575. klaude_code-2.21.0/src/klaude_code/ui/terminal/__init__.py +0 -8
  576. klaude_code-2.21.0/src/klaude_code/ui/terminal/title.py +0 -38
  577. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/.DS_Store +0 -0
  578. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/__init__.py +0 -0
  579. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/AGENTS.md +0 -0
  580. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/__init__.py +0 -0
  581. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/base.py +0 -0
  582. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/claude/__init__.py +0 -0
  583. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/claude/exceptions.py +0 -0
  584. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/claude/oauth.py +0 -0
  585. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/claude/token_manager.py +0 -0
  586. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/codex/__init__.py +0 -0
  587. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/codex/exceptions.py +0 -0
  588. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  589. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/codex/oauth.py +0 -0
  590. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/codex/token_manager.py +0 -0
  591. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/copilot/__init__.py +0 -0
  592. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/copilot/exceptions.py +0 -0
  593. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/auth/env.py +0 -0
  594. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/__init__.py +0 -0
  595. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/debug.py +0 -0
  596. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/cli/self_update.py +0 -0
  597. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/assets/__init__.py +0 -0
  598. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/config/model_matcher.py +0 -0
  599. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/__init__.py +0 -0
  600. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/bash_mode.py +0 -0
  601. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/compaction/AGENTS.md +0 -0
  602. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/compaction/__init__.py +0 -0
  603. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/compaction/overflow.py +0 -0
  604. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/compaction/prompts.py +0 -0
  605. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/loaded_skills.py +0 -0
  606. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/prompts/auto-memory-prompt.md +0 -0
  607. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  608. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  609. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/rewind/__init__.py +0 -0
  610. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/rewind/manager.py +0 -0
  611. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/__init__.py +0 -0
  612. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/_utils.py +0 -0
  613. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  614. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  615. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  616. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  617. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  618. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/offload.py +0 -0
  619. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  620. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/rewind_tool.py +0 -0
  621. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  622. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  623. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  624. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  625. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  626. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  627. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/tool_abc.py +0 -0
  628. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/tool_registry.py +0 -0
  629. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/__init__.py +0 -0
  630. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/external_content.py +0 -0
  631. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/ssrf.py +0 -0
  632. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/web_cache.py +0 -0
  633. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  634. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  635. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  636. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/__init__.py +0 -0
  637. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  638. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/bedrock_anthropic/__init__.py +0 -0
  639. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/claude/__init__.py +0 -0
  640. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/client.py +0 -0
  641. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/copilot/__init__.py +0 -0
  642. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/google/__init__.py +0 -0
  643. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/google_vertex/__init__.py +0 -0
  644. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/json_stable.py +0 -0
  645. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_codex/__init__.py +0 -0
  646. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  647. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  648. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openai_responses/__init__.py +0 -0
  649. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  650. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/partial_message.py +0 -0
  651. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/llm/usage.py +0 -0
  652. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  653. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/__init__.py +0 -0
  654. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/session/templates/export_session.html +0 -0
  655. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/.DS_Store +0 -0
  656. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/__init__.py +0 -0
  657. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  658. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/executing-plans/SKILL.md +0 -0
  659. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/frontend-design/SKILL.md +0 -0
  660. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/LICENSE.txt +0 -0
  661. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/SKILL.md +0 -0
  662. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/references/cli.md +0 -0
  663. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/references/codex-network.md +0 -0
  664. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/references/image-api.md +0 -0
  665. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/references/prompting.md +0 -0
  666. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/references/sample-prompts.md +0 -0
  667. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/gpt-image-gen/scripts/image_gen.py +0 -0
  668. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/nano-banana-image-gen/references/vertex-setup.md +0 -0
  669. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/SKILL.md +0 -0
  670. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/forms.md +0 -0
  671. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/reference.md +0 -0
  672. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/check_bounding_boxes.py +0 -0
  673. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/check_fillable_fields.py +0 -0
  674. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/convert_pdf_to_images.py +0 -0
  675. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/create_validation_image.py +0 -0
  676. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/extract_form_field_info.py +0 -0
  677. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/extract_form_structure.py +0 -0
  678. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/fill_fillable_fields.py +0 -0
  679. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/pdf/scripts/fill_pdf_form_with_annotations.py +0 -0
  680. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/render-mermaid/.gitignore +0 -0
  681. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/render-mermaid/bun.lock +0 -0
  682. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/render-mermaid/package.json +0 -0
  683. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/session-logs/SKILL.md +0 -0
  684. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  685. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/web-search/SKILL.md +0 -0
  686. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/assets/writing-plans/SKILL.md +0 -0
  687. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/manager.py +0 -0
  688. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/skill/system_skills.py +0 -0
  689. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/command/model_picker.py +0 -0
  690. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/__init__.py +0 -0
  691. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/bash_syntax.py +0 -0
  692. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/common.py +0 -0
  693. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/diffs.py +0 -0
  694. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/errors.py +0 -0
  695. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/__init__.py +0 -0
  696. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/cjk_wrap.py +0 -0
  697. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/code_panel.py +0 -0
  698. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/live.py +0 -0
  699. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/rich/quote.py +0 -0
  700. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/sub_agent.py +0 -0
  701. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/thinking.py +0 -0
  702. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/components/user_input.py +0 -0
  703. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/AGENTS.md +0 -0
  704. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/__init__.py +0 -0
  705. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/drag_drop.py +0 -0
  706. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/input/paste.py +0 -0
  707. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/__init__.py +0 -0
  708. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/color.py +0 -0
  709. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/image.py +0 -0
  710. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/tui/terminal/progress_bar.py +0 -0
  711. {klaude_code-2.21.0 → klaude_code-2.23.0}/src/klaude_code/update.py +0 -0
@@ -1,22 +1,24 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 2.21.0
3
+ Version: 2.23.0
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0,<6
7
- Requires-Dist: ddgs>=9.9.3
8
7
  Requires-Dist: diff-match-patch>=20241021
9
8
  Requires-Dist: filelock>=3.20.3
9
+ Requires-Dist: fastapi
10
10
  Requires-Dist: google-genai>=1.56.0
11
11
  Requires-Dist: markdown-it-py>=4.0.0
12
- Requires-Dist: openai>=1.102.0
12
+ Requires-Dist: openai>=2.24.0
13
13
  Requires-Dist: prompt-toolkit>=3.0.52
14
14
  Requires-Dist: pydantic>=2.11.7
15
15
  Requires-Dist: python-socks>=2.8.1
16
16
  Requires-Dist: pyyaml>=6.0.2
17
17
  Requires-Dist: rich>=14.1.0
18
+ Requires-Dist: sse-starlette
18
19
  Requires-Dist: trafilatura>=2.0.0
19
20
  Requires-Dist: typer>=0.17.3
21
+ Requires-Dist: uvicorn
20
22
  Requires-Python: >=3.13
21
23
  Description-Content-Type: text/markdown
22
24
 
@@ -29,7 +31,7 @@ Minimal code agent CLI.
29
31
  - **Keep reasoning item in context**: Interleaved thinking support
30
32
  - **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
31
33
  - **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
32
- - **Sub-agents**: Task, Explore, Web
34
+ - **Sub-agents**: Task, Explore
33
35
  - **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
34
36
  - **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
35
37
  - **External file sync**: Monitoring for external edits (linter, manual)
@@ -96,7 +98,8 @@ export OPENAI_API_KEY=sk-xxx # GPT models
96
98
  export OPENROUTER_API_KEY=sk-or-xxx # OpenRouter (multi-provider)
97
99
  export DEEPSEEK_API_KEY=sk-xxx # DeepSeek models
98
100
  export MOONSHOT_API_KEY=sk-xxx # Moonshot/Kimi models
99
- export BRAVE_API_KEY=BSA-xxx # Brave Search (optional, enhances web search)
101
+ export BRAVE_API_KEY=BSA-xxx # Brave Search (optional, WebSearch provider)
102
+ export EXA_API_KEY=exa-xxx # Exa Search (optional, WebSearch provider)
100
103
 
101
104
  # Then just run:
102
105
  klaude
@@ -104,16 +107,39 @@ klaude
104
107
 
105
108
  On first run, you'll be prompted to select a model. Your choice is saved as `main_model`.
106
109
 
110
+ You can also configure fallback lists for helper models:
111
+
112
+ ```yaml
113
+ fast_model:
114
+ - haiku
115
+ - gemini-flash
116
+ - gpt-5-nano
117
+
118
+ compact_model:
119
+ - gemini-flash
120
+ - haiku
121
+ ```
122
+
123
+ Klaude tries these entries in order and uses the first available model. `fast_model` is used for session-title generation; `compact_model` is used for compact/helper tasks.
124
+
107
125
  #### Built-in Providers
108
126
 
109
- | Provider | Env Variable | Models |
110
- |-------------|-----------------------|-------------------------------------------------------------------------------|
111
- | anthropic | `ANTHROPIC_API_KEY` | sonnet, opus |
112
- | openai | `OPENAI_API_KEY` | gpt-5.2 |
113
- | openrouter | `OPENROUTER_API_KEY` | gpt-5.2, gpt-5.2-fast, gpt-5.1-codex-max, sonnet, opus, haiku, kimi, gemini-* |
114
- | deepseek | `DEEPSEEK_API_KEY` | deepseek |
115
- | moonshot | `MOONSHOT_API_KEY` | kimi@moonshot |
116
- | codex | N/A (OAuth) | gpt-5.2-codex (requires ChatGPT Pro subscription) |
127
+ | Provider | Env Variable | Models |
128
+ |------------------|------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
129
+ | anthropic | `ANTHROPIC_API_KEY` | sonnet, sonnet-no-thinking, opus, haiku |
130
+ | openai | `OPENAI_API_KEY` | gpt-5.4-high, gpt-5.4-xhigh, gpt-5.3-codex, gpt-5.3-codex-xhigh |
131
+ | openrouter | `OPENROUTER_API_KEY` | gpt-5.3-codex, gpt-5.3-codex-xhigh, gpt-5.4-high, gpt-5.4-xhigh, kimi, haiku, sonnet, sonnet-no-thinking, opus, gemini-pro, gemini-flash, grok, minimax, glm |
132
+ | google | `GOOGLE_API_KEY` or `GEMINI_API_KEY` | gemini-pro, gemini-flash |
133
+ | google-vertex | `GOOGLE_APPLICATION_CREDENTIALS`, `GOOGLE_CLOUD_PROJECT`, `GOOGLE_CLOUD_LOCATION` | gemini-pro, gemini-flash |
134
+ | bedrock | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION` | sonnet |
135
+ | deepseek | `DEEPSEEK_API_KEY` | deepseek |
136
+ | moonshot | `MOONSHOT_API_KEY` | kimi |
137
+ | cerebras | `CEREBRAS_API_KEY` | glm |
138
+ | claude-max | N/A (OAuth) | sonnet, sonnet-no-thinking, opus, haiku |
139
+ | codex | N/A (OAuth) | gpt-5.3-codex, gpt-5.3-codex-xhigh, gpt-5.4-high, gpt-5.4-xhigh |
140
+ | github-copilot | N/A (OAuth) | gpt-5.3-codex, gpt-5.3-codex-xhigh, gpt-5.4-high, gpt-5.4-xhigh, sonnet, sonnet-4.5, haiku, opus |
141
+ | ark-api | `ARK_API_KEY` | seed-pro, seed-code |
142
+ | ark-coding-plan | `ARK_API_KEY` | seed-code, kimi |
117
143
 
118
144
  List all configured providers and models:
119
145
 
@@ -167,6 +193,17 @@ You can add custom models to built-in providers or define new ones. Configuratio
167
193
 
168
194
  ```yaml
169
195
  # ~/.klaude/klaude-config.yaml
196
+ main_model: opus
197
+
198
+ fast_model:
199
+ - haiku
200
+ - gemini-flash
201
+ - gpt-5-nano
202
+
203
+ compact_model:
204
+ - gemini-flash
205
+ - haiku
206
+
170
207
  provider_list:
171
208
  # Add/Override models for built-in OpenRouter provider
172
209
  - provider_name: openrouter
@@ -196,6 +233,22 @@ provider_list:
196
233
  - **Merging**: If `provider_name` matches a built-in provider, settings like `protocol` and `api_key` are inherited.
197
234
  - **Overriding**: Use the same `model_name` as a built-in model to override its parameters.
198
235
  - **Environment Variables**: Use `${VAR_NAME}` syntax for secrets.
236
+ - **Model Preference Lists**: `fast_model` and `compact_model` accept either a single string or a list of model selectors. When you provide a list, Klaude tries them in order and picks the first available one.
237
+
238
+ ##### Sub-agent Model Configuration
239
+
240
+ `sub_agent_models` only accepts sub-agent types. Current supported keys are:
241
+
242
+ - `general-purpose` (Task sub-agent)
243
+ - `explore` (Explore sub-agent)
244
+
245
+ If a sub-agent type is not configured, it falls back to the main agent model.
246
+
247
+ ```yaml
248
+ sub_agent_models:
249
+ general-purpose: sonnet
250
+ explore: haiku
251
+ ```
199
252
 
200
253
  ##### Supported Protocols
201
254
 
@@ -243,7 +296,6 @@ Inside the interactive session (`klaude`), use these commands to streamline your
243
296
  - `/resume` - Select and resume a previous session.
244
297
  - `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
245
298
  - `/export` - Export last assistant message to a temp Markdown file.
246
- - `/export-online` - Export and deploy session to surge.sh as a static webpage.
247
299
  - `/debug [filters]` - Toggle debug mode and configure debug filters.
248
300
  - `/init` - Bootstrap a new project structure or module.
249
301
  - `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
@@ -273,4 +325,3 @@ The main agent can spawn specialized sub-agents for specific tasks:
273
325
  |-----------|---------|
274
326
  | **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
275
327
  | **Task** | Handle complex multi-step tasks autonomously |
276
- | **WebAgent** | Search the web, fetch pages, and analyze content. Uses Brave LLM Context API when `BRAVE_API_KEY` is set, otherwise falls back to DuckDuckGo |
@@ -7,7 +7,7 @@ Minimal code agent CLI.
7
7
  - **Keep reasoning item in context**: Interleaved thinking support
8
8
  - **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
9
9
  - **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
10
- - **Sub-agents**: Task, Explore, Web
10
+ - **Sub-agents**: Task, Explore
11
11
  - **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
12
12
  - **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
13
13
  - **External file sync**: Monitoring for external edits (linter, manual)
@@ -74,7 +74,8 @@ export OPENAI_API_KEY=sk-xxx # GPT models
74
74
  export OPENROUTER_API_KEY=sk-or-xxx # OpenRouter (multi-provider)
75
75
  export DEEPSEEK_API_KEY=sk-xxx # DeepSeek models
76
76
  export MOONSHOT_API_KEY=sk-xxx # Moonshot/Kimi models
77
- export BRAVE_API_KEY=BSA-xxx # Brave Search (optional, enhances web search)
77
+ export BRAVE_API_KEY=BSA-xxx # Brave Search (optional, WebSearch provider)
78
+ export EXA_API_KEY=exa-xxx # Exa Search (optional, WebSearch provider)
78
79
 
79
80
  # Then just run:
80
81
  klaude
@@ -82,16 +83,39 @@ klaude
82
83
 
83
84
  On first run, you'll be prompted to select a model. Your choice is saved as `main_model`.
84
85
 
86
+ You can also configure fallback lists for helper models:
87
+
88
+ ```yaml
89
+ fast_model:
90
+ - haiku
91
+ - gemini-flash
92
+ - gpt-5-nano
93
+
94
+ compact_model:
95
+ - gemini-flash
96
+ - haiku
97
+ ```
98
+
99
+ Klaude tries these entries in order and uses the first available model. `fast_model` is used for session-title generation; `compact_model` is used for compact/helper tasks.
100
+
85
101
  #### Built-in Providers
86
102
 
87
- | Provider | Env Variable | Models |
88
- |-------------|-----------------------|-------------------------------------------------------------------------------|
89
- | anthropic | `ANTHROPIC_API_KEY` | sonnet, opus |
90
- | openai | `OPENAI_API_KEY` | gpt-5.2 |
91
- | openrouter | `OPENROUTER_API_KEY` | gpt-5.2, gpt-5.2-fast, gpt-5.1-codex-max, sonnet, opus, haiku, kimi, gemini-* |
92
- | deepseek | `DEEPSEEK_API_KEY` | deepseek |
93
- | moonshot | `MOONSHOT_API_KEY` | kimi@moonshot |
94
- | codex | N/A (OAuth) | gpt-5.2-codex (requires ChatGPT Pro subscription) |
103
+ | Provider | Env Variable | Models |
104
+ |------------------|------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
105
+ | anthropic | `ANTHROPIC_API_KEY` | sonnet, sonnet-no-thinking, opus, haiku |
106
+ | openai | `OPENAI_API_KEY` | gpt-5.4-high, gpt-5.4-xhigh, gpt-5.3-codex, gpt-5.3-codex-xhigh |
107
+ | openrouter | `OPENROUTER_API_KEY` | gpt-5.3-codex, gpt-5.3-codex-xhigh, gpt-5.4-high, gpt-5.4-xhigh, kimi, haiku, sonnet, sonnet-no-thinking, opus, gemini-pro, gemini-flash, grok, minimax, glm |
108
+ | google | `GOOGLE_API_KEY` or `GEMINI_API_KEY` | gemini-pro, gemini-flash |
109
+ | google-vertex | `GOOGLE_APPLICATION_CREDENTIALS`, `GOOGLE_CLOUD_PROJECT`, `GOOGLE_CLOUD_LOCATION` | gemini-pro, gemini-flash |
110
+ | bedrock | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION` | sonnet |
111
+ | deepseek | `DEEPSEEK_API_KEY` | deepseek |
112
+ | moonshot | `MOONSHOT_API_KEY` | kimi |
113
+ | cerebras | `CEREBRAS_API_KEY` | glm |
114
+ | claude-max | N/A (OAuth) | sonnet, sonnet-no-thinking, opus, haiku |
115
+ | codex | N/A (OAuth) | gpt-5.3-codex, gpt-5.3-codex-xhigh, gpt-5.4-high, gpt-5.4-xhigh |
116
+ | github-copilot | N/A (OAuth) | gpt-5.3-codex, gpt-5.3-codex-xhigh, gpt-5.4-high, gpt-5.4-xhigh, sonnet, sonnet-4.5, haiku, opus |
117
+ | ark-api | `ARK_API_KEY` | seed-pro, seed-code |
118
+ | ark-coding-plan | `ARK_API_KEY` | seed-code, kimi |
95
119
 
96
120
  List all configured providers and models:
97
121
 
@@ -145,6 +169,17 @@ You can add custom models to built-in providers or define new ones. Configuratio
145
169
 
146
170
  ```yaml
147
171
  # ~/.klaude/klaude-config.yaml
172
+ main_model: opus
173
+
174
+ fast_model:
175
+ - haiku
176
+ - gemini-flash
177
+ - gpt-5-nano
178
+
179
+ compact_model:
180
+ - gemini-flash
181
+ - haiku
182
+
148
183
  provider_list:
149
184
  # Add/Override models for built-in OpenRouter provider
150
185
  - provider_name: openrouter
@@ -174,6 +209,22 @@ provider_list:
174
209
  - **Merging**: If `provider_name` matches a built-in provider, settings like `protocol` and `api_key` are inherited.
175
210
  - **Overriding**: Use the same `model_name` as a built-in model to override its parameters.
176
211
  - **Environment Variables**: Use `${VAR_NAME}` syntax for secrets.
212
+ - **Model Preference Lists**: `fast_model` and `compact_model` accept either a single string or a list of model selectors. When you provide a list, Klaude tries them in order and picks the first available one.
213
+
214
+ ##### Sub-agent Model Configuration
215
+
216
+ `sub_agent_models` only accepts sub-agent types. Current supported keys are:
217
+
218
+ - `general-purpose` (Task sub-agent)
219
+ - `explore` (Explore sub-agent)
220
+
221
+ If a sub-agent type is not configured, it falls back to the main agent model.
222
+
223
+ ```yaml
224
+ sub_agent_models:
225
+ general-purpose: sonnet
226
+ explore: haiku
227
+ ```
177
228
 
178
229
  ##### Supported Protocols
179
230
 
@@ -221,7 +272,6 @@ Inside the interactive session (`klaude`), use these commands to streamline your
221
272
  - `/resume` - Select and resume a previous session.
222
273
  - `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
223
274
  - `/export` - Export last assistant message to a temp Markdown file.
224
- - `/export-online` - Export and deploy session to surge.sh as a static webpage.
225
275
  - `/debug [filters]` - Toggle debug mode and configure debug filters.
226
276
  - `/init` - Bootstrap a new project structure or module.
227
277
  - `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
@@ -251,4 +301,3 @@ The main agent can spawn specialized sub-agents for specific tasks:
251
301
  |-----------|---------|
252
302
  | **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
253
303
  | **Task** | Handle complex multi-step tasks autonomously |
254
- | **WebAgent** | Search the web, fetch pages, and analyze content. Uses Brave LLM Context API when `BRAVE_API_KEY` is set, otherwise falls back to DuckDuckGo |
@@ -4,26 +4,28 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "2.21.0"
7
+ version = "2.23.0"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
11
11
  dependencies = [
12
12
  "anthropic>=0.66.0",
13
13
  "chardet>=5.2.0,<6",
14
- "ddgs>=9.9.3",
15
14
  "diff-match-patch>=20241021",
16
15
  "filelock>=3.20.3",
16
+ "fastapi",
17
17
  "google-genai>=1.56.0",
18
18
  "markdown-it-py>=4.0.0",
19
- "openai>=1.102.0",
19
+ "openai>=2.24.0",
20
20
  "prompt-toolkit>=3.0.52",
21
21
  "pydantic>=2.11.7",
22
22
  "python-socks>=2.8.1",
23
23
  "pyyaml>=6.0.2",
24
24
  "rich>=14.1.0",
25
+ "sse-starlette",
25
26
  "trafilatura>=2.0.0",
26
27
  "typer>=0.17.3",
28
+ "uvicorn",
27
29
  ]
28
30
 
29
31
  [project.scripts]
@@ -72,6 +74,8 @@ reportMissingImports = "warning"
72
74
  reportMissingModuleSource = "warning"
73
75
  exclude = [
74
76
  ".venv/",
77
+ ".pnpm-store/",
78
+ "web/node_modules/",
75
79
  "src/klaude_code/skill/assets/**/scripts/",
76
80
  ]
77
81
 
@@ -98,8 +102,8 @@ type = "layers"
98
102
  layers = [
99
103
  "klaude_code.cli",
100
104
  "klaude_code.tui",
105
+ "klaude_code.web",
101
106
  "klaude_code.app",
102
- "klaude_code.ui",
103
107
  "klaude_code.core",
104
108
  "klaude_code.skill",
105
109
  "klaude_code.session",
@@ -1,6 +1,6 @@
1
1
  """Application-layer runtime helpers.
2
2
 
3
- This package coordinates core execution (Executor) with frontend displays.
3
+ This package coordinates core execution (RuntimeFacade) with frontend displays.
4
4
  Terminal-specific rendering and input handling live in `klaude_code.tui`.
5
5
  """
6
6
 
@@ -136,7 +136,7 @@ def execute_login(provider: str) -> None:
136
136
  except Exception as e:
137
137
  log((f"Login failed: {e}", "red"))
138
138
  raise typer.Exit(1) from None
139
- case "copilot":
139
+ case "github-copilot" | "copilot":
140
140
  from klaude_code.auth.copilot.oauth import CopilotOAuth
141
141
  from klaude_code.auth.copilot.token_manager import CopilotTokenManager
142
142
 
@@ -145,7 +145,7 @@ def execute_login(provider: str) -> None:
145
145
  if token_manager.is_logged_in():
146
146
  state = token_manager.get_state()
147
147
  if state and not state.is_expired():
148
- log(("You are already logged in to Copilot.", "green"))
148
+ log(("You are already logged in to GitHub Copilot.", "green"))
149
149
  domain = state.enterprise_domain or "github.com"
150
150
  expires_dt = datetime.datetime.fromtimestamp(state.expires_at, tz=datetime.UTC)
151
151
  log(f" Domain: {domain}")
@@ -232,18 +232,18 @@ def execute_logout(provider: str) -> None:
232
232
  if typer.confirm("Are you sure you want to logout from Claude?"):
233
233
  token_manager.delete()
234
234
  log(("Logged out from Claude.", "green"))
235
- case "copilot":
235
+ case "github-copilot" | "copilot":
236
236
  from klaude_code.auth.copilot.token_manager import CopilotTokenManager
237
237
 
238
238
  token_manager = CopilotTokenManager()
239
239
 
240
240
  if not token_manager.is_logged_in():
241
- log("You are not logged in to Copilot.")
241
+ log("You are not logged in to GitHub Copilot.")
242
242
  return
243
243
 
244
- if typer.confirm("Are you sure you want to logout from Copilot?"):
244
+ if typer.confirm("Are you sure you want to logout from GitHub Copilot?"):
245
245
  token_manager.delete()
246
- log(("Logged out from Copilot.", "green"))
246
+ log(("Logged out from GitHub Copilot.", "green"))
247
247
  case _:
248
- log((f"Error: Unknown provider '{provider}'. Supported: codex, claude, copilot", "red"))
248
+ log((f"Error: Unknown provider '{provider}'. Supported: codex, claude, github-copilot", "red"))
249
249
  raise typer.Exit(1)
@@ -86,6 +86,25 @@ body {
86
86
  flex: 1;
87
87
  letter-spacing: -0.01em;
88
88
  }
89
+ .nav-btn {
90
+ background: var(--bg-surface);
91
+ border: 1px solid var(--border);
92
+ color: var(--fg-secondary);
93
+ padding: 4px 10px;
94
+ border-radius: 6px;
95
+ font-size: 16px;
96
+ font-weight: 700;
97
+ font-family: var(--font-sans);
98
+ cursor: pointer;
99
+ transition: all 0.2s ease;
100
+ white-space: nowrap;
101
+ box-shadow: 0 1px 2px rgba(0,0,0,0.02);
102
+ }
103
+ .nav-btn:hover {
104
+ background: var(--bg-hover);
105
+ color: var(--fg);
106
+ border-color: var(--border-strong);
107
+ }
89
108
  #toolbar .filter-group {
90
109
  display: flex;
91
110
  gap: 6px;
@@ -182,6 +201,8 @@ body {
182
201
  .log-line .dtype-RESPONSE { color: #5b21b6; background: #ede9fe; }
183
202
  .log-line .dtype-EXECUTION { color: #0f766e; background: #ccfbf1; }
184
203
  .log-line .dtype-TERMINAL { color: #be123c; background: #ffe4e6; }
204
+ .log-line .dtype-OPERATION { color: #1e1b4b; background: #e0e7ff; }
205
+ .log-line .dtype-EVENT_BUS { color: #6d28d9; background: #f3e8ff; }
185
206
  .log-line .msg { color: var(--fg-secondary); }
186
207
  .log-line .json-inline { color: var(--fg-tertiary); }
187
208
  .log-line .lineno {
@@ -214,11 +235,14 @@ body {
214
235
  #right {
215
236
  width: 50%;
216
237
  min-width: 300px;
217
- display: flex;
238
+ display: none;
218
239
  flex-direction: column;
219
240
  background: var(--bg-surface);
220
241
  border-left: 1px solid var(--border);
221
242
  }
243
+ #right.open {
244
+ display: flex;
245
+ }
222
246
  #right-toolbar {
223
247
  display: flex;
224
248
  align-items: center;
@@ -361,6 +385,7 @@ body {
361
385
 
362
386
  /* Resize handle */
363
387
  #resize-handle {
388
+ display: none;
364
389
  width: 4px;
365
390
  cursor: col-resize;
366
391
  background: transparent;
@@ -372,6 +397,7 @@ body {
372
397
  margin-left: -2px;
373
398
  margin-right: -2px;
374
399
  }
400
+ #resize-handle.open { display: block; }
375
401
  #resize-handle:hover, #resize-handle.dragging { background: var(--border-strong); }
376
402
  </style>
377
403
  </head>
@@ -379,6 +405,7 @@ body {
379
405
  <div id="container">
380
406
  <div id="left">
381
407
  <div id="toolbar">
408
+ <button class="nav-btn" id="btn-back-list" title="Back to log files">Logs</button>
382
409
  <span class="title" id="log-title">No log loaded</span>
383
410
  <input type="text" id="search-box" placeholder="Search... (/)">
384
411
  <div class="filter-group" id="filter-group"></div>
@@ -393,6 +420,7 @@ body {
393
420
  <button class="action-btn" id="btn-expand-all" title="Expand all">Expand All</button>
394
421
  <button class="action-btn" id="btn-collapse-all" title="Collapse all">Collapse All</button>
395
422
  <button class="action-btn" id="btn-raw" title="Toggle raw text">Raw</button>
423
+ <button class="action-btn" id="btn-close-panel" title="Close panel" style="padding:4px 8px;">&#x2715;</button>
396
424
  </div>
397
425
  <div id="json-view"><span class="empty-hint">Select a log line to view details</span></div>
398
426
  </div>
@@ -400,23 +428,84 @@ body {
400
428
 
401
429
  <script>
402
430
  const LOG_RE = /^\[([^\]]+)\]\s+(\S+)\s+(.*)/;
403
- const ALL_TYPES = ['GENERAL','LLM_CONFIG','LLM_PAYLOAD','LLM_STREAM','UI_EVENT','RESPONSE','EXECUTION','TERMINAL'];
404
- const DEFAULT_FILTERS = new Set(['LLM_CONFIG','LLM_PAYLOAD','LLM_STREAM']);
431
+ const ALL_TYPES = ['GENERAL','LLM_CONFIG','LLM_PAYLOAD','LLM_STREAM','OPERATION','EVENT_BUS','UI_EVENT','RESPONSE','EXECUTION','TERMINAL'];
432
+ const DEFAULT_FILTERS = new Set(['LLM_CONFIG','LLM_PAYLOAD','LLM_STREAM','OPERATION']);
405
433
 
406
434
  let logLines = [];
407
435
  let selectedIdx = -1;
408
436
  let activeFilters = new Set();
409
437
  let searchQuery = '';
410
438
  let showRaw = false;
439
+ let viewerMode = 'files';
440
+
441
+ function setViewerMode(mode) {
442
+ viewerMode = mode;
443
+ const isLogMode = mode === 'log';
444
+ document.getElementById('btn-back-list').style.display = isLogMode ? '' : 'none';
445
+ document.getElementById('search-box').style.display = isLogMode ? '' : 'none';
446
+ document.getElementById('filter-group').style.display = isLogMode ? '' : 'none';
447
+ for (const id of ['btn-copy', 'btn-expand-all', 'btn-collapse-all', 'btn-raw', 'btn-close-panel']) {
448
+ document.getElementById(id).disabled = !isLogMode;
449
+ }
450
+ }
451
+
452
+ document.getElementById('btn-back-list').addEventListener('click', () => {
453
+ location.search = '';
454
+ });
455
+
456
+ async function loadLogList() {
457
+ setViewerMode('files');
458
+ const title = document.getElementById('log-title');
459
+ const list = document.getElementById('log-list');
460
+ const label = document.getElementById('right-label');
461
+ const view = document.getElementById('json-view');
462
+ title.textContent = 'Log files';
463
+ label.textContent = 'Select a log file';
464
+ view.innerHTML = '<span class="empty-hint">Choose a log file from the left list</span>';
465
+ list.innerHTML = '<div class="log-line"><span class="msg">Loading...</span></div>';
466
+
467
+ try {
468
+ const resp = await fetch('/api/logs');
469
+ if (!resp.ok) throw new Error(resp.statusText);
470
+ const files = await resp.json();
471
+ list.innerHTML = '';
472
+
473
+ if (files.length === 0) {
474
+ list.innerHTML = '<div class="log-line"><span class="msg">No log files found</span></div>';
475
+ return;
476
+ }
477
+
478
+ const frag = document.createDocumentFragment();
479
+ files.forEach((file, idx) => {
480
+ const div = document.createElement('div');
481
+ div.className = 'log-line';
482
+ const mtime = new Date(file.mtime * 1000).toLocaleString();
483
+ div.innerHTML =
484
+ '<span class="lineno">' + (idx + 1) + '</span>' +
485
+ '<span class="ts">' + esc(mtime) + '</span> ' +
486
+ '<span class="msg">' + esc(file.relative_path) + '</span> ' +
487
+ '<span class="json-inline">' + esc(formatBytes(file.size_bytes)) + '</span>';
488
+ div.addEventListener('click', () => {
489
+ location.search = '?log=' + encodeURIComponent(file.path);
490
+ });
491
+ frag.appendChild(div);
492
+ });
493
+ list.appendChild(frag);
494
+ } catch (e) {
495
+ title.textContent = 'Error: ' + e.message;
496
+ list.innerHTML = '<div class="log-line"><span class="msg">Failed to load log files</span></div>';
497
+ }
498
+ }
411
499
 
412
500
  // --- Data loading ---
413
501
  async function loadLog() {
414
502
  const params = new URLSearchParams(location.search);
415
503
  const logPath = params.get('log');
416
504
  if (!logPath) {
417
- document.getElementById('log-title').textContent = 'No log path specified';
505
+ await loadLogList();
418
506
  return;
419
507
  }
508
+ setViewerMode('log');
420
509
  document.getElementById('log-title').textContent = logPath.split('/').slice(-2).join('/');
421
510
  try {
422
511
  const resp = await fetch('/api/log?path=' + encodeURIComponent(logPath));
@@ -495,13 +584,28 @@ function toggleFilter(type, btn) {
495
584
  btn.classList.add('active');
496
585
  }
497
586
  applyFilters();
587
+
588
+ if (selectedIdx >= 0) {
589
+ const list = document.getElementById('log-list');
590
+ const selected = list.children[selectedIdx];
591
+ if (selected && !selected.classList.contains('hidden')) {
592
+ const listRect = list.getBoundingClientRect();
593
+ const rowRect = selected.getBoundingClientRect();
594
+ const fullyVisible = rowRect.top >= listRect.top && rowRect.bottom <= listRect.bottom;
595
+ if (!fullyVisible) {
596
+ selected.scrollIntoView({ block: 'center' });
597
+ }
598
+ }
599
+ }
498
600
  }
499
601
 
500
602
  function applyFilters() {
603
+ if (viewerMode !== 'log') return;
501
604
  const list = document.getElementById('log-list');
502
605
  const items = list.children;
503
606
  for (let i = 0; i < items.length; i++) {
504
607
  const entry = logLines[i];
608
+ if (!entry) continue;
505
609
  let visible = true;
506
610
  if (activeFilters.size > 0 && entry.type && !activeFilters.has(entry.type)) {
507
611
  visible = false;
@@ -555,7 +659,23 @@ function renderLogList() {
555
659
  list.appendChild(frag);
556
660
  }
557
661
 
662
+ function openRightPanel() {
663
+ document.getElementById('right').classList.add('open');
664
+ document.getElementById('resize-handle').classList.add('open');
665
+ }
666
+
667
+ function closeRightPanel() {
668
+ document.getElementById('right').classList.remove('open');
669
+ document.getElementById('resize-handle').classList.remove('open');
670
+ const list = document.getElementById('log-list');
671
+ if (selectedIdx >= 0 && list.children[selectedIdx]) {
672
+ list.children[selectedIdx].classList.remove('selected');
673
+ }
674
+ selectedIdx = -1;
675
+ }
676
+
558
677
  function selectLine(idx) {
678
+ openRightPanel();
559
679
  const list = document.getElementById('log-list');
560
680
  if (selectedIdx >= 0 && list.children[selectedIdx]) {
561
681
  list.children[selectedIdx].classList.remove('selected');
@@ -757,6 +877,8 @@ document.getElementById('btn-collapse-all').addEventListener('click', () => {
757
877
  });
758
878
  });
759
879
 
880
+ document.getElementById('btn-close-panel').addEventListener('click', closeRightPanel);
881
+
760
882
  document.getElementById('btn-raw').addEventListener('click', () => {
761
883
  if (selectedIdx < 0) return;
762
884
  const entry = logLines[selectedIdx];
@@ -776,11 +898,12 @@ document.getElementById('btn-raw').addEventListener('click', () => {
776
898
  // --- Search ---
777
899
  const searchBox = document.getElementById('search-box');
778
900
  searchBox.addEventListener('input', () => {
901
+ if (viewerMode !== 'log') return;
779
902
  searchQuery = searchBox.value.toLowerCase();
780
903
  applyFilters();
781
904
  });
782
905
  document.addEventListener('keydown', (e) => {
783
- if (e.key === '/' && document.activeElement !== searchBox) {
906
+ if (viewerMode === 'log' && e.key === '/' && document.activeElement !== searchBox) {
784
907
  e.preventDefault();
785
908
  searchBox.focus();
786
909
  }
@@ -788,16 +911,17 @@ document.addEventListener('keydown', (e) => {
788
911
  searchBox.value = '';
789
912
  searchQuery = '';
790
913
  searchBox.blur();
791
- applyFilters();
914
+ if (viewerMode === 'log') applyFilters();
792
915
  }
793
916
  // Arrow keys for navigation
794
- if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
917
+ if (viewerMode === 'log' && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {
795
918
  e.preventDefault();
796
919
  navigateLine(e.key === 'ArrowDown' ? 1 : -1);
797
920
  }
798
921
  });
799
922
 
800
923
  function navigateLine(direction) {
924
+ if (viewerMode !== 'log') return;
801
925
  const list = document.getElementById('log-list');
802
926
  let next = selectedIdx + direction;
803
927
  // Skip hidden lines
@@ -952,6 +1076,11 @@ function badgeify(s) {
952
1076
  return esc(s).replace(/\[([\w.]+)\]/g, '<span class="badge">$1</span>');
953
1077
  }
954
1078
  function truncate(s, n) { return s.length <= n ? s : s.slice(0, n) + '...'; }
1079
+ function formatBytes(bytes) {
1080
+ if (bytes < 1024) return bytes + ' B';
1081
+ if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
1082
+ return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
1083
+ }
955
1084
 
956
1085
  // --- Init ---
957
1086
  buildFilters();