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