klaude-code 1.2.29__tar.gz → 1.3.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.29 → klaude_code-1.3.0}/PKG-INFO +1 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/pyproject.toml +1 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/__init__.py +3 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/clear_cmd.py +4 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/command_abc.py +4 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/fork_session_cmd.py +2 -2
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/model_cmd.py +42 -2
- klaude_code-1.3.0/src/klaude_code/command/resume_cmd.py +51 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/status_cmd.py +1 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/config/assets/builtin_config.yaml +11 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/executor.py +42 -8
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/task.py +7 -6
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/__init__.py +2 -0
- klaude_code-1.3.0/src/klaude_code/core/tool/file/move_tool.md +41 -0
- klaude_code-1.3.0/src/klaude_code/core/tool/file/move_tool.py +435 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/shell/bash_tool.py +5 -2
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/tool_registry.py +3 -3
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/commands.py +1 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/op.py +12 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/op_handler.py +5 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/sub_agent/task.py +1 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/tools.py +1 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/event_handler.py +1 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +20 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/key_bindings.py +72 -9
- klaude_code-1.3.0/src/klaude_code/ui/renderers/bash_syntax.py +178 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/common.py +2 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/mermaid_viewer.py +1 -2
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/metadata.py +1 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/thinking.py +1 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/tools.py +92 -16
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/theme.py +18 -1
- {klaude_code-1.2.29 → klaude_code-1.3.0}/README.md +0 -0
- {klaude_code-1.2.29/src/klaude_code/ui/renderers → klaude_code-1.3.0/src/klaude_code}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/config_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/debug.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/list_model.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/main.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/runtime.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/self_update.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/cli/session_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/debug_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/export_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/export_online_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/help_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/prompt-init.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/prompt-jj-describe.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/prompt_command.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/refresh_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/registry.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/release_notes_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/command/thinking_cmd.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/config/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/config/assets/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/config/builtin_config.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/config/config.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/config/select_model.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/const.py +0 -0
- {klaude_code-1.2.29/src/klaude_code/core/tool/web → klaude_code-1.3.0/src/klaude_code/core}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/manager/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompt.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/reminders.py +0 -0
- {klaude_code-1.2.29/src/klaude_code/core/tool/todo → klaude_code-1.3.0/src/klaude_code/core/tool/file}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/read_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/report_back_tool.py +0 -0
- {klaude_code-1.2.29/src/klaude_code/core/tool/skill → klaude_code-1.3.0/src/klaude_code/core/tool/shell}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
- {klaude_code-1.2.29/src/klaude_code/core/tool/shell → klaude_code-1.3.0/src/klaude_code/core/tool/skill}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
- {klaude_code-1.2.29/src/klaude_code/core/tool/file → klaude_code-1.3.0/src/klaude_code/core/tool/todo}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/tool_context.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/tool_runner.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/truncation.py +0 -0
- {klaude_code-1.2.29/src/klaude_code/core → klaude_code-1.3.0/src/klaude_code/core/tool/web}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/core/turn.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/anthropic/client.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/anthropic/input.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/codex/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/codex/client.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/input_common.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openai_compatible/input.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openrouter/client.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openrouter/input.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/registry.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/responses/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/responses/client.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/responses/input.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/llm/usage.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/events.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/llm_param.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/model.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/protocol/sub_agent/web.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/codec.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/export.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/session.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/store.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/templates/export_session.html +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/loader.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/manager.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/skill/system_skills.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/trace/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/trace/log.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/core/display.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/core/stage_manager.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/debug/display.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/exec/display.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/completers.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/display.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
- {klaude_code-1.2.29/src/klaude_code → klaude_code-1.3.0/src/klaude_code/ui/renderers}/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/assistant.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/developer.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/diffs.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/errors.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/renderers/user_input.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/code_panel.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/live.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/markdown.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/quote.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/searchable_text.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/rich/status.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/terminal/color.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/terminal/control.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/terminal/notifier.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/utils/__init__.py +0 -0
- {klaude_code-1.2.29 → klaude_code-1.3.0}/src/klaude_code/ui/utils/common.py +0 -0
|
@@ -36,6 +36,7 @@ def ensure_commands_loaded() -> None:
|
|
|
36
36
|
from .model_cmd import ModelCommand
|
|
37
37
|
from .refresh_cmd import RefreshTerminalCommand
|
|
38
38
|
from .release_notes_cmd import ReleaseNotesCommand
|
|
39
|
+
from .resume_cmd import ResumeCommand
|
|
39
40
|
from .status_cmd import StatusCommand
|
|
40
41
|
from .terminal_setup_cmd import TerminalSetupCommand
|
|
41
42
|
from .thinking_cmd import ThinkingCommand
|
|
@@ -47,6 +48,7 @@ def ensure_commands_loaded() -> None:
|
|
|
47
48
|
register(ThinkingCommand())
|
|
48
49
|
register(ModelCommand())
|
|
49
50
|
register(ForkSessionCommand())
|
|
51
|
+
register(ResumeCommand())
|
|
50
52
|
load_prompt_commands()
|
|
51
53
|
register(StatusCommand())
|
|
52
54
|
register(HelpCommand())
|
|
@@ -70,6 +72,7 @@ def __getattr__(name: str) -> object:
|
|
|
70
72
|
"ModelCommand": "model_cmd",
|
|
71
73
|
"RefreshTerminalCommand": "refresh_cmd",
|
|
72
74
|
"ReleaseNotesCommand": "release_notes_cmd",
|
|
75
|
+
"ResumeCommand": "resume_cmd",
|
|
73
76
|
"StatusCommand": "status_cmd",
|
|
74
77
|
"TerminalSetupCommand": "terminal_setup_cmd",
|
|
75
78
|
"ThinkingCommand": "thinking_cmd",
|
|
@@ -15,4 +15,7 @@ class ClearCommand(CommandABC):
|
|
|
15
15
|
|
|
16
16
|
async def run(self, agent: Agent, user_input: model.UserInputPayload) -> CommandResult:
|
|
17
17
|
del user_input # unused
|
|
18
|
-
return CommandResult(
|
|
18
|
+
return CommandResult(
|
|
19
|
+
operations=[op.ClearSessionOperation(session_id=agent.session.id)],
|
|
20
|
+
persist_user_input=False,
|
|
21
|
+
)
|
|
@@ -42,6 +42,10 @@ class CommandResult(BaseModel):
|
|
|
42
42
|
) = None # List of UI events to display immediately
|
|
43
43
|
operations: list[op.Operation] | None = None
|
|
44
44
|
|
|
45
|
+
# Persistence controls: some slash commands are UI/control actions and should not be written to session history.
|
|
46
|
+
persist_user_input: bool = True
|
|
47
|
+
persist_events: bool = True
|
|
48
|
+
|
|
45
49
|
|
|
46
50
|
class CommandABC(ABC):
|
|
47
51
|
"""Abstract base class for slash commands."""
|
|
@@ -24,7 +24,7 @@ class ForkSessionCommand(CommandABC):
|
|
|
24
24
|
command_output=model.CommandOutput(command_name=self.name),
|
|
25
25
|
),
|
|
26
26
|
)
|
|
27
|
-
return CommandResult(events=[event])
|
|
27
|
+
return CommandResult(events=[event], persist_user_input=False, persist_events=False)
|
|
28
28
|
|
|
29
29
|
new_session = agent.session.fork()
|
|
30
30
|
await new_session.wait_for_flush()
|
|
@@ -39,4 +39,4 @@ class ForkSessionCommand(CommandABC):
|
|
|
39
39
|
),
|
|
40
40
|
),
|
|
41
41
|
)
|
|
42
|
-
return CommandResult(events=[event])
|
|
42
|
+
return CommandResult(events=[event], persist_user_input=False, persist_events=False)
|
|
@@ -1,9 +1,43 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
|
|
3
|
+
import questionary
|
|
4
|
+
|
|
3
5
|
from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
|
|
4
6
|
from klaude_code.config.select_model import select_model_from_config
|
|
5
7
|
from klaude_code.protocol import commands, events, model, op
|
|
6
8
|
|
|
9
|
+
SELECT_STYLE = questionary.Style(
|
|
10
|
+
[
|
|
11
|
+
("instruction", "ansibrightblack"),
|
|
12
|
+
("pointer", "ansicyan"),
|
|
13
|
+
("highlighted", "ansicyan"),
|
|
14
|
+
("text", "ansibrightblack"),
|
|
15
|
+
]
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _confirm_change_default_model_sync(selected_model: str) -> bool:
|
|
20
|
+
choices: list[questionary.Choice] = [
|
|
21
|
+
questionary.Choice(title="No (session only)", value=False),
|
|
22
|
+
questionary.Choice(title="Yes (save as default main_model in ~/.klaude/klaude-config.yaml)", value=True),
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
# Add a blank line between the model selector and this confirmation prompt.
|
|
27
|
+
questionary.print("")
|
|
28
|
+
result = questionary.select(
|
|
29
|
+
message=f"Save '{selected_model}' as default model?",
|
|
30
|
+
choices=choices,
|
|
31
|
+
pointer="→",
|
|
32
|
+
instruction="Use arrow keys to move, Enter to select",
|
|
33
|
+
use_jk_keys=False,
|
|
34
|
+
style=SELECT_STYLE,
|
|
35
|
+
).ask()
|
|
36
|
+
except KeyboardInterrupt:
|
|
37
|
+
return False
|
|
38
|
+
|
|
39
|
+
return bool(result)
|
|
40
|
+
|
|
7
41
|
|
|
8
42
|
class ModelCommand(CommandABC):
|
|
9
43
|
"""Display or change the model configuration."""
|
|
@@ -44,7 +78,13 @@ class ModelCommand(CommandABC):
|
|
|
44
78
|
)
|
|
45
79
|
]
|
|
46
80
|
)
|
|
47
|
-
|
|
81
|
+
save_as_default = await asyncio.to_thread(_confirm_change_default_model_sync, selected_model)
|
|
48
82
|
return CommandResult(
|
|
49
|
-
operations=[
|
|
83
|
+
operations=[
|
|
84
|
+
op.ChangeModelOperation(
|
|
85
|
+
session_id=agent.session.id,
|
|
86
|
+
model_name=selected_model,
|
|
87
|
+
save_as_default=save_as_default,
|
|
88
|
+
)
|
|
89
|
+
]
|
|
50
90
|
)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
|
|
3
|
+
from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
|
|
4
|
+
from klaude_code.protocol import commands, events, model, op
|
|
5
|
+
from klaude_code.session.selector import resume_select_session
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ResumeCommand(CommandABC):
|
|
9
|
+
"""Resume a previous session."""
|
|
10
|
+
|
|
11
|
+
@property
|
|
12
|
+
def name(self) -> commands.CommandName:
|
|
13
|
+
return commands.CommandName.RESUME
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def summary(self) -> str:
|
|
17
|
+
return "Resume a previous session"
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def is_interactive(self) -> bool:
|
|
21
|
+
return True
|
|
22
|
+
|
|
23
|
+
async def run(self, agent: Agent, user_input: model.UserInputPayload) -> CommandResult:
|
|
24
|
+
del user_input # unused
|
|
25
|
+
|
|
26
|
+
if agent.session.messages_count > 0:
|
|
27
|
+
event = events.DeveloperMessageEvent(
|
|
28
|
+
session_id=agent.session.id,
|
|
29
|
+
item=model.DeveloperMessageItem(
|
|
30
|
+
content="Cannot resume: current session already has messages. Use `klaude -r` to start a new instance with session selection.",
|
|
31
|
+
command_output=model.CommandOutput(command_name=self.name, is_error=True),
|
|
32
|
+
),
|
|
33
|
+
)
|
|
34
|
+
return CommandResult(events=[event], persist_user_input=False, persist_events=False)
|
|
35
|
+
|
|
36
|
+
selected_session_id = await asyncio.to_thread(resume_select_session)
|
|
37
|
+
if selected_session_id is None:
|
|
38
|
+
event = events.DeveloperMessageEvent(
|
|
39
|
+
session_id=agent.session.id,
|
|
40
|
+
item=model.DeveloperMessageItem(
|
|
41
|
+
content="(no session selected)",
|
|
42
|
+
command_output=model.CommandOutput(command_name=self.name),
|
|
43
|
+
),
|
|
44
|
+
)
|
|
45
|
+
return CommandResult(events=[event], persist_user_input=False, persist_events=False)
|
|
46
|
+
|
|
47
|
+
return CommandResult(
|
|
48
|
+
operations=[op.ResumeSessionOperation(target_session_id=selected_session_id)],
|
|
49
|
+
persist_user_input=False,
|
|
50
|
+
persist_events=False,
|
|
51
|
+
)
|
|
@@ -53,6 +53,17 @@ provider_list:
|
|
|
53
53
|
protocol: openrouter
|
|
54
54
|
api_key: ${OPENROUTER_API_KEY}
|
|
55
55
|
model_list:
|
|
56
|
+
- model_name: gpt-5-mini
|
|
57
|
+
model_params:
|
|
58
|
+
model: openai/gpt-5-mini
|
|
59
|
+
max_tokens: 128000
|
|
60
|
+
context_limit: 400000
|
|
61
|
+
thinking:
|
|
62
|
+
reasoning_effort: high
|
|
63
|
+
cost:
|
|
64
|
+
input: 0.25
|
|
65
|
+
output: 2.0
|
|
66
|
+
cache_read: 0.03
|
|
56
67
|
- model_name: gpt-5.1-codex-max
|
|
57
68
|
model_params:
|
|
58
69
|
model: openai/gpt-5.1-codex-max
|
|
@@ -203,13 +203,15 @@ class ExecutorContext:
|
|
|
203
203
|
raise ValueError("Multiple RunAgentOperation results are not supported")
|
|
204
204
|
|
|
205
205
|
persisted_user_input = run_ops[0].input if run_ops else user_input
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
|
|
207
|
+
if result.persist_user_input:
|
|
208
|
+
agent.session.append_history(
|
|
209
|
+
[model.UserMessageItem(content=persisted_user_input.text, images=persisted_user_input.images)]
|
|
210
|
+
)
|
|
209
211
|
|
|
210
212
|
if result.events:
|
|
211
213
|
for evt in result.events:
|
|
212
|
-
if isinstance(evt, events.DeveloperMessageEvent):
|
|
214
|
+
if result.persist_events and isinstance(evt, events.DeveloperMessageEvent):
|
|
213
215
|
agent.session.append_history([evt.item])
|
|
214
216
|
await self.emit_event(evt)
|
|
215
217
|
|
|
@@ -237,12 +239,13 @@ class ExecutorContext:
|
|
|
237
239
|
agent.session.model_config_name = operation.model_name
|
|
238
240
|
agent.session.model_thinking = llm_config.thinking
|
|
239
241
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
242
|
+
if operation.save_as_default:
|
|
243
|
+
config.main_model = operation.model_name
|
|
244
|
+
await config.save()
|
|
243
245
|
|
|
246
|
+
default_note = " (saved as default)" if operation.save_as_default else ""
|
|
244
247
|
developer_item = model.DeveloperMessageItem(
|
|
245
|
-
content=f"Switched to: {llm_config.model}",
|
|
248
|
+
content=f"Switched to: {llm_config.model}{default_note}",
|
|
246
249
|
command_output=model.CommandOutput(command_name=commands.CommandName.MODEL),
|
|
247
250
|
)
|
|
248
251
|
agent.session.append_history([developer_item])
|
|
@@ -305,6 +308,37 @@ class ExecutorContext:
|
|
|
305
308
|
)
|
|
306
309
|
await self.emit_event(events.DeveloperMessageEvent(session_id=agent.session.id, item=developer_item))
|
|
307
310
|
|
|
311
|
+
async def handle_resume_session(self, operation: op.ResumeSessionOperation) -> None:
|
|
312
|
+
target_session = Session.load(operation.target_session_id)
|
|
313
|
+
if (
|
|
314
|
+
target_session.model_thinking is not None
|
|
315
|
+
and target_session.model_name
|
|
316
|
+
and target_session.model_name == self.llm_clients.main.model_name
|
|
317
|
+
):
|
|
318
|
+
self.llm_clients.main.get_llm_config().thinking = target_session.model_thinking
|
|
319
|
+
|
|
320
|
+
profile = self.model_profile_provider.build_profile(self.llm_clients.main)
|
|
321
|
+
from klaude_code.core.agent import Agent
|
|
322
|
+
|
|
323
|
+
agent = Agent(session=target_session, profile=profile)
|
|
324
|
+
|
|
325
|
+
async for evt in agent.replay_history():
|
|
326
|
+
await self.emit_event(evt)
|
|
327
|
+
|
|
328
|
+
await self.emit_event(
|
|
329
|
+
events.WelcomeEvent(
|
|
330
|
+
work_dir=str(target_session.work_dir),
|
|
331
|
+
llm_config=self.llm_clients.main.get_llm_config(),
|
|
332
|
+
)
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
self._agent = agent
|
|
336
|
+
log_debug(
|
|
337
|
+
f"Resumed session: {target_session.id}",
|
|
338
|
+
style="cyan",
|
|
339
|
+
debug_type=DebugType.EXECUTION,
|
|
340
|
+
)
|
|
341
|
+
|
|
308
342
|
async def handle_export_session(self, operation: op.ExportSessionOperation) -> None:
|
|
309
343
|
agent = await self._ensure_agent(operation.session_id)
|
|
310
344
|
try:
|
|
@@ -238,12 +238,13 @@ class TaskExecutor:
|
|
|
238
238
|
return
|
|
239
239
|
|
|
240
240
|
if turn is None or turn.task_finished:
|
|
241
|
-
#
|
|
242
|
-
if
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
241
|
+
# Empty result should retry instead of finishing
|
|
242
|
+
if turn is not None and not turn.task_result.strip():
|
|
243
|
+
if ctx.sub_agent_state is not None:
|
|
244
|
+
error_msg = "Sub-agent returned empty result, retrying..."
|
|
245
|
+
else:
|
|
246
|
+
error_msg = "Agent returned empty result, retrying..."
|
|
247
|
+
yield events.ErrorEvent(error_message=error_msg, can_retry=True)
|
|
247
248
|
continue
|
|
248
249
|
break
|
|
249
250
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from .file.apply_patch import DiffError, process_patch
|
|
2
2
|
from .file.apply_patch_tool import ApplyPatchTool
|
|
3
|
+
from .file.move_tool import MoveTool
|
|
3
4
|
from .file.edit_tool import EditTool
|
|
4
5
|
from .file.read_tool import ReadTool
|
|
5
6
|
from .file.write_tool import WriteTool
|
|
@@ -31,6 +32,7 @@ from .web.web_search_tool import WebSearchTool
|
|
|
31
32
|
__all__ = [
|
|
32
33
|
"ApplyPatchTool",
|
|
33
34
|
"BashTool",
|
|
35
|
+
"MoveTool",
|
|
34
36
|
"DiffError",
|
|
35
37
|
"EditTool",
|
|
36
38
|
"FileTracker",
|
|
@@ -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
|
+
```
|