klaude-code 2.1.1__tar.gz → 2.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-2.1.1 → klaude_code-2.3.0}/PKG-INFO +16 -81
- {klaude_code-2.1.1 → klaude_code-2.3.0}/README.md +15 -80
- {klaude_code-2.1.1 → klaude_code-2.3.0}/pyproject.toml +11 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/app/__init__.py +1 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/app/runtime.py +13 -41
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/list_model.py +27 -10
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/main.py +42 -159
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/assets/builtin_config.yaml +36 -14
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/config.py +144 -7
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/select_model.py +38 -13
- klaude_code-2.3.0/src/klaude_code/config/sub_agent_model_helper.py +217 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/const.py +2 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/agent_profile.py +71 -5
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/executor.py +75 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/manager/llm_clients_builder.py +18 -12
- klaude_code-2.3.0/src/klaude_code/core/prompts/prompt-nano-banana.md +1 -0
- klaude_code-2.3.0/src/klaude_code/core/tool/shell/command_safety.py +175 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/sub_agent_tool.py +2 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/turn.py +1 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/anthropic/client.py +8 -5
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/anthropic/input.py +54 -29
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/google/client.py +2 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/google/input.py +23 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openai_compatible/input.py +22 -13
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openai_compatible/stream.py +1 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openrouter/input.py +37 -25
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/responses/client.py +1 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/responses/input.py +96 -57
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/commands.py +1 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/system.py +4 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/message.py +2 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/op.py +17 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/op_handler.py +5 -0
- klaude_code-2.3.0/src/klaude_code/protocol/sub_agent/AGENTS.md +28 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/sub_agent/__init__.py +10 -14
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/sub_agent/image_gen.py +2 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/codec.py +2 -6
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/session.py +9 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/assets/create-plan/SKILL.md +3 -5
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/__init__.py +7 -10
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/clear_cmd.py +1 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/command_abc.py +1 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/copy_cmd.py +1 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/fork_session_cmd.py +4 -4
- klaude_code-2.3.0/src/klaude_code/tui/command/model_cmd.py +57 -0
- klaude_code-2.3.0/src/klaude_code/tui/command/model_select.py +144 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/refresh_cmd.py +1 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/resume_cmd.py +3 -4
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/status_cmd.py +1 -1
- klaude_code-2.3.0/src/klaude_code/tui/command/sub_agent_model_cmd.py +190 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/bash_syntax.py +1 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/common.py +1 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/developer.py +10 -15
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/metadata.py +2 -64
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/cjk_wrap.py +3 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/status.py +49 -3
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/theme.py +4 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/sub_agent.py +25 -46
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/user_input.py +9 -21
- klaude_code-2.3.0/src/klaude_code/tui/components/welcome.py +99 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/input/prompt_toolkit.py +14 -1
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/renderer.py +2 -3
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/runner.py +2 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/selector.py +8 -18
- klaude_code-2.3.0/src/klaude_code/ui/__init__.py +18 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/common.py +3 -2
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/core/display.py +2 -2
- klaude_code-2.1.1/src/klaude_code/core/tool/shell/command_safety.py +0 -360
- klaude_code-2.1.1/src/klaude_code/tui/command/help_cmd.py +0 -51
- klaude_code-2.1.1/src/klaude_code/tui/command/model_cmd.py +0 -94
- klaude_code-2.1.1/src/klaude_code/tui/command/model_select.py +0 -84
- klaude_code-2.1.1/src/klaude_code/tui/command/prompt-commit.md +0 -82
- klaude_code-2.1.1/src/klaude_code/tui/command/release_notes_cmd.py +0 -85
- klaude_code-2.1.1/src/klaude_code/ui/__init__.py +0 -42
- klaude_code-2.1.1/src/klaude_code/ui/exec_mode.py +0 -60
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/base.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/claude/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/claude/exceptions.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/claude/oauth.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/claude/token_manager.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/config_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/cost_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/debug.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/self_update.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/cli/session_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/assets/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/builtin_config.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/config/thinking.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/manager/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-sub-agent-image-gen.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/reminders.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/task.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/context.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/read_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/report_back_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/shell/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/todo/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/tool_registry.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/tool_runner.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/truncation.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/bedrock/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/bedrock/client.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/claude/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/claude/client.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/codex/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/codex/client.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/google/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/image.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/input_common.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openrouter/client.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/registry.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/responses/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/llm/usage.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/log.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/base.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/chat.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/lifecycle.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/metadata.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/streaming.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/events/tools.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/llm_param.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/model.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/sub_agent/task.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/sub_agent/web.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/protocol/tools.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/export.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/store.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/templates/export_session.html +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/loader.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/manager.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/skill/system_skills.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/debug_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/export_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/export_online_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/prompt-init.md +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/prompt_command.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/registry.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/terminal_setup_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/command/thinking_cmd.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/commands.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/assistant.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/diffs.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/errors.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/mermaid_viewer.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/code_panel.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/live.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/markdown.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/quote.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/rich/searchable_text.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/thinking.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/components/tools.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/display.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/input/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/input/clipboard.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/input/completers.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/input/key_bindings.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/machine.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/color.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/control.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/image.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/notifier.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/tui/terminal/progress_bar.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/debug_mode.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/ui/terminal/title.py +0 -0
- {klaude_code-2.1.1 → klaude_code-2.3.0}/src/klaude_code/update.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: klaude-code
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Minimal code agent CLI
|
|
5
5
|
Requires-Dist: anthropic>=0.66.0
|
|
6
6
|
Requires-Dist: chardet>=5.2.0
|
|
@@ -25,21 +25,19 @@ Description-Content-Type: text/markdown
|
|
|
25
25
|
Minimal code agent CLI.
|
|
26
26
|
|
|
27
27
|
## Features
|
|
28
|
-
- **Multi-provider**: Anthropic, OpenAI Responses API, OpenRouter
|
|
28
|
+
- **Multi-provider**: Anthropic Message API, OpenAI Responses API, OpenRouter, Claude Max OAuth and ChatGPT Codex OAuth etc.
|
|
29
29
|
- **Keep reasoning item in context**: Interleaved thinking support
|
|
30
|
-
- **Model-aware tools**: Claude Code
|
|
31
|
-
- **
|
|
30
|
+
- **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
|
|
31
|
+
- **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
|
|
32
|
+
- **Sub-agents**: Task, Explore, Web, ImageGen
|
|
33
|
+
- **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
|
|
32
34
|
- **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
|
|
33
|
-
- **Reminders**: Cooldown-based todo tracking and instruction reinforcement
|
|
34
35
|
- **External file sync**: Monitoring for external edits (linter, manual)
|
|
35
36
|
- **Interrupt handling**: Ctrl+C preserves partial responses and synthesizes tool cancellation results
|
|
36
37
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
37
|
-
- **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
38
|
+
- **Agent Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
38
39
|
- **Sessions**: Resumable with `--continue`
|
|
39
|
-
- **
|
|
40
|
-
- **Version update check**: Background PyPI version check with upgrade prompts
|
|
41
|
-
- **Terminal title**: Shows current directory and model name
|
|
42
|
-
- **Mermaid diagrams**: Interactive local HTML viewer with zoom, pan, and SVG export
|
|
40
|
+
- **Mermaid diagrams**: Terminal image preview and Interactive local HTML viewer with zoom, pan, and SVG export
|
|
43
41
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
44
42
|
|
|
45
43
|
## Installation
|
|
@@ -59,32 +57,23 @@ Or use the built-in alias command:
|
|
|
59
57
|
```bash
|
|
60
58
|
klaude update
|
|
61
59
|
klaude upgrade
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
To show version:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
60
|
klaude --version
|
|
68
|
-
|
|
69
|
-
klaude version
|
|
61
|
+
|
|
70
62
|
```
|
|
71
63
|
|
|
72
64
|
## Usage
|
|
73
65
|
|
|
74
|
-
### Interactive Mode
|
|
75
|
-
|
|
76
66
|
```bash
|
|
77
67
|
klaude [--model <name>] [--select-model]
|
|
78
68
|
```
|
|
79
69
|
|
|
80
70
|
**Options:**
|
|
81
|
-
- `--version`/`-V`/`-v`: Show version and exit.
|
|
82
71
|
- `--model`/`-m`: Preferred model name (exact match picks immediately; otherwise opens the interactive selector filtered by this value).
|
|
83
72
|
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
84
73
|
- `--continue`/`-c`: Resume the most recent session.
|
|
85
74
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
86
75
|
- `--resume-by-id <id>`: Resume a session by its ID directly.
|
|
87
|
-
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
76
|
+
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit, Write) and no system prompts.
|
|
88
77
|
|
|
89
78
|
**Model selection behavior:**
|
|
90
79
|
- Default: uses `main_model` from config.
|
|
@@ -255,48 +244,16 @@ provider_list:
|
|
|
255
244
|
context_limit: 128000
|
|
256
245
|
```
|
|
257
246
|
|
|
258
|
-
##### Full Example
|
|
259
|
-
|
|
260
|
-
```yaml
|
|
261
|
-
# User configuration - merged with built-in config
|
|
262
|
-
main_model: opus
|
|
263
|
-
|
|
264
|
-
sub_agent_models:
|
|
265
|
-
explore: sonnet
|
|
266
|
-
task: opus
|
|
267
|
-
webagent: sonnet
|
|
268
|
-
|
|
269
|
-
provider_list:
|
|
270
|
-
# Add models to built-in openrouter
|
|
271
|
-
- provider_name: openrouter
|
|
272
|
-
model_list:
|
|
273
|
-
- model_name: qwen-coder
|
|
274
|
-
model_params:
|
|
275
|
-
model: qwen/qwen-2.5-coder-32b-instruct
|
|
276
|
-
context_limit: 131072
|
|
277
|
-
|
|
278
|
-
# Add a completely new provider
|
|
279
|
-
- provider_name: local-ollama
|
|
280
|
-
protocol: openai
|
|
281
|
-
base_url: http://localhost:11434/v1
|
|
282
|
-
api_key: ollama
|
|
283
|
-
model_list:
|
|
284
|
-
- model_name: local-llama
|
|
285
|
-
model_params:
|
|
286
|
-
model: llama3.2
|
|
287
|
-
context_limit: 8192
|
|
288
|
-
```
|
|
289
|
-
|
|
290
247
|
##### Supported Protocols
|
|
291
248
|
|
|
292
|
-
- `anthropic` - Anthropic
|
|
249
|
+
- `anthropic` - Anthropic Messages API
|
|
293
250
|
- `claude_oauth` - Claude OAuth (for Claude Pro/Max subscribers)
|
|
294
|
-
- `openai` - OpenAI
|
|
251
|
+
- `openai` - OpenAI Chat Completion API
|
|
295
252
|
- `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
|
|
296
|
-
- `openrouter` - OpenRouter API
|
|
297
|
-
- `google` - Google Gemini API
|
|
298
|
-
- `bedrock` - AWS Bedrock (uses AWS credentials instead of api_key)
|
|
299
253
|
- `codex_oauth` - OpenAI Codex CLI (OAuth-based, for ChatGPT Pro subscribers)
|
|
254
|
+
- `openrouter` - OpenRouter API (handling `reasoning_details` for interleaved thinking)
|
|
255
|
+
- `google` - Google Gemini API
|
|
256
|
+
- `bedrock` - AWS Bedrock for Claude(uses AWS credentials instead of api_key)
|
|
300
257
|
|
|
301
258
|
List configured providers and models:
|
|
302
259
|
|
|
@@ -338,6 +295,7 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
338
295
|
- `/model` - Switch the active LLM during the session.
|
|
339
296
|
- `/thinking` - Configure model thinking/reasoning level.
|
|
340
297
|
- `/clear` - Clear the current conversation context.
|
|
298
|
+
- `/copy` - Copy last assistant message.
|
|
341
299
|
- `/status` - Show session usage statistics (cost, tokens, model breakdown).
|
|
342
300
|
- `/resume` - Select and resume a previous session.
|
|
343
301
|
- `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
|
|
@@ -364,29 +322,6 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
364
322
|
| `Backspace` | Delete character or selected text |
|
|
365
323
|
| `c` (with selection) | Copy selected text to clipboard |
|
|
366
324
|
|
|
367
|
-
### Non-Interactive Headless Mode (exec)
|
|
368
|
-
|
|
369
|
-
Execute a single command without starting the interactive REPL:
|
|
370
|
-
|
|
371
|
-
```bash
|
|
372
|
-
# Direct input
|
|
373
|
-
klaude exec "what is 2+2?"
|
|
374
|
-
|
|
375
|
-
# Pipe input
|
|
376
|
-
echo "hello world" | klaude exec
|
|
377
|
-
|
|
378
|
-
# With model selection
|
|
379
|
-
|
|
380
|
-
# Exact model name (non-interactive)
|
|
381
|
-
echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
382
|
-
|
|
383
|
-
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
384
|
-
echo "generate quicksort in python" | klaude exec --model gpt
|
|
385
|
-
|
|
386
|
-
# Stream all events as JSON lines (for programmatic processing)
|
|
387
|
-
klaude exec "what is 2+2?" --stream-json
|
|
388
|
-
```
|
|
389
|
-
|
|
390
325
|
### Sub-Agents
|
|
391
326
|
|
|
392
327
|
The main agent can spawn specialized sub-agents for specific tasks:
|
|
@@ -3,21 +3,19 @@
|
|
|
3
3
|
Minimal code agent CLI.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
|
-
- **Multi-provider**: Anthropic, OpenAI Responses API, OpenRouter
|
|
6
|
+
- **Multi-provider**: Anthropic Message API, OpenAI Responses API, OpenRouter, Claude Max OAuth and ChatGPT Codex OAuth etc.
|
|
7
7
|
- **Keep reasoning item in context**: Interleaved thinking support
|
|
8
|
-
- **Model-aware tools**: Claude Code
|
|
9
|
-
- **
|
|
8
|
+
- **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
|
|
9
|
+
- **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
|
|
10
|
+
- **Sub-agents**: Task, Explore, Web, ImageGen
|
|
11
|
+
- **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
|
|
10
12
|
- **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
|
|
11
|
-
- **Reminders**: Cooldown-based todo tracking and instruction reinforcement
|
|
12
13
|
- **External file sync**: Monitoring for external edits (linter, manual)
|
|
13
14
|
- **Interrupt handling**: Ctrl+C preserves partial responses and synthesizes tool cancellation results
|
|
14
15
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
15
|
-
- **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
16
|
+
- **Agent Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
16
17
|
- **Sessions**: Resumable with `--continue`
|
|
17
|
-
- **
|
|
18
|
-
- **Version update check**: Background PyPI version check with upgrade prompts
|
|
19
|
-
- **Terminal title**: Shows current directory and model name
|
|
20
|
-
- **Mermaid diagrams**: Interactive local HTML viewer with zoom, pan, and SVG export
|
|
18
|
+
- **Mermaid diagrams**: Terminal image preview and Interactive local HTML viewer with zoom, pan, and SVG export
|
|
21
19
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
22
20
|
|
|
23
21
|
## Installation
|
|
@@ -37,32 +35,23 @@ Or use the built-in alias command:
|
|
|
37
35
|
```bash
|
|
38
36
|
klaude update
|
|
39
37
|
klaude upgrade
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
To show version:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
38
|
klaude --version
|
|
46
|
-
|
|
47
|
-
klaude version
|
|
39
|
+
|
|
48
40
|
```
|
|
49
41
|
|
|
50
42
|
## Usage
|
|
51
43
|
|
|
52
|
-
### Interactive Mode
|
|
53
|
-
|
|
54
44
|
```bash
|
|
55
45
|
klaude [--model <name>] [--select-model]
|
|
56
46
|
```
|
|
57
47
|
|
|
58
48
|
**Options:**
|
|
59
|
-
- `--version`/`-V`/`-v`: Show version and exit.
|
|
60
49
|
- `--model`/`-m`: Preferred model name (exact match picks immediately; otherwise opens the interactive selector filtered by this value).
|
|
61
50
|
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
62
51
|
- `--continue`/`-c`: Resume the most recent session.
|
|
63
52
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
64
53
|
- `--resume-by-id <id>`: Resume a session by its ID directly.
|
|
65
|
-
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
54
|
+
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit, Write) and no system prompts.
|
|
66
55
|
|
|
67
56
|
**Model selection behavior:**
|
|
68
57
|
- Default: uses `main_model` from config.
|
|
@@ -233,48 +222,16 @@ provider_list:
|
|
|
233
222
|
context_limit: 128000
|
|
234
223
|
```
|
|
235
224
|
|
|
236
|
-
##### Full Example
|
|
237
|
-
|
|
238
|
-
```yaml
|
|
239
|
-
# User configuration - merged with built-in config
|
|
240
|
-
main_model: opus
|
|
241
|
-
|
|
242
|
-
sub_agent_models:
|
|
243
|
-
explore: sonnet
|
|
244
|
-
task: opus
|
|
245
|
-
webagent: sonnet
|
|
246
|
-
|
|
247
|
-
provider_list:
|
|
248
|
-
# Add models to built-in openrouter
|
|
249
|
-
- provider_name: openrouter
|
|
250
|
-
model_list:
|
|
251
|
-
- model_name: qwen-coder
|
|
252
|
-
model_params:
|
|
253
|
-
model: qwen/qwen-2.5-coder-32b-instruct
|
|
254
|
-
context_limit: 131072
|
|
255
|
-
|
|
256
|
-
# Add a completely new provider
|
|
257
|
-
- provider_name: local-ollama
|
|
258
|
-
protocol: openai
|
|
259
|
-
base_url: http://localhost:11434/v1
|
|
260
|
-
api_key: ollama
|
|
261
|
-
model_list:
|
|
262
|
-
- model_name: local-llama
|
|
263
|
-
model_params:
|
|
264
|
-
model: llama3.2
|
|
265
|
-
context_limit: 8192
|
|
266
|
-
```
|
|
267
|
-
|
|
268
225
|
##### Supported Protocols
|
|
269
226
|
|
|
270
|
-
- `anthropic` - Anthropic
|
|
227
|
+
- `anthropic` - Anthropic Messages API
|
|
271
228
|
- `claude_oauth` - Claude OAuth (for Claude Pro/Max subscribers)
|
|
272
|
-
- `openai` - OpenAI
|
|
229
|
+
- `openai` - OpenAI Chat Completion API
|
|
273
230
|
- `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
|
|
274
|
-
- `openrouter` - OpenRouter API
|
|
275
|
-
- `google` - Google Gemini API
|
|
276
|
-
- `bedrock` - AWS Bedrock (uses AWS credentials instead of api_key)
|
|
277
231
|
- `codex_oauth` - OpenAI Codex CLI (OAuth-based, for ChatGPT Pro subscribers)
|
|
232
|
+
- `openrouter` - OpenRouter API (handling `reasoning_details` for interleaved thinking)
|
|
233
|
+
- `google` - Google Gemini API
|
|
234
|
+
- `bedrock` - AWS Bedrock for Claude(uses AWS credentials instead of api_key)
|
|
278
235
|
|
|
279
236
|
List configured providers and models:
|
|
280
237
|
|
|
@@ -316,6 +273,7 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
316
273
|
- `/model` - Switch the active LLM during the session.
|
|
317
274
|
- `/thinking` - Configure model thinking/reasoning level.
|
|
318
275
|
- `/clear` - Clear the current conversation context.
|
|
276
|
+
- `/copy` - Copy last assistant message.
|
|
319
277
|
- `/status` - Show session usage statistics (cost, tokens, model breakdown).
|
|
320
278
|
- `/resume` - Select and resume a previous session.
|
|
321
279
|
- `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
|
|
@@ -342,29 +300,6 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
342
300
|
| `Backspace` | Delete character or selected text |
|
|
343
301
|
| `c` (with selection) | Copy selected text to clipboard |
|
|
344
302
|
|
|
345
|
-
### Non-Interactive Headless Mode (exec)
|
|
346
|
-
|
|
347
|
-
Execute a single command without starting the interactive REPL:
|
|
348
|
-
|
|
349
|
-
```bash
|
|
350
|
-
# Direct input
|
|
351
|
-
klaude exec "what is 2+2?"
|
|
352
|
-
|
|
353
|
-
# Pipe input
|
|
354
|
-
echo "hello world" | klaude exec
|
|
355
|
-
|
|
356
|
-
# With model selection
|
|
357
|
-
|
|
358
|
-
# Exact model name (non-interactive)
|
|
359
|
-
echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
360
|
-
|
|
361
|
-
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
362
|
-
echo "generate quicksort in python" | klaude exec --model gpt
|
|
363
|
-
|
|
364
|
-
# Stream all events as JSON lines (for programmatic processing)
|
|
365
|
-
klaude exec "what is 2+2?" --stream-json
|
|
366
|
-
```
|
|
367
|
-
|
|
368
303
|
### Sub-Agents
|
|
369
304
|
|
|
370
305
|
The main agent can spawn specialized sub-agents for specific tasks:
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "klaude-code"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.3.0"
|
|
8
8
|
description = "Minimal code agent CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -40,6 +40,7 @@ dev = [
|
|
|
40
40
|
"pyright>=1.1.407",
|
|
41
41
|
"pytest>=8.4.1",
|
|
42
42
|
"pytest-cov>=7.0.0",
|
|
43
|
+
"ty>=0.0.8",
|
|
43
44
|
]
|
|
44
45
|
|
|
45
46
|
|
|
@@ -74,6 +75,15 @@ exclude = [".venv/"]
|
|
|
74
75
|
root = "."
|
|
75
76
|
extraPaths = ["src"]
|
|
76
77
|
|
|
78
|
+
[tool.ty.environment]
|
|
79
|
+
python-version = "3.13"
|
|
80
|
+
|
|
81
|
+
[tool.ty.src]
|
|
82
|
+
include = [
|
|
83
|
+
"src",
|
|
84
|
+
"tests",
|
|
85
|
+
]
|
|
86
|
+
|
|
77
87
|
[tool.importlinter]
|
|
78
88
|
root_packages = ["klaude_code"]
|
|
79
89
|
include_external_packages = false
|
|
@@ -4,9 +4,8 @@ This package coordinates core execution (Executor) with frontend displays.
|
|
|
4
4
|
Terminal-specific rendering and input handling live in `klaude_code.tui`.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from .runtime import AppInitConfig
|
|
7
|
+
from .runtime import AppInitConfig
|
|
8
8
|
|
|
9
9
|
__all__ = [
|
|
10
10
|
"AppInitConfig",
|
|
11
|
-
"run_exec",
|
|
12
11
|
]
|
|
@@ -9,12 +9,15 @@ import typer
|
|
|
9
9
|
from klaude_code import ui
|
|
10
10
|
from klaude_code.config import Config, load_config
|
|
11
11
|
from klaude_code.core.agent import Agent
|
|
12
|
-
from klaude_code.core.agent_profile import
|
|
12
|
+
from klaude_code.core.agent_profile import (
|
|
13
|
+
DefaultModelProfileProvider,
|
|
14
|
+
NanoBananaModelProfileProvider,
|
|
15
|
+
VanillaModelProfileProvider,
|
|
16
|
+
)
|
|
13
17
|
from klaude_code.core.executor import Executor
|
|
14
18
|
from klaude_code.core.manager import build_llm_clients
|
|
15
19
|
from klaude_code.log import DebugType, log, set_debug_logging
|
|
16
20
|
from klaude_code.protocol import events, op
|
|
17
|
-
from klaude_code.protocol.message import UserInputPayload
|
|
18
21
|
from klaude_code.session.session import Session, close_default_store
|
|
19
22
|
|
|
20
23
|
|
|
@@ -25,8 +28,8 @@ class AppInitConfig:
|
|
|
25
28
|
model: str | None
|
|
26
29
|
debug: bool
|
|
27
30
|
vanilla: bool
|
|
31
|
+
banana: bool
|
|
28
32
|
debug_filters: set[DebugType] | None = None
|
|
29
|
-
stream_json: bool = False
|
|
30
33
|
|
|
31
34
|
|
|
32
35
|
@dataclass
|
|
@@ -56,6 +59,7 @@ async def initialize_app_components(
|
|
|
56
59
|
llm_clients = build_llm_clients(
|
|
57
60
|
config,
|
|
58
61
|
model_override=init_config.model,
|
|
62
|
+
skip_sub_agents=init_config.vanilla or init_config.banana,
|
|
59
63
|
)
|
|
60
64
|
except ValueError as exc:
|
|
61
65
|
if init_config.model:
|
|
@@ -70,7 +74,12 @@ async def initialize_app_components(
|
|
|
70
74
|
log((f"Error: failed to load the default model configuration: {exc}", "red"))
|
|
71
75
|
raise typer.Exit(2) from None
|
|
72
76
|
|
|
73
|
-
|
|
77
|
+
if init_config.banana:
|
|
78
|
+
model_profile_provider = NanoBananaModelProfileProvider()
|
|
79
|
+
elif init_config.vanilla:
|
|
80
|
+
model_profile_provider = VanillaModelProfileProvider()
|
|
81
|
+
else:
|
|
82
|
+
model_profile_provider = DefaultModelProfileProvider(config=config)
|
|
74
83
|
|
|
75
84
|
event_queue: asyncio.Queue[events.Event] = asyncio.Queue()
|
|
76
85
|
|
|
@@ -176,40 +185,3 @@ async def handle_keyboard_interrupt(executor: Executor) -> None:
|
|
|
176
185
|
log(("Resume with:", "dim"), (f"klaude --resume-by-id {session_id}", "green"))
|
|
177
186
|
with contextlib.suppress(Exception):
|
|
178
187
|
await executor.submit(op.InterruptOperation(target_session_id=None))
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
async def run_exec(init_config: AppInitConfig, input_content: str) -> None:
|
|
182
|
-
"""Run a single task non-interactively (exec mode)."""
|
|
183
|
-
from klaude_code.ui.terminal.title import update_terminal_title
|
|
184
|
-
|
|
185
|
-
display = ui.create_exec_display(debug=init_config.debug, stream_json=init_config.stream_json)
|
|
186
|
-
components = await initialize_app_components(
|
|
187
|
-
init_config=init_config,
|
|
188
|
-
display=display,
|
|
189
|
-
on_model_change=update_terminal_title,
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
try:
|
|
193
|
-
session_id = await initialize_session(components.executor, components.event_queue)
|
|
194
|
-
backfill_session_model_config(
|
|
195
|
-
components.executor.context.current_agent,
|
|
196
|
-
init_config.model,
|
|
197
|
-
components.config.main_model,
|
|
198
|
-
is_new_session=True,
|
|
199
|
-
)
|
|
200
|
-
|
|
201
|
-
if session_id is None:
|
|
202
|
-
raise RuntimeError("No active session")
|
|
203
|
-
|
|
204
|
-
op_id = await components.executor.submit(
|
|
205
|
-
op.RunAgentOperation(
|
|
206
|
-
session_id=session_id,
|
|
207
|
-
input=UserInputPayload(text=input_content),
|
|
208
|
-
)
|
|
209
|
-
)
|
|
210
|
-
await components.executor.wait_for(op_id)
|
|
211
|
-
await components.event_queue.join()
|
|
212
|
-
except KeyboardInterrupt:
|
|
213
|
-
await handle_keyboard_interrupt(components.executor)
|
|
214
|
-
finally:
|
|
215
|
-
await cleanup_app_components(components)
|
|
@@ -243,18 +243,34 @@ def _build_provider_info_panel(provider: ProviderConfig, available: bool) -> Quo
|
|
|
243
243
|
|
|
244
244
|
|
|
245
245
|
def _build_models_table(
|
|
246
|
-
provider: ProviderConfig,
|
|
246
|
+
provider: ProviderConfig,
|
|
247
|
+
config: Config,
|
|
247
248
|
) -> Table:
|
|
248
249
|
"""Build a table for models under a provider."""
|
|
249
250
|
provider_available = not provider.is_api_key_missing()
|
|
250
251
|
|
|
252
|
+
def _resolve_selector(value: str | None) -> str | None:
|
|
253
|
+
if not value:
|
|
254
|
+
return None
|
|
255
|
+
try:
|
|
256
|
+
resolved = config.resolve_model_location_prefer_available(value) or config.resolve_model_location(value)
|
|
257
|
+
except ValueError:
|
|
258
|
+
return None
|
|
259
|
+
if resolved is None:
|
|
260
|
+
return None
|
|
261
|
+
return f"{resolved[0]}@{resolved[1]}"
|
|
262
|
+
|
|
263
|
+
default_selector = _resolve_selector(config.main_model)
|
|
264
|
+
|
|
251
265
|
# Build reverse mapping: model_name -> list of agent roles using it
|
|
252
266
|
model_to_agents: dict[str, list[str]] = {}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
267
|
+
for agent_role, model_name in (config.sub_agent_models or {}).items():
|
|
268
|
+
selector = _resolve_selector(model_name)
|
|
269
|
+
if selector is None:
|
|
270
|
+
continue
|
|
271
|
+
if selector not in model_to_agents:
|
|
272
|
+
model_to_agents[selector] = []
|
|
273
|
+
model_to_agents[selector].append(agent_role)
|
|
258
274
|
|
|
259
275
|
models_table = Table.grid(
|
|
260
276
|
padding=(0, 2),
|
|
@@ -275,10 +291,11 @@ def _build_models_table(
|
|
|
275
291
|
else:
|
|
276
292
|
# Build role tags for this model
|
|
277
293
|
roles: list[str] = []
|
|
278
|
-
|
|
294
|
+
selector = f"{model.model_name}@{provider.provider_name}"
|
|
295
|
+
if selector == default_selector:
|
|
279
296
|
roles.append("default")
|
|
280
|
-
if
|
|
281
|
-
roles.extend(role.lower() for role in model_to_agents[
|
|
297
|
+
if selector in model_to_agents:
|
|
298
|
+
roles.extend(role.lower() for role in model_to_agents[selector])
|
|
282
299
|
|
|
283
300
|
if roles:
|
|
284
301
|
name = Text.assemble(
|
|
@@ -350,6 +367,6 @@ def display_models_and_providers(config: Config, *, show_all: bool = False):
|
|
|
350
367
|
console.print()
|
|
351
368
|
|
|
352
369
|
# Models table for this provider
|
|
353
|
-
models_table = _build_models_table(provider, config
|
|
370
|
+
models_table = _build_models_table(provider, config)
|
|
354
371
|
console.print(models_table)
|
|
355
372
|
console.print("\n")
|