klaude-code 1.2.16__tar.gz → 1.2.18__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.16 → klaude_code-1.2.18}/PKG-INFO +126 -25
- {klaude_code-1.2.16 → klaude_code-1.2.18}/README.md +124 -24
- {klaude_code-1.2.16 → klaude_code-1.2.18}/pyproject.toml +6 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/config_cmd.py +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/debug.py +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/main.py +3 -9
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/runtime.py +20 -13
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/__init__.py +7 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/clear_cmd.py +2 -7
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/command_abc.py +33 -5
- klaude_code-1.2.18/src/klaude_code/command/debug_cmd.py +79 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/diff_cmd.py +2 -6
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/export_cmd.py +7 -7
- klaude_code-1.2.18/src/klaude_code/command/export_online_cmd.py +145 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/help_cmd.py +4 -9
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/model_cmd.py +10 -6
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/prompt_command.py +2 -6
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/refresh_cmd.py +2 -7
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/registry.py +2 -4
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/release_notes_cmd.py +2 -6
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/status_cmd.py +2 -7
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/terminal_setup_cmd.py +2 -6
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/thinking_cmd.py +13 -8
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/config/config.py +16 -17
- klaude_code-1.2.18/src/klaude_code/config/select_model.py +133 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/const/__init__.py +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/executor.py +236 -109
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/manager/__init__.py +2 -4
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/manager/sub_agent_manager.py +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-claude-code.md +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -1
- klaude_code-1.2.18/src/klaude_code/core/prompts/prompt-sub-agent-web.md +51 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/reminders.py +9 -35
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/task.py +8 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/__init__.py +2 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/read_tool.py +38 -10
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/report_back_tool.py +28 -2
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/shell/bash_tool.py +22 -2
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/tool_runner.py +26 -23
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/truncation.py +23 -9
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/web/web_fetch_tool.md +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/web/web_fetch_tool.py +36 -1
- klaude_code-1.2.18/src/klaude_code/core/tool/web/web_search_tool.md +23 -0
- klaude_code-1.2.18/src/klaude_code/core/tool/web/web_search_tool.py +126 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/turn.py +28 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/commands.py +2 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/events.py +8 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/sub_agent/__init__.py +1 -1
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/sub_agent/explore.py +1 -1
- klaude_code-1.2.18/src/klaude_code/protocol/sub_agent/web.py +79 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/tools.py +1 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/session/session.py +2 -2
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/session/templates/export_session.html +123 -37
- klaude_code-1.2.18/src/klaude_code/trace/__init__.py +21 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/completers.py +19 -2
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/event_handler.py +44 -15
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/renderer.py +3 -3
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/metadata.py +2 -4
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/sub_agent.py +14 -10
- klaude_code-1.2.18/src/klaude_code/ui/renderers/thinking.py +55 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/tools.py +83 -20
- klaude_code-1.2.18/src/klaude_code/ui/rich/code_panel.py +112 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/markdown.py +3 -4
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/status.py +30 -6
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/theme.py +10 -1
- klaude_code-1.2.16/src/klaude_code/config/select_model.py +0 -57
- klaude_code-1.2.16/src/klaude_code/core/manager/agent_manager.py +0 -132
- klaude_code-1.2.16/src/klaude_code/core/prompts/prompt-sub-agent-webfetch.md +0 -46
- klaude_code-1.2.16/src/klaude_code/protocol/sub_agent/web_fetch.py +0 -74
- klaude_code-1.2.16/src/klaude_code/trace/__init__.py +0 -3
- klaude_code-1.2.16/src/klaude_code/ui/renderers/thinking.py +0 -39
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-1.2.16/src/klaude_code/config → klaude_code-1.2.18/src/klaude_code/cli}/list_model.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/cli/session_cmd.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/prompt-deslop.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/prompt-dev-docs-update.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/prompt-dev-docs.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/prompt-handoff.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/command/prompt-init.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/config/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompt.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/multi_edit_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/multi_edit_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/memory/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/memory/memory_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/memory/memory_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/memory/skill_loader.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/memory/skill_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/memory/skill_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/shell/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/todo/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/tool_context.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/tool_registry.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/web/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/anthropic/client.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/anthropic/input.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/codex/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/codex/client.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/input_common.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openai_compatible/input.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openai_compatible/stream_processor.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openrouter/client.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openrouter/input.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/openrouter/reasoning_handler.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/registry.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/responses/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/responses/client.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/responses/input.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/llm/usage.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/llm_param.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/model.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/op.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/op_handler.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/protocol/sub_agent/task.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/session/export.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/trace/log.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/core/display.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/core/stage_manager.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/debug/display.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/exec/display.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/display.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/assistant.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/common.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/developer.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/diffs.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/errors.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/renderers/user_input.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/live.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/quote.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/rich/searchable_text.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/terminal/color.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/terminal/control.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/terminal/notifier.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/utils/__init__.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/utils/common.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/ui/utils/debouncer.py +0 -0
- {klaude_code-1.2.16 → klaude_code-1.2.18}/src/klaude_code/version.py +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: klaude-code
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.18
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Dist: anthropic>=0.66.0
|
|
6
|
+
Requires-Dist: ddgs>=9.9.3
|
|
6
7
|
Requires-Dist: openai>=1.102.0
|
|
7
8
|
Requires-Dist: pillow>=12.0.0
|
|
8
9
|
Requires-Dist: prompt-toolkit>=3.0.52
|
|
@@ -50,12 +51,17 @@ klaude [--model <name>] [--select-model]
|
|
|
50
51
|
|
|
51
52
|
**Options:**
|
|
52
53
|
- `--version`/`-V`: Show version and exit.
|
|
53
|
-
- `--model`/`-m`:
|
|
54
|
-
- `--select-model`/`-s`:
|
|
54
|
+
- `--model`/`-m`: Preferred model name (exact match picks immediately; otherwise opens the interactive selector filtered by this value).
|
|
55
|
+
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
55
56
|
- `--continue`/`-c`: Resume the most recent session.
|
|
56
57
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
57
58
|
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
58
59
|
|
|
60
|
+
**Model selection behavior:**
|
|
61
|
+
- Default: uses `main_model` from config.
|
|
62
|
+
- `--select-model`: always prompts you to pick.
|
|
63
|
+
- `--model <value>`: tries to resolve `<value>` to a single model; if it can't, it prompts with a filtered list (and falls back to showing all models if there are no matches).
|
|
64
|
+
|
|
59
65
|
**Debug Options:**
|
|
60
66
|
- `--debug`/`-d`: Enable debug mode with verbose logging and LLM trace.
|
|
61
67
|
- `--debug-filter`: Filter debug output by type (comma-separated).
|
|
@@ -63,7 +69,7 @@ klaude [--model <name>] [--select-model]
|
|
|
63
69
|
|
|
64
70
|
### Configuration
|
|
65
71
|
|
|
66
|
-
An example config will be created in `~/.klaude/config.yaml` when first run.
|
|
72
|
+
An example config will be created in `~/.klaude/klaude-config.yaml` when first run.
|
|
67
73
|
|
|
68
74
|
Open the configuration file in editor:
|
|
69
75
|
|
|
@@ -71,47 +77,137 @@ Open the configuration file in editor:
|
|
|
71
77
|
klaude config
|
|
72
78
|
```
|
|
73
79
|
|
|
74
|
-
An
|
|
80
|
+
An example config yaml:
|
|
75
81
|
|
|
76
82
|
```yaml
|
|
77
83
|
provider_list:
|
|
78
|
-
- provider_name: openrouter
|
|
84
|
+
- provider_name: openrouter
|
|
79
85
|
protocol: openrouter # support <responses|openrouter|anthropic|openai>
|
|
80
86
|
api_key: <your-openrouter-api-key>
|
|
87
|
+
|
|
88
|
+
- provider_name: openai-responses
|
|
89
|
+
protocol: responses
|
|
90
|
+
api_key: <your-openai-api-key>
|
|
91
|
+
|
|
92
|
+
- provider_name: anthropic
|
|
93
|
+
protocol: anthropic
|
|
94
|
+
api_key: <your-anthropic-api-key>
|
|
95
|
+
|
|
96
|
+
- provider_name: moonshot
|
|
97
|
+
protocol: anthropic
|
|
98
|
+
base_url: https://api.moonshot.cn/anthropic
|
|
99
|
+
api_key: <your-api-key>
|
|
100
|
+
|
|
101
|
+
- provider_name: deepseek
|
|
102
|
+
protocol: anthropic
|
|
103
|
+
base_url: https://api.deepseek.com/anthropic
|
|
104
|
+
api_key: <your-api-key>
|
|
105
|
+
|
|
81
106
|
model_list:
|
|
82
|
-
|
|
83
|
-
|
|
107
|
+
|
|
108
|
+
- model_name: deepseek
|
|
109
|
+
provider: deepseek
|
|
110
|
+
model_params:
|
|
111
|
+
model: deepseek-reasoner
|
|
112
|
+
context_limit: 128000
|
|
113
|
+
thinking:
|
|
114
|
+
type: enabled
|
|
115
|
+
budget_tokens: 8192
|
|
116
|
+
cost:
|
|
117
|
+
currency: CNY
|
|
118
|
+
input: 2
|
|
119
|
+
output: 3
|
|
120
|
+
cache_read: 0.2
|
|
121
|
+
|
|
122
|
+
- model_name: codex-max
|
|
123
|
+
provider: openai-responses
|
|
84
124
|
model_params:
|
|
85
|
-
model:
|
|
86
|
-
context_limit: 368000
|
|
125
|
+
model: gpt-5.1-codex-max
|
|
87
126
|
thinking:
|
|
88
127
|
reasoning_effort: medium
|
|
89
|
-
|
|
128
|
+
context_limit: 400000
|
|
129
|
+
max_tokens: 128000
|
|
130
|
+
cost:
|
|
131
|
+
input: 1.25
|
|
132
|
+
output: 10
|
|
133
|
+
cache_read: 0.13
|
|
134
|
+
|
|
135
|
+
- model_name: gpt-5.1
|
|
90
136
|
provider: openrouter
|
|
91
137
|
model_params:
|
|
92
138
|
model: openai/gpt-5.1
|
|
93
|
-
context_limit:
|
|
139
|
+
context_limit: 400000
|
|
140
|
+
max_tokens: 128000
|
|
141
|
+
verbosity: high
|
|
94
142
|
thinking:
|
|
95
143
|
reasoning_effort: high
|
|
96
|
-
|
|
144
|
+
cost:
|
|
145
|
+
input: 1.25
|
|
146
|
+
output: 10
|
|
147
|
+
cache_read: 0.13
|
|
148
|
+
|
|
149
|
+
- model_name: kimi@moonshot
|
|
150
|
+
provider: moonshot
|
|
151
|
+
model_params:
|
|
152
|
+
model: kimi-k2-thinking
|
|
153
|
+
context_limit: 262144
|
|
154
|
+
thinking:
|
|
155
|
+
type: enabled
|
|
156
|
+
budget_tokens: 8192
|
|
157
|
+
cost:
|
|
158
|
+
currency: CNY
|
|
159
|
+
input: 4
|
|
160
|
+
output: 16
|
|
161
|
+
cache_read: 1
|
|
162
|
+
|
|
163
|
+
- model_name: opus
|
|
97
164
|
provider: openrouter
|
|
98
165
|
model_params:
|
|
99
|
-
model: anthropic/claude-4.5-
|
|
100
|
-
context_limit:
|
|
166
|
+
model: anthropic/claude-4.5-opus
|
|
167
|
+
context_limit: 200000
|
|
101
168
|
provider_routing:
|
|
102
|
-
|
|
103
|
-
|
|
169
|
+
only: [ google-vertex ]
|
|
170
|
+
verbosity: high
|
|
171
|
+
thinking:
|
|
172
|
+
type: enabled
|
|
173
|
+
budget_tokens: 31999
|
|
174
|
+
cost:
|
|
175
|
+
input: 5
|
|
176
|
+
output: 25
|
|
177
|
+
cache_read: 0.5
|
|
178
|
+
cache_write: 6.25
|
|
179
|
+
|
|
180
|
+
- model_name: gemini
|
|
104
181
|
provider: openrouter
|
|
105
182
|
model_params:
|
|
106
|
-
model:
|
|
107
|
-
context_limit:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
183
|
+
model: google/gemini-3-pro-preview
|
|
184
|
+
context_limit: 1048576
|
|
185
|
+
thinking:
|
|
186
|
+
reasoning_effort: medium
|
|
187
|
+
cost:
|
|
188
|
+
input: 2
|
|
189
|
+
output: 12
|
|
190
|
+
cache_read: 0.2
|
|
191
|
+
|
|
192
|
+
- model_name: haiku
|
|
193
|
+
provider: anthropic
|
|
194
|
+
model_params:
|
|
195
|
+
model: claude-haiku-4-5-20251001
|
|
196
|
+
context_limit: 200000
|
|
197
|
+
cost:
|
|
198
|
+
input: 1
|
|
199
|
+
output: 5
|
|
200
|
+
cache_read: 0.1
|
|
201
|
+
cache_write: 1.25
|
|
202
|
+
|
|
203
|
+
main_model: opus
|
|
204
|
+
|
|
111
205
|
sub_agent_models:
|
|
112
|
-
oracle: gpt-5.1
|
|
206
|
+
oracle: gpt-5.1
|
|
113
207
|
explore: haiku
|
|
114
|
-
task:
|
|
208
|
+
task: opus
|
|
209
|
+
webagent: haiku
|
|
210
|
+
|
|
115
211
|
```
|
|
116
212
|
|
|
117
213
|
List configured providers and models:
|
|
@@ -172,5 +268,10 @@ klaude exec "what is 2+2?"
|
|
|
172
268
|
echo "hello world" | klaude exec
|
|
173
269
|
|
|
174
270
|
# With model selection
|
|
271
|
+
|
|
272
|
+
# Exact model name (non-interactive)
|
|
175
273
|
echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
176
|
-
|
|
274
|
+
|
|
275
|
+
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
276
|
+
echo "generate quicksort in python" | klaude exec --model gpt
|
|
277
|
+
```
|
|
@@ -33,12 +33,17 @@ klaude [--model <name>] [--select-model]
|
|
|
33
33
|
|
|
34
34
|
**Options:**
|
|
35
35
|
- `--version`/`-V`: Show version and exit.
|
|
36
|
-
- `--model`/`-m`:
|
|
37
|
-
- `--select-model`/`-s`:
|
|
36
|
+
- `--model`/`-m`: Preferred model name (exact match picks immediately; otherwise opens the interactive selector filtered by this value).
|
|
37
|
+
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
38
38
|
- `--continue`/`-c`: Resume the most recent session.
|
|
39
39
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
40
40
|
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
41
41
|
|
|
42
|
+
**Model selection behavior:**
|
|
43
|
+
- Default: uses `main_model` from config.
|
|
44
|
+
- `--select-model`: always prompts you to pick.
|
|
45
|
+
- `--model <value>`: tries to resolve `<value>` to a single model; if it can't, it prompts with a filtered list (and falls back to showing all models if there are no matches).
|
|
46
|
+
|
|
42
47
|
**Debug Options:**
|
|
43
48
|
- `--debug`/`-d`: Enable debug mode with verbose logging and LLM trace.
|
|
44
49
|
- `--debug-filter`: Filter debug output by type (comma-separated).
|
|
@@ -46,7 +51,7 @@ klaude [--model <name>] [--select-model]
|
|
|
46
51
|
|
|
47
52
|
### Configuration
|
|
48
53
|
|
|
49
|
-
An example config will be created in `~/.klaude/config.yaml` when first run.
|
|
54
|
+
An example config will be created in `~/.klaude/klaude-config.yaml` when first run.
|
|
50
55
|
|
|
51
56
|
Open the configuration file in editor:
|
|
52
57
|
|
|
@@ -54,47 +59,137 @@ Open the configuration file in editor:
|
|
|
54
59
|
klaude config
|
|
55
60
|
```
|
|
56
61
|
|
|
57
|
-
An
|
|
62
|
+
An example config yaml:
|
|
58
63
|
|
|
59
64
|
```yaml
|
|
60
65
|
provider_list:
|
|
61
|
-
- provider_name: openrouter
|
|
66
|
+
- provider_name: openrouter
|
|
62
67
|
protocol: openrouter # support <responses|openrouter|anthropic|openai>
|
|
63
68
|
api_key: <your-openrouter-api-key>
|
|
69
|
+
|
|
70
|
+
- provider_name: openai-responses
|
|
71
|
+
protocol: responses
|
|
72
|
+
api_key: <your-openai-api-key>
|
|
73
|
+
|
|
74
|
+
- provider_name: anthropic
|
|
75
|
+
protocol: anthropic
|
|
76
|
+
api_key: <your-anthropic-api-key>
|
|
77
|
+
|
|
78
|
+
- provider_name: moonshot
|
|
79
|
+
protocol: anthropic
|
|
80
|
+
base_url: https://api.moonshot.cn/anthropic
|
|
81
|
+
api_key: <your-api-key>
|
|
82
|
+
|
|
83
|
+
- provider_name: deepseek
|
|
84
|
+
protocol: anthropic
|
|
85
|
+
base_url: https://api.deepseek.com/anthropic
|
|
86
|
+
api_key: <your-api-key>
|
|
87
|
+
|
|
64
88
|
model_list:
|
|
65
|
-
|
|
66
|
-
|
|
89
|
+
|
|
90
|
+
- model_name: deepseek
|
|
91
|
+
provider: deepseek
|
|
92
|
+
model_params:
|
|
93
|
+
model: deepseek-reasoner
|
|
94
|
+
context_limit: 128000
|
|
95
|
+
thinking:
|
|
96
|
+
type: enabled
|
|
97
|
+
budget_tokens: 8192
|
|
98
|
+
cost:
|
|
99
|
+
currency: CNY
|
|
100
|
+
input: 2
|
|
101
|
+
output: 3
|
|
102
|
+
cache_read: 0.2
|
|
103
|
+
|
|
104
|
+
- model_name: codex-max
|
|
105
|
+
provider: openai-responses
|
|
67
106
|
model_params:
|
|
68
|
-
model:
|
|
69
|
-
context_limit: 368000
|
|
107
|
+
model: gpt-5.1-codex-max
|
|
70
108
|
thinking:
|
|
71
109
|
reasoning_effort: medium
|
|
72
|
-
|
|
110
|
+
context_limit: 400000
|
|
111
|
+
max_tokens: 128000
|
|
112
|
+
cost:
|
|
113
|
+
input: 1.25
|
|
114
|
+
output: 10
|
|
115
|
+
cache_read: 0.13
|
|
116
|
+
|
|
117
|
+
- model_name: gpt-5.1
|
|
73
118
|
provider: openrouter
|
|
74
119
|
model_params:
|
|
75
120
|
model: openai/gpt-5.1
|
|
76
|
-
context_limit:
|
|
121
|
+
context_limit: 400000
|
|
122
|
+
max_tokens: 128000
|
|
123
|
+
verbosity: high
|
|
77
124
|
thinking:
|
|
78
125
|
reasoning_effort: high
|
|
79
|
-
|
|
126
|
+
cost:
|
|
127
|
+
input: 1.25
|
|
128
|
+
output: 10
|
|
129
|
+
cache_read: 0.13
|
|
130
|
+
|
|
131
|
+
- model_name: kimi@moonshot
|
|
132
|
+
provider: moonshot
|
|
133
|
+
model_params:
|
|
134
|
+
model: kimi-k2-thinking
|
|
135
|
+
context_limit: 262144
|
|
136
|
+
thinking:
|
|
137
|
+
type: enabled
|
|
138
|
+
budget_tokens: 8192
|
|
139
|
+
cost:
|
|
140
|
+
currency: CNY
|
|
141
|
+
input: 4
|
|
142
|
+
output: 16
|
|
143
|
+
cache_read: 1
|
|
144
|
+
|
|
145
|
+
- model_name: opus
|
|
80
146
|
provider: openrouter
|
|
81
147
|
model_params:
|
|
82
|
-
model: anthropic/claude-4.5-
|
|
83
|
-
context_limit:
|
|
148
|
+
model: anthropic/claude-4.5-opus
|
|
149
|
+
context_limit: 200000
|
|
84
150
|
provider_routing:
|
|
85
|
-
|
|
86
|
-
|
|
151
|
+
only: [ google-vertex ]
|
|
152
|
+
verbosity: high
|
|
153
|
+
thinking:
|
|
154
|
+
type: enabled
|
|
155
|
+
budget_tokens: 31999
|
|
156
|
+
cost:
|
|
157
|
+
input: 5
|
|
158
|
+
output: 25
|
|
159
|
+
cache_read: 0.5
|
|
160
|
+
cache_write: 6.25
|
|
161
|
+
|
|
162
|
+
- model_name: gemini
|
|
87
163
|
provider: openrouter
|
|
88
164
|
model_params:
|
|
89
|
-
model:
|
|
90
|
-
context_limit:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
165
|
+
model: google/gemini-3-pro-preview
|
|
166
|
+
context_limit: 1048576
|
|
167
|
+
thinking:
|
|
168
|
+
reasoning_effort: medium
|
|
169
|
+
cost:
|
|
170
|
+
input: 2
|
|
171
|
+
output: 12
|
|
172
|
+
cache_read: 0.2
|
|
173
|
+
|
|
174
|
+
- model_name: haiku
|
|
175
|
+
provider: anthropic
|
|
176
|
+
model_params:
|
|
177
|
+
model: claude-haiku-4-5-20251001
|
|
178
|
+
context_limit: 200000
|
|
179
|
+
cost:
|
|
180
|
+
input: 1
|
|
181
|
+
output: 5
|
|
182
|
+
cache_read: 0.1
|
|
183
|
+
cache_write: 1.25
|
|
184
|
+
|
|
185
|
+
main_model: opus
|
|
186
|
+
|
|
94
187
|
sub_agent_models:
|
|
95
|
-
oracle: gpt-5.1
|
|
188
|
+
oracle: gpt-5.1
|
|
96
189
|
explore: haiku
|
|
97
|
-
task:
|
|
190
|
+
task: opus
|
|
191
|
+
webagent: haiku
|
|
192
|
+
|
|
98
193
|
```
|
|
99
194
|
|
|
100
195
|
List configured providers and models:
|
|
@@ -155,5 +250,10 @@ klaude exec "what is 2+2?"
|
|
|
155
250
|
echo "hello world" | klaude exec
|
|
156
251
|
|
|
157
252
|
# With model selection
|
|
253
|
+
|
|
254
|
+
# Exact model name (non-interactive)
|
|
158
255
|
echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
159
|
-
|
|
256
|
+
|
|
257
|
+
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
258
|
+
echo "generate quicksort in python" | klaude exec --model gpt
|
|
259
|
+
```
|
|
@@ -4,12 +4,13 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "klaude-code"
|
|
7
|
-
version = "1.2.
|
|
7
|
+
version = "1.2.18"
|
|
8
8
|
description = "Add your description here"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
11
11
|
dependencies = [
|
|
12
12
|
"anthropic>=0.66.0",
|
|
13
|
+
"ddgs>=9.9.3",
|
|
13
14
|
"openai>=1.102.0",
|
|
14
15
|
"pillow>=12.0.0",
|
|
15
16
|
"prompt-toolkit>=3.0.52",
|
|
@@ -76,10 +77,14 @@ name = "Layered architecture"
|
|
|
76
77
|
type = "layers"
|
|
77
78
|
layers = [
|
|
78
79
|
"klaude_code.cli",
|
|
80
|
+
"klaude_code.ui",
|
|
79
81
|
"klaude_code.core",
|
|
82
|
+
"klaude_code.command",
|
|
80
83
|
"klaude_code.session",
|
|
81
84
|
"klaude_code.config",
|
|
82
85
|
"klaude_code.llm",
|
|
83
86
|
"klaude_code.protocol",
|
|
87
|
+
"klaude_code.trace",
|
|
88
|
+
"klaude_code.auth",
|
|
84
89
|
"klaude_code.const",
|
|
85
90
|
]
|
|
@@ -12,7 +12,7 @@ from klaude_code.trace import log
|
|
|
12
12
|
|
|
13
13
|
def list_models() -> None:
|
|
14
14
|
"""List all models and providers configuration"""
|
|
15
|
-
from klaude_code.
|
|
15
|
+
from klaude_code.cli.list_model import display_models_and_providers
|
|
16
16
|
from klaude_code.ui.terminal.color import is_light_terminal_background
|
|
17
17
|
|
|
18
18
|
config = load_config()
|
|
@@ -48,7 +48,7 @@ def open_log_file_in_editor(path: Path) -> None:
|
|
|
48
48
|
editor = os.environ.get("EDITOR")
|
|
49
49
|
|
|
50
50
|
if not editor:
|
|
51
|
-
for cmd in ["open", "xdg-open", "code", "
|
|
51
|
+
for cmd in ["open", "xdg-open", "code", "TextEdit", "notepad"]:
|
|
52
52
|
try:
|
|
53
53
|
subprocess.run(["which", cmd], check=True, capture_output=True)
|
|
54
54
|
editor = cmd
|
|
@@ -11,7 +11,6 @@ from klaude_code.cli.auth_cmd import register_auth_commands
|
|
|
11
11
|
from klaude_code.cli.config_cmd import register_config_commands
|
|
12
12
|
from klaude_code.cli.debug import DEBUG_FILTER_HELP, open_log_file_in_editor, resolve_debug_settings
|
|
13
13
|
from klaude_code.cli.session_cmd import register_session_commands
|
|
14
|
-
from klaude_code.config import load_config
|
|
15
14
|
from klaude_code.session import Session, resume_select_session
|
|
16
15
|
from klaude_code.trace import DebugType, prepare_debug_log_file
|
|
17
16
|
|
|
@@ -157,13 +156,8 @@ def exec_command(
|
|
|
157
156
|
from klaude_code.config.select_model import select_model_from_config
|
|
158
157
|
|
|
159
158
|
chosen_model = model
|
|
160
|
-
if select_model:
|
|
161
|
-
|
|
162
|
-
config = load_config()
|
|
163
|
-
if config is None:
|
|
164
|
-
raise typer.Exit(1)
|
|
165
|
-
default_name = model or config.main_model
|
|
166
|
-
chosen_model = select_model_from_config(preferred=default_name)
|
|
159
|
+
if model or select_model:
|
|
160
|
+
chosen_model = select_model_from_config(preferred=model)
|
|
167
161
|
if chosen_model is None:
|
|
168
162
|
return
|
|
169
163
|
|
|
@@ -243,7 +237,7 @@ def main_callback(
|
|
|
243
237
|
setup_terminal_title()
|
|
244
238
|
|
|
245
239
|
chosen_model = model
|
|
246
|
-
if select_model:
|
|
240
|
+
if model or select_model:
|
|
247
241
|
chosen_model = select_model_from_config(preferred=model)
|
|
248
242
|
if chosen_model is None:
|
|
249
243
|
return
|
|
@@ -10,7 +10,7 @@ from rich.text import Text
|
|
|
10
10
|
from klaude_code import ui
|
|
11
11
|
from klaude_code.command import has_interactive_command
|
|
12
12
|
from klaude_code.config import Config, load_config
|
|
13
|
-
from klaude_code.core.agent import
|
|
13
|
+
from klaude_code.core.agent import DefaultModelProfileProvider, VanillaModelProfileProvider
|
|
14
14
|
from klaude_code.core.executor import Executor
|
|
15
15
|
from klaude_code.core.manager import build_llm_clients
|
|
16
16
|
from klaude_code.protocol import events, op
|
|
@@ -98,8 +98,10 @@ async def initialize_app_components(init_config: AppInitConfig) -> AppComponents
|
|
|
98
98
|
executor_task = asyncio.create_task(executor.start())
|
|
99
99
|
|
|
100
100
|
theme: str | None = config.theme
|
|
101
|
-
if theme is None:
|
|
101
|
+
if theme is None and not init_config.is_exec_mode:
|
|
102
102
|
# Auto-detect theme from terminal background when config does not specify a theme.
|
|
103
|
+
# Skip detection in exec mode to avoid TTY race conditions with parent process's
|
|
104
|
+
# ESC monitor when running as a subprocess.
|
|
103
105
|
detected = is_light_terminal_background()
|
|
104
106
|
if detected is True:
|
|
105
107
|
theme = "light"
|
|
@@ -145,8 +147,8 @@ async def initialize_session(
|
|
|
145
147
|
await executor.submit_and_wait(op.InitAgentOperation(session_id=session_id))
|
|
146
148
|
await event_queue.join()
|
|
147
149
|
|
|
148
|
-
|
|
149
|
-
return
|
|
150
|
+
active_session_id = executor.context.current_session_id()
|
|
151
|
+
return active_session_id or session_id
|
|
150
152
|
|
|
151
153
|
|
|
152
154
|
async def cleanup_app_components(components: AppComponents) -> None:
|
|
@@ -214,16 +216,12 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
|
|
|
214
216
|
|
|
215
217
|
# Create status provider for bottom toolbar
|
|
216
218
|
def _status_provider() -> REPLStatusSnapshot:
|
|
217
|
-
agent: Agent | None = None
|
|
218
|
-
# Get the first active agent (there should only be one in interactive mode)
|
|
219
|
-
active_agents = components.executor.context.active_agents
|
|
220
|
-
if active_agents:
|
|
221
|
-
agent = next(iter(active_agents.values()), None)
|
|
222
|
-
|
|
223
219
|
# Check for updates (returns None if uv not available)
|
|
224
220
|
update_message = get_update_message()
|
|
225
221
|
|
|
226
|
-
return build_repl_status_snapshot(
|
|
222
|
+
return build_repl_status_snapshot(
|
|
223
|
+
agent=components.executor.context.current_agent, update_message=update_message
|
|
224
|
+
)
|
|
227
225
|
|
|
228
226
|
# Set up input provider for interactive mode
|
|
229
227
|
input_provider: ui.InputProviderABC = ui.PromptToolkitInput(status_provider=_status_provider)
|
|
@@ -261,7 +259,14 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
|
|
|
261
259
|
restore_sigint = install_sigint_double_press_exit(_show_toast_once, _hide_progress)
|
|
262
260
|
|
|
263
261
|
try:
|
|
264
|
-
|
|
262
|
+
await initialize_session(components.executor, components.event_queue, session_id=session_id)
|
|
263
|
+
|
|
264
|
+
def _get_active_session_id() -> str | None:
|
|
265
|
+
"""Get the current active session ID dynamically.
|
|
266
|
+
|
|
267
|
+
This is necessary because /clear command creates a new session with a different ID.
|
|
268
|
+
"""
|
|
269
|
+
return components.executor.context.current_session_id()
|
|
265
270
|
|
|
266
271
|
# Input
|
|
267
272
|
await input_provider.start()
|
|
@@ -272,6 +277,8 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
|
|
|
272
277
|
elif user_input.text.strip() == "":
|
|
273
278
|
continue
|
|
274
279
|
# Submit user input operation - directly use the payload from iter_inputs
|
|
280
|
+
# Use dynamic session_id lookup to handle /clear creating new sessions
|
|
281
|
+
active_session_id = _get_active_session_id()
|
|
275
282
|
submission_id = await components.executor.submit(
|
|
276
283
|
op.UserInputOperation(input=user_input, session_id=active_session_id)
|
|
277
284
|
)
|
|
@@ -282,7 +289,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
|
|
|
282
289
|
else:
|
|
283
290
|
# Esc monitor for long-running, interruptible operations
|
|
284
291
|
async def _on_esc_interrupt() -> None:
|
|
285
|
-
await components.executor.submit(op.InterruptOperation(target_session_id=
|
|
292
|
+
await components.executor.submit(op.InterruptOperation(target_session_id=_get_active_session_id()))
|
|
286
293
|
|
|
287
294
|
stop_event, esc_task = start_esc_interrupt_monitor(_on_esc_interrupt)
|
|
288
295
|
# Wait for this specific task to complete before accepting next input
|
|
@@ -28,8 +28,10 @@ def ensure_commands_loaded() -> None:
|
|
|
28
28
|
|
|
29
29
|
# Import and register commands in display order
|
|
30
30
|
from .clear_cmd import ClearCommand
|
|
31
|
+
from .debug_cmd import DebugCommand
|
|
31
32
|
from .diff_cmd import DiffCommand
|
|
32
33
|
from .export_cmd import ExportCommand
|
|
34
|
+
from .export_online_cmd import ExportOnlineCommand
|
|
33
35
|
from .help_cmd import HelpCommand
|
|
34
36
|
from .model_cmd import ModelCommand
|
|
35
37
|
from .refresh_cmd import RefreshTerminalCommand
|
|
@@ -40,16 +42,18 @@ def ensure_commands_loaded() -> None:
|
|
|
40
42
|
|
|
41
43
|
# Register in desired display order
|
|
42
44
|
register(ExportCommand())
|
|
45
|
+
register(ExportOnlineCommand())
|
|
43
46
|
register(RefreshTerminalCommand())
|
|
44
47
|
register(ThinkingCommand())
|
|
45
48
|
register(ModelCommand())
|
|
46
49
|
load_prompt_commands()
|
|
47
|
-
register(ClearCommand())
|
|
48
50
|
register(StatusCommand())
|
|
49
51
|
register(DiffCommand())
|
|
50
52
|
register(HelpCommand())
|
|
51
53
|
register(ReleaseNotesCommand())
|
|
52
54
|
register(TerminalSetupCommand())
|
|
55
|
+
register(DebugCommand())
|
|
56
|
+
register(ClearCommand())
|
|
53
57
|
|
|
54
58
|
# Load prompt-based commands (appended after built-in commands)
|
|
55
59
|
|
|
@@ -58,8 +62,10 @@ def ensure_commands_loaded() -> None:
|
|
|
58
62
|
def __getattr__(name: str) -> object:
|
|
59
63
|
_commands_map = {
|
|
60
64
|
"ClearCommand": "clear_cmd",
|
|
65
|
+
"DebugCommand": "debug_cmd",
|
|
61
66
|
"DiffCommand": "diff_cmd",
|
|
62
67
|
"ExportCommand": "export_cmd",
|
|
68
|
+
"ExportOnlineCommand": "export_online_cmd",
|
|
63
69
|
"HelpCommand": "help_cmd",
|
|
64
70
|
"ModelCommand": "model_cmd",
|
|
65
71
|
"RefreshTerminalCommand": "refresh_cmd",
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from klaude_code.command.command_abc import CommandABC, CommandResult, InputAction
|
|
1
|
+
from klaude_code.command.command_abc import Agent, CommandABC, CommandResult, InputAction
|
|
4
2
|
from klaude_code.protocol import commands
|
|
5
3
|
|
|
6
|
-
if TYPE_CHECKING:
|
|
7
|
-
from klaude_code.core.agent import Agent
|
|
8
|
-
|
|
9
4
|
|
|
10
5
|
class ClearCommand(CommandABC):
|
|
11
6
|
"""Clear current session and start a new conversation"""
|
|
@@ -18,5 +13,5 @@ class ClearCommand(CommandABC):
|
|
|
18
13
|
def summary(self) -> str:
|
|
19
14
|
return "Clear conversation history and free up context"
|
|
20
15
|
|
|
21
|
-
async def run(self, raw: str, agent:
|
|
16
|
+
async def run(self, raw: str, agent: Agent) -> CommandResult:
|
|
22
17
|
return CommandResult(actions=[InputAction.clear()])
|