klaude-code 1.6.0__tar.gz → 1.7.1__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.6.0 → klaude_code-1.7.1}/PKG-INFO +82 -10
- {klaude_code-1.6.0 → klaude_code-1.7.1}/README.md +80 -9
- {klaude_code-1.6.0 → klaude_code-1.7.1}/pyproject.toml +2 -1
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/list_model.py +55 -4
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/main.py +10 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/runtime.py +2 -2
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/session_cmd.py +3 -2
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/fork_session_cmd.py +7 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/assets/builtin_config.yaml +61 -2
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/builtin_config.py +1 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/config.py +19 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/thinking.py +14 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/const.py +17 -2
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/executor.py +16 -3
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/task.py +5 -3
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/command_safety.py +3 -5
- klaude_code-1.7.1/src/klaude_code/llm/anthropic/client.py +233 -0
- klaude_code-1.7.1/src/klaude_code/llm/bedrock/__init__.py +3 -0
- klaude_code-1.7.1/src/klaude_code/llm/bedrock/client.py +60 -0
- klaude_code-1.7.1/src/klaude_code/llm/google/__init__.py +3 -0
- klaude_code-1.7.1/src/klaude_code/llm/google/client.py +309 -0
- klaude_code-1.7.1/src/klaude_code/llm/google/input.py +215 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/registry.py +10 -5
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/events.py +1 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/llm_param.py +9 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/export.py +14 -2
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/session.py +52 -3
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/store.py +3 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/templates/export_session.html +210 -18
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +6 -46
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/renderer.py +5 -1
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/developer.py +1 -1
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/sub_agent.py +1 -1
- klaude_code-1.6.0/src/klaude_code/llm/anthropic/client.py +0 -220
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/config_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/debug.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/cli/self_update.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/clear_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/command_abc.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/debug_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/export_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/export_online_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/help_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/model_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/model_select.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/prompt-init.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/prompt-jj-describe.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/prompt_command.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/refresh_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/registry.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/release_notes_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/resume_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/status_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/command/thinking_cmd.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/assets/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/config/select_model.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompt.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/reminders.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/move_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/move_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/read_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/report_back_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/skill/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_context.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_registry.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/tool_runner.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/truncation.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/core/turn.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/anthropic/input.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/codex/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/codex/client.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/input_common.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/input.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/client.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/input.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/responses/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/responses/client.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/responses/input.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/llm/usage.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/commands.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/model.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/op.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/op_handler.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/task.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/sub_agent/web.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/protocol/tools.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/codec.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/loader.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/manager.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/skill/system_skills.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/trace/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/trace/log.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/display.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/core/stage_manager.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/debug/display.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/exec/display.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/completers.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/display.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/event_handler.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/assistant.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/bash_syntax.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/common.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/diffs.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/errors.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/mermaid_viewer.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/metadata.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/thinking.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/tools.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/renderers/user_input.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/code_panel.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/live.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/markdown.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/quote.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/searchable_text.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/status.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/rich/theme.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/color.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/control.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/notifier.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/terminal/selector.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/utils/__init__.py +0 -0
- {klaude_code-1.6.0 → klaude_code-1.7.1}/src/klaude_code/ui/utils/common.py +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: klaude-code
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.1
|
|
4
4
|
Summary: Minimal code agent CLI
|
|
5
5
|
Requires-Dist: anthropic>=0.66.0
|
|
6
6
|
Requires-Dist: chardet>=5.2.0
|
|
7
7
|
Requires-Dist: ddgs>=9.9.3
|
|
8
8
|
Requires-Dist: diff-match-patch>=20241021
|
|
9
|
+
Requires-Dist: google-genai>=1.56.0
|
|
9
10
|
Requires-Dist: markdown-it-py>=4.0.0
|
|
10
11
|
Requires-Dist: openai>=1.102.0
|
|
11
12
|
Requires-Dist: pillow>=12.0.0
|
|
@@ -34,6 +35,10 @@ Minimal code agent CLI.
|
|
|
34
35
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
35
36
|
- **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
36
37
|
- **Sessions**: Resumable with `--continue`
|
|
38
|
+
- **Cost tracking**: Automatic API cost calculation and display (USD/CNY)
|
|
39
|
+
- **Version update check**: Background PyPI version check with upgrade prompts
|
|
40
|
+
- **Terminal title**: Shows current directory and model name
|
|
41
|
+
- **Mermaid diagrams**: Interactive local HTML viewer with zoom, pan, and SVG export
|
|
37
42
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
38
43
|
|
|
39
44
|
## Installation
|
|
@@ -77,6 +82,7 @@ klaude [--model <name>] [--select-model]
|
|
|
77
82
|
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
78
83
|
- `--continue`/`-c`: Resume the most recent session.
|
|
79
84
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
85
|
+
- `--resume-by-id <id>`: Resume a session by its ID directly.
|
|
80
86
|
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
81
87
|
|
|
82
88
|
**Model selection behavior:**
|
|
@@ -140,20 +146,62 @@ klaude config
|
|
|
140
146
|
|
|
141
147
|
##### Adding Models to Built-in Providers
|
|
142
148
|
|
|
143
|
-
You can add custom models to existing providers without redefining the entire provider
|
|
149
|
+
You can add custom models to existing built-in providers without redefining the entire provider. Just reference the `provider_name` and add your `model_list`:
|
|
144
150
|
|
|
145
151
|
```yaml
|
|
146
|
-
#
|
|
152
|
+
# ~/.klaude/klaude-config.yaml
|
|
147
153
|
provider_list:
|
|
154
|
+
- provider_name: openrouter # Reference existing built-in provider
|
|
155
|
+
model_list:
|
|
156
|
+
- model_name: seed
|
|
157
|
+
model_params:
|
|
158
|
+
model: bytedance-seed/seed-1.6 # Model ID from OpenRouter
|
|
159
|
+
context_limit: 262000
|
|
160
|
+
cost:
|
|
161
|
+
input: 0.25
|
|
162
|
+
output: 2
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**How merging works:**
|
|
166
|
+
- Your models are merged with the built-in models for that provider
|
|
167
|
+
- You only need `provider_name` and `model_list` - protocol, api_key, etc. are inherited from the built-in config
|
|
168
|
+
- To override a built-in model, use the same `model_name` (e.g., `sonnet` to customize the built-in sonnet)
|
|
169
|
+
|
|
170
|
+
**More examples:**
|
|
171
|
+
|
|
172
|
+
```yaml
|
|
173
|
+
provider_list:
|
|
174
|
+
# Add multiple models to OpenRouter
|
|
148
175
|
- provider_name: openrouter
|
|
149
176
|
model_list:
|
|
150
|
-
- model_name:
|
|
177
|
+
- model_name: qwen-coder
|
|
151
178
|
model_params:
|
|
152
|
-
model:
|
|
179
|
+
model: qwen/qwen-2.5-coder-32b-instruct
|
|
180
|
+
context_limit: 131072
|
|
181
|
+
cost:
|
|
182
|
+
input: 0.3
|
|
183
|
+
output: 0.9
|
|
184
|
+
- model_name: llama-405b
|
|
185
|
+
model_params:
|
|
186
|
+
model: meta-llama/llama-3.1-405b-instruct
|
|
187
|
+
context_limit: 131072
|
|
188
|
+
cost:
|
|
189
|
+
input: 0.8
|
|
190
|
+
output: 0.8
|
|
191
|
+
|
|
192
|
+
# Add models to Anthropic provider
|
|
193
|
+
- provider_name: anthropic
|
|
194
|
+
model_list:
|
|
195
|
+
- model_name: haiku@ant
|
|
196
|
+
model_params:
|
|
197
|
+
model: claude-3-5-haiku-20241022
|
|
153
198
|
context_limit: 200000
|
|
199
|
+
cost:
|
|
200
|
+
input: 1.0
|
|
201
|
+
output: 5.0
|
|
154
202
|
```
|
|
155
203
|
|
|
156
|
-
|
|
204
|
+
After adding models, run `klaude list` to verify they appear in the model list.
|
|
157
205
|
|
|
158
206
|
##### Overriding Provider Settings
|
|
159
207
|
|
|
@@ -224,6 +272,8 @@ provider_list:
|
|
|
224
272
|
- `openai` - OpenAI-compatible API
|
|
225
273
|
- `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
|
|
226
274
|
- `openrouter` - OpenRouter API
|
|
275
|
+
- `google` - Google Gemini API
|
|
276
|
+
- `bedrock` - AWS Bedrock (uses AWS credentials instead of api_key)
|
|
227
277
|
- `codex` - OpenAI Codex CLI (OAuth-based)
|
|
228
278
|
|
|
229
279
|
List configured providers and models:
|
|
@@ -251,12 +301,18 @@ klaude session clean-all
|
|
|
251
301
|
|
|
252
302
|
Inside the interactive session (`klaude`), use these commands to streamline your workflow:
|
|
253
303
|
|
|
254
|
-
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
255
|
-
- `/export` - Export last assistant message to a temp Markdown file.
|
|
256
|
-
- `/init` - Bootstrap a new project structure or module.
|
|
257
304
|
- `/model` - Switch the active LLM during the session.
|
|
305
|
+
- `/thinking` - Configure model thinking/reasoning level.
|
|
258
306
|
- `/clear` - Clear the current conversation context.
|
|
259
|
-
- `/
|
|
307
|
+
- `/status` - Show session usage statistics (cost, tokens, model breakdown).
|
|
308
|
+
- `/resume` - Select and resume a previous session.
|
|
309
|
+
- `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
|
|
310
|
+
- `/export` - Export last assistant message to a temp Markdown file.
|
|
311
|
+
- `/export-online` - Export and deploy session to surge.sh as a static webpage.
|
|
312
|
+
- `/debug [filters]` - Toggle debug mode and configure debug filters.
|
|
313
|
+
- `/init` - Bootstrap a new project structure or module.
|
|
314
|
+
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
315
|
+
- `/terminal-setup` - Configure terminal for Shift+Enter support.
|
|
260
316
|
- `/help` - List all available commands.
|
|
261
317
|
|
|
262
318
|
|
|
@@ -267,6 +323,8 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
267
323
|
| `Enter` | Submit input |
|
|
268
324
|
| `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
|
|
269
325
|
| `Ctrl+J` | Insert newline |
|
|
326
|
+
| `Ctrl+L` | Open model picker overlay |
|
|
327
|
+
| `Ctrl+T` | Open thinking level picker overlay |
|
|
270
328
|
| `Ctrl+V` | Paste image from clipboard |
|
|
271
329
|
| `Left/Right` | Move cursor (wraps across lines) |
|
|
272
330
|
| `Backspace` | Delete character or selected text |
|
|
@@ -290,4 +348,18 @@ echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
|
290
348
|
|
|
291
349
|
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
292
350
|
echo "generate quicksort in python" | klaude exec --model gpt
|
|
351
|
+
|
|
352
|
+
# Stream all events as JSON lines (for programmatic processing)
|
|
353
|
+
klaude exec "what is 2+2?" --stream-json
|
|
293
354
|
```
|
|
355
|
+
|
|
356
|
+
### Sub-Agents
|
|
357
|
+
|
|
358
|
+
The main agent can spawn specialized sub-agents for specific tasks:
|
|
359
|
+
|
|
360
|
+
| Sub-Agent | Purpose |
|
|
361
|
+
|-----------|---------|
|
|
362
|
+
| **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
|
|
363
|
+
| **Task** | Handle complex multi-step tasks autonomously |
|
|
364
|
+
| **WebAgent** | Search the web, fetch pages, and analyze content |
|
|
365
|
+
| **Oracle** | Advanced reasoning advisor for code reviews, architecture planning, and bug analysis |
|
|
@@ -14,6 +14,10 @@ Minimal code agent CLI.
|
|
|
14
14
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
15
15
|
- **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
16
16
|
- **Sessions**: Resumable with `--continue`
|
|
17
|
+
- **Cost tracking**: Automatic API cost calculation and display (USD/CNY)
|
|
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
|
|
17
21
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
18
22
|
|
|
19
23
|
## Installation
|
|
@@ -57,6 +61,7 @@ klaude [--model <name>] [--select-model]
|
|
|
57
61
|
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
58
62
|
- `--continue`/`-c`: Resume the most recent session.
|
|
59
63
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
64
|
+
- `--resume-by-id <id>`: Resume a session by its ID directly.
|
|
60
65
|
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
61
66
|
|
|
62
67
|
**Model selection behavior:**
|
|
@@ -120,20 +125,62 @@ klaude config
|
|
|
120
125
|
|
|
121
126
|
##### Adding Models to Built-in Providers
|
|
122
127
|
|
|
123
|
-
You can add custom models to existing providers without redefining the entire provider
|
|
128
|
+
You can add custom models to existing built-in providers without redefining the entire provider. Just reference the `provider_name` and add your `model_list`:
|
|
124
129
|
|
|
125
130
|
```yaml
|
|
126
|
-
#
|
|
131
|
+
# ~/.klaude/klaude-config.yaml
|
|
127
132
|
provider_list:
|
|
133
|
+
- provider_name: openrouter # Reference existing built-in provider
|
|
134
|
+
model_list:
|
|
135
|
+
- model_name: seed
|
|
136
|
+
model_params:
|
|
137
|
+
model: bytedance-seed/seed-1.6 # Model ID from OpenRouter
|
|
138
|
+
context_limit: 262000
|
|
139
|
+
cost:
|
|
140
|
+
input: 0.25
|
|
141
|
+
output: 2
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**How merging works:**
|
|
145
|
+
- Your models are merged with the built-in models for that provider
|
|
146
|
+
- You only need `provider_name` and `model_list` - protocol, api_key, etc. are inherited from the built-in config
|
|
147
|
+
- To override a built-in model, use the same `model_name` (e.g., `sonnet` to customize the built-in sonnet)
|
|
148
|
+
|
|
149
|
+
**More examples:**
|
|
150
|
+
|
|
151
|
+
```yaml
|
|
152
|
+
provider_list:
|
|
153
|
+
# Add multiple models to OpenRouter
|
|
128
154
|
- provider_name: openrouter
|
|
129
155
|
model_list:
|
|
130
|
-
- model_name:
|
|
156
|
+
- model_name: qwen-coder
|
|
131
157
|
model_params:
|
|
132
|
-
model:
|
|
158
|
+
model: qwen/qwen-2.5-coder-32b-instruct
|
|
159
|
+
context_limit: 131072
|
|
160
|
+
cost:
|
|
161
|
+
input: 0.3
|
|
162
|
+
output: 0.9
|
|
163
|
+
- model_name: llama-405b
|
|
164
|
+
model_params:
|
|
165
|
+
model: meta-llama/llama-3.1-405b-instruct
|
|
166
|
+
context_limit: 131072
|
|
167
|
+
cost:
|
|
168
|
+
input: 0.8
|
|
169
|
+
output: 0.8
|
|
170
|
+
|
|
171
|
+
# Add models to Anthropic provider
|
|
172
|
+
- provider_name: anthropic
|
|
173
|
+
model_list:
|
|
174
|
+
- model_name: haiku@ant
|
|
175
|
+
model_params:
|
|
176
|
+
model: claude-3-5-haiku-20241022
|
|
133
177
|
context_limit: 200000
|
|
178
|
+
cost:
|
|
179
|
+
input: 1.0
|
|
180
|
+
output: 5.0
|
|
134
181
|
```
|
|
135
182
|
|
|
136
|
-
|
|
183
|
+
After adding models, run `klaude list` to verify they appear in the model list.
|
|
137
184
|
|
|
138
185
|
##### Overriding Provider Settings
|
|
139
186
|
|
|
@@ -204,6 +251,8 @@ provider_list:
|
|
|
204
251
|
- `openai` - OpenAI-compatible API
|
|
205
252
|
- `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
|
|
206
253
|
- `openrouter` - OpenRouter API
|
|
254
|
+
- `google` - Google Gemini API
|
|
255
|
+
- `bedrock` - AWS Bedrock (uses AWS credentials instead of api_key)
|
|
207
256
|
- `codex` - OpenAI Codex CLI (OAuth-based)
|
|
208
257
|
|
|
209
258
|
List configured providers and models:
|
|
@@ -231,12 +280,18 @@ klaude session clean-all
|
|
|
231
280
|
|
|
232
281
|
Inside the interactive session (`klaude`), use these commands to streamline your workflow:
|
|
233
282
|
|
|
234
|
-
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
235
|
-
- `/export` - Export last assistant message to a temp Markdown file.
|
|
236
|
-
- `/init` - Bootstrap a new project structure or module.
|
|
237
283
|
- `/model` - Switch the active LLM during the session.
|
|
284
|
+
- `/thinking` - Configure model thinking/reasoning level.
|
|
238
285
|
- `/clear` - Clear the current conversation context.
|
|
239
|
-
- `/
|
|
286
|
+
- `/status` - Show session usage statistics (cost, tokens, model breakdown).
|
|
287
|
+
- `/resume` - Select and resume a previous session.
|
|
288
|
+
- `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
|
|
289
|
+
- `/export` - Export last assistant message to a temp Markdown file.
|
|
290
|
+
- `/export-online` - Export and deploy session to surge.sh as a static webpage.
|
|
291
|
+
- `/debug [filters]` - Toggle debug mode and configure debug filters.
|
|
292
|
+
- `/init` - Bootstrap a new project structure or module.
|
|
293
|
+
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
294
|
+
- `/terminal-setup` - Configure terminal for Shift+Enter support.
|
|
240
295
|
- `/help` - List all available commands.
|
|
241
296
|
|
|
242
297
|
|
|
@@ -247,6 +302,8 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
247
302
|
| `Enter` | Submit input |
|
|
248
303
|
| `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
|
|
249
304
|
| `Ctrl+J` | Insert newline |
|
|
305
|
+
| `Ctrl+L` | Open model picker overlay |
|
|
306
|
+
| `Ctrl+T` | Open thinking level picker overlay |
|
|
250
307
|
| `Ctrl+V` | Paste image from clipboard |
|
|
251
308
|
| `Left/Right` | Move cursor (wraps across lines) |
|
|
252
309
|
| `Backspace` | Delete character or selected text |
|
|
@@ -270,4 +327,18 @@ echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
|
270
327
|
|
|
271
328
|
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
272
329
|
echo "generate quicksort in python" | klaude exec --model gpt
|
|
330
|
+
|
|
331
|
+
# Stream all events as JSON lines (for programmatic processing)
|
|
332
|
+
klaude exec "what is 2+2?" --stream-json
|
|
273
333
|
```
|
|
334
|
+
|
|
335
|
+
### Sub-Agents
|
|
336
|
+
|
|
337
|
+
The main agent can spawn specialized sub-agents for specific tasks:
|
|
338
|
+
|
|
339
|
+
| Sub-Agent | Purpose |
|
|
340
|
+
|-----------|---------|
|
|
341
|
+
| **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
|
|
342
|
+
| **Task** | Handle complex multi-step tasks autonomously |
|
|
343
|
+
| **WebAgent** | Search the web, fetch pages, and analyze content |
|
|
344
|
+
| **Oracle** | Advanced reasoning advisor for code reviews, architecture planning, and bug analysis |
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "klaude-code"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.7.1"
|
|
8
8
|
description = "Minimal code agent CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -13,6 +13,7 @@ dependencies = [
|
|
|
13
13
|
"chardet>=5.2.0",
|
|
14
14
|
"ddgs>=9.9.3",
|
|
15
15
|
"diff-match-patch>=20241021",
|
|
16
|
+
"google-genai>=1.56.0",
|
|
16
17
|
"markdown-it-py>=4.0.0",
|
|
17
18
|
"openai>=1.102.0",
|
|
18
19
|
"pillow>=12.0.0",
|
|
@@ -6,7 +6,7 @@ from rich.table import Table
|
|
|
6
6
|
from rich.text import Text
|
|
7
7
|
|
|
8
8
|
from klaude_code.config import Config
|
|
9
|
-
from klaude_code.config.config import ModelConfig, ProviderConfig
|
|
9
|
+
from klaude_code.config.config import ModelConfig, ProviderConfig, parse_env_var_syntax
|
|
10
10
|
from klaude_code.protocol.llm_param import LLMClientProtocol
|
|
11
11
|
from klaude_code.protocol.sub_agent import iter_sub_agent_profiles
|
|
12
12
|
from klaude_code.ui.rich.theme import ThemeKey, get_theme
|
|
@@ -94,6 +94,29 @@ def format_api_key_display(provider: ProviderConfig) -> Text:
|
|
|
94
94
|
return Text("N/A")
|
|
95
95
|
|
|
96
96
|
|
|
97
|
+
def format_env_var_display(value: str | None) -> Text:
|
|
98
|
+
"""Format environment variable display with warning if not set."""
|
|
99
|
+
env_var, resolved = parse_env_var_syntax(value)
|
|
100
|
+
|
|
101
|
+
if env_var:
|
|
102
|
+
# Using ${ENV_VAR} syntax
|
|
103
|
+
if resolved:
|
|
104
|
+
return Text.assemble(
|
|
105
|
+
(f"${{{env_var}}} = ", "dim"),
|
|
106
|
+
(mask_api_key(resolved), ""),
|
|
107
|
+
)
|
|
108
|
+
else:
|
|
109
|
+
return Text.assemble(
|
|
110
|
+
(f"${{{env_var}}} ", ""),
|
|
111
|
+
("(not set)", ThemeKey.CONFIG_STATUS_ERROR),
|
|
112
|
+
)
|
|
113
|
+
elif value:
|
|
114
|
+
# Plain value
|
|
115
|
+
return Text(mask_api_key(value))
|
|
116
|
+
else:
|
|
117
|
+
return Text("N/A")
|
|
118
|
+
|
|
119
|
+
|
|
97
120
|
def _get_model_params_display(model: ModelConfig) -> list[Text]:
|
|
98
121
|
"""Get display elements for model parameters."""
|
|
99
122
|
params: list[Text] = []
|
|
@@ -162,15 +185,43 @@ def display_models_and_providers(config: Config):
|
|
|
162
185
|
format_api_key_display(provider),
|
|
163
186
|
)
|
|
164
187
|
|
|
188
|
+
# AWS Bedrock parameters
|
|
189
|
+
if provider.protocol == LLMClientProtocol.BEDROCK:
|
|
190
|
+
if provider.aws_access_key:
|
|
191
|
+
provider_info.add_row(
|
|
192
|
+
Text("AWS Key:", style=ThemeKey.CONFIG_PARAM_LABEL),
|
|
193
|
+
format_env_var_display(provider.aws_access_key),
|
|
194
|
+
)
|
|
195
|
+
if provider.aws_secret_key:
|
|
196
|
+
provider_info.add_row(
|
|
197
|
+
Text("AWS Secret:", style=ThemeKey.CONFIG_PARAM_LABEL),
|
|
198
|
+
format_env_var_display(provider.aws_secret_key),
|
|
199
|
+
)
|
|
200
|
+
if provider.aws_region:
|
|
201
|
+
provider_info.add_row(
|
|
202
|
+
Text("AWS Region:", style=ThemeKey.CONFIG_PARAM_LABEL),
|
|
203
|
+
format_env_var_display(provider.aws_region),
|
|
204
|
+
)
|
|
205
|
+
if provider.aws_session_token:
|
|
206
|
+
provider_info.add_row(
|
|
207
|
+
Text("AWS Token:", style=ThemeKey.CONFIG_PARAM_LABEL),
|
|
208
|
+
format_env_var_display(provider.aws_session_token),
|
|
209
|
+
)
|
|
210
|
+
if provider.aws_profile:
|
|
211
|
+
provider_info.add_row(
|
|
212
|
+
Text("AWS Profile:", style=ThemeKey.CONFIG_PARAM_LABEL),
|
|
213
|
+
format_env_var_display(provider.aws_profile),
|
|
214
|
+
)
|
|
215
|
+
|
|
165
216
|
# Check if provider has valid API key
|
|
166
217
|
provider_available = not provider.is_api_key_missing()
|
|
167
218
|
|
|
168
219
|
# Models table for this provider
|
|
169
220
|
models_table = Table.grid(padding=(0, 1), expand=True)
|
|
170
221
|
models_table.add_column(width=2, no_wrap=True) # Status
|
|
171
|
-
models_table.add_column(overflow="fold", ratio=
|
|
172
|
-
models_table.add_column(overflow="fold", ratio=
|
|
173
|
-
models_table.add_column(overflow="fold", ratio=
|
|
222
|
+
models_table.add_column(overflow="fold", ratio=2) # Name
|
|
223
|
+
models_table.add_column(overflow="fold", ratio=3) # Model
|
|
224
|
+
models_table.add_column(overflow="fold", ratio=4) # Params
|
|
174
225
|
|
|
175
226
|
# Add header
|
|
176
227
|
models_table.add_row(
|
|
@@ -95,10 +95,20 @@ def read_input_content(cli_argument: str) -> str | None:
|
|
|
95
95
|
return content
|
|
96
96
|
|
|
97
97
|
|
|
98
|
+
ENV_HELP = """\
|
|
99
|
+
Environment Variables:
|
|
100
|
+
|
|
101
|
+
KLAUDE_READ_GLOBAL_LINE_CAP Max lines to read (default: 2000)
|
|
102
|
+
|
|
103
|
+
KLAUDE_READ_MAX_CHARS Max total chars to read (default: 50000)
|
|
104
|
+
"""
|
|
105
|
+
|
|
98
106
|
app = typer.Typer(
|
|
99
107
|
add_completion=False,
|
|
100
108
|
pretty_exceptions_enable=False,
|
|
101
109
|
no_args_is_help=False,
|
|
110
|
+
rich_markup_mode="rich",
|
|
111
|
+
epilog=ENV_HELP,
|
|
102
112
|
)
|
|
103
113
|
|
|
104
114
|
# Register subcommands from modules
|
|
@@ -379,7 +379,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
|
|
|
379
379
|
model_name=model_name,
|
|
380
380
|
save_as_default=False,
|
|
381
381
|
defer_thinking_selection=True,
|
|
382
|
-
emit_welcome_event=
|
|
382
|
+
emit_welcome_event=True,
|
|
383
383
|
emit_switch_message=False,
|
|
384
384
|
)
|
|
385
385
|
)
|
|
@@ -398,7 +398,7 @@ async def run_interactive(init_config: AppInitConfig, session_id: str | None = N
|
|
|
398
398
|
op.ChangeThinkingOperation(
|
|
399
399
|
session_id=sid,
|
|
400
400
|
thinking=thinking,
|
|
401
|
-
emit_welcome_event=
|
|
401
|
+
emit_welcome_event=True,
|
|
402
402
|
emit_switch_message=False,
|
|
403
403
|
)
|
|
404
404
|
)
|
|
@@ -22,8 +22,9 @@ def _session_confirm(sessions: list[Session.SessionMetaBrief], message: str) ->
|
|
|
22
22
|
log(f"Sessions to delete ({len(sessions)}):")
|
|
23
23
|
for s in sessions:
|
|
24
24
|
msg_count_display = "N/A" if s.messages_count == -1 else str(s.messages_count)
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
first_msg_text = s.user_messages[0] if s.user_messages else ""
|
|
26
|
+
first_msg = first_msg_text.strip().replace("\n", " ")[:50]
|
|
27
|
+
if len(first_msg_text) > 50:
|
|
27
28
|
first_msg += "..."
|
|
28
29
|
log(f" {_fmt(s.updated_at)} {msg_count_display:>3} msgs {first_msg}")
|
|
29
30
|
|
|
@@ -7,6 +7,7 @@ from prompt_toolkit.styles import Style
|
|
|
7
7
|
|
|
8
8
|
from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
|
|
9
9
|
from klaude_code.protocol import commands, events, model
|
|
10
|
+
from klaude_code.ui.modes.repl.clipboard import copy_to_clipboard
|
|
10
11
|
from klaude_code.ui.terminal.selector import SelectItem, select_one
|
|
11
12
|
|
|
12
13
|
FORK_SELECT_STYLE = Style(
|
|
@@ -215,6 +216,9 @@ class ForkSessionCommand(CommandABC):
|
|
|
215
216
|
new_session = agent.session.fork()
|
|
216
217
|
await new_session.wait_for_flush()
|
|
217
218
|
|
|
219
|
+
resume_cmd = f"klaude --resume-by-id {new_session.id}"
|
|
220
|
+
copy_to_clipboard(resume_cmd)
|
|
221
|
+
|
|
218
222
|
event = events.DeveloperMessageEvent(
|
|
219
223
|
session_id=agent.session.id,
|
|
220
224
|
item=model.DeveloperMessageItem(
|
|
@@ -247,6 +251,9 @@ class ForkSessionCommand(CommandABC):
|
|
|
247
251
|
# Build result message
|
|
248
252
|
fork_description = "entire conversation" if selected is None else f"up to message index {selected}"
|
|
249
253
|
|
|
254
|
+
resume_cmd = f"klaude --resume-by-id {new_session.id}"
|
|
255
|
+
copy_to_clipboard(resume_cmd)
|
|
256
|
+
|
|
250
257
|
event = events.DeveloperMessageEvent(
|
|
251
258
|
session_id=agent.session.id,
|
|
252
259
|
item=model.DeveloperMessageItem(
|
|
@@ -7,7 +7,7 @@ provider_list:
|
|
|
7
7
|
protocol: anthropic
|
|
8
8
|
api_key: ${ANTHROPIC_API_KEY}
|
|
9
9
|
model_list:
|
|
10
|
-
- model_name: sonnet
|
|
10
|
+
- model_name: sonnet@ant
|
|
11
11
|
model_params:
|
|
12
12
|
model: claude-sonnet-4-5-20250929
|
|
13
13
|
context_limit: 200000
|
|
@@ -18,7 +18,7 @@ provider_list:
|
|
|
18
18
|
output: 15.0
|
|
19
19
|
cache_read: 0.3
|
|
20
20
|
cache_write: 3.75
|
|
21
|
-
- model_name: opus
|
|
21
|
+
- model_name: opus@ant
|
|
22
22
|
model_params:
|
|
23
23
|
model: claude-opus-4-5-20251101
|
|
24
24
|
context_limit: 200000
|
|
@@ -87,6 +87,30 @@ provider_list:
|
|
|
87
87
|
input: 1.75
|
|
88
88
|
output: 14.0
|
|
89
89
|
cache_read: 0.17
|
|
90
|
+
- model_name: gpt-5.2-medium
|
|
91
|
+
model_params:
|
|
92
|
+
model: openai/gpt-5.2
|
|
93
|
+
max_tokens: 128000
|
|
94
|
+
context_limit: 400000
|
|
95
|
+
verbosity: high
|
|
96
|
+
thinking:
|
|
97
|
+
reasoning_effort: medium
|
|
98
|
+
cost:
|
|
99
|
+
input: 1.75
|
|
100
|
+
output: 14.0
|
|
101
|
+
cache_read: 0.17
|
|
102
|
+
- model_name: gpt-5.2-low
|
|
103
|
+
model_params:
|
|
104
|
+
model: openai/gpt-5.2
|
|
105
|
+
max_tokens: 128000
|
|
106
|
+
context_limit: 400000
|
|
107
|
+
verbosity: low
|
|
108
|
+
thinking:
|
|
109
|
+
reasoning_effort: low
|
|
110
|
+
cost:
|
|
111
|
+
input: 1.75
|
|
112
|
+
output: 14.0
|
|
113
|
+
cache_read: 0.17
|
|
90
114
|
- model_name: gpt-5.2-fast
|
|
91
115
|
model_params:
|
|
92
116
|
model: openai/gpt-5.2
|
|
@@ -194,6 +218,41 @@ provider_list:
|
|
|
194
218
|
output: 1.74
|
|
195
219
|
cache_read: 0.04
|
|
196
220
|
|
|
221
|
+
- provider_name: google
|
|
222
|
+
protocol: google
|
|
223
|
+
api_key: ${GOOGLE_API_KEY}
|
|
224
|
+
model_list:
|
|
225
|
+
- model_name: gemini-pro@google
|
|
226
|
+
model_params:
|
|
227
|
+
model: gemini-3-pro-preview
|
|
228
|
+
context_limit: 1048576
|
|
229
|
+
cost:
|
|
230
|
+
input: 2.0
|
|
231
|
+
output: 12.0
|
|
232
|
+
cache_read: 0.2
|
|
233
|
+
- model_name: gemini-flash@google
|
|
234
|
+
model_params:
|
|
235
|
+
model: gemini-3-flash-preview
|
|
236
|
+
context_limit: 1048576
|
|
237
|
+
cost:
|
|
238
|
+
input: 0.5
|
|
239
|
+
output: 3.0
|
|
240
|
+
cache_read: 0.05
|
|
241
|
+
- provider_name: bedrock
|
|
242
|
+
protocol: bedrock
|
|
243
|
+
aws_access_key: ${AWS_ACCESS_KEY_ID}
|
|
244
|
+
aws_secret_key: ${AWS_SECRET_ACCESS_KEY}
|
|
245
|
+
aws_region: ${AWS_REGION}
|
|
246
|
+
model_list:
|
|
247
|
+
- model_name: sonnet@bedrock
|
|
248
|
+
model_params:
|
|
249
|
+
model: us.anthropic.claude-sonnet-4-5-20250929-v1:0
|
|
250
|
+
context_limit: 200000
|
|
251
|
+
cost:
|
|
252
|
+
input: 3.0
|
|
253
|
+
output: 15.0
|
|
254
|
+
cache_read: 0.3
|
|
255
|
+
cache_write: 3.75
|
|
197
256
|
- provider_name: deepseek
|
|
198
257
|
protocol: anthropic
|
|
199
258
|
api_key: ${DEEPSEEK_API_KEY}
|
|
@@ -77,6 +77,7 @@ class ProviderConfig(llm_param.LLMConfigProviderParameter):
|
|
|
77
77
|
"""Check if the API key is missing (either not set or env var not found).
|
|
78
78
|
|
|
79
79
|
For codex protocol, checks OAuth login status instead of API key.
|
|
80
|
+
For bedrock protocol, checks AWS credentials instead of API key.
|
|
80
81
|
"""
|
|
81
82
|
from klaude_code.protocol.llm_param import LLMClientProtocol
|
|
82
83
|
|
|
@@ -89,6 +90,19 @@ class ProviderConfig(llm_param.LLMConfigProviderParameter):
|
|
|
89
90
|
# Consider available if logged in and token not expired
|
|
90
91
|
return state is None or state.is_expired()
|
|
91
92
|
|
|
93
|
+
if self.protocol == LLMClientProtocol.BEDROCK:
|
|
94
|
+
# Bedrock uses AWS credentials, not API key. Region is always required.
|
|
95
|
+
_, resolved_profile = parse_env_var_syntax(self.aws_profile)
|
|
96
|
+
_, resolved_region = parse_env_var_syntax(self.aws_region)
|
|
97
|
+
|
|
98
|
+
# When using profile, we still need region to initialize the client.
|
|
99
|
+
if resolved_profile:
|
|
100
|
+
return resolved_region is None
|
|
101
|
+
|
|
102
|
+
_, resolved_access_key = parse_env_var_syntax(self.aws_access_key)
|
|
103
|
+
_, resolved_secret_key = parse_env_var_syntax(self.aws_secret_key)
|
|
104
|
+
return resolved_region is None or resolved_access_key is None or resolved_secret_key is None
|
|
105
|
+
|
|
92
106
|
return self.get_resolved_api_key() is None
|
|
93
107
|
|
|
94
108
|
|
|
@@ -243,6 +257,11 @@ def get_example_config() -> UserConfig:
|
|
|
243
257
|
model="model-id-from-provider",
|
|
244
258
|
max_tokens=16000,
|
|
245
259
|
context_limit=200000,
|
|
260
|
+
cost=llm_param.Cost(
|
|
261
|
+
input=1,
|
|
262
|
+
output=10,
|
|
263
|
+
cache_read=0.1,
|
|
264
|
+
),
|
|
246
265
|
),
|
|
247
266
|
),
|
|
248
267
|
],
|
|
@@ -121,6 +121,13 @@ def format_current_thinking(config: llm_param.LLMConfigParameter) -> str:
|
|
|
121
121
|
return f"enabled (budget_tokens={thinking.budget_tokens})"
|
|
122
122
|
return "not set"
|
|
123
123
|
|
|
124
|
+
if protocol == llm_param.LLMClientProtocol.GOOGLE:
|
|
125
|
+
if thinking.type == "disabled":
|
|
126
|
+
return "off"
|
|
127
|
+
if thinking.type == "enabled":
|
|
128
|
+
return f"enabled (budget_tokens={thinking.budget_tokens})"
|
|
129
|
+
return "not set"
|
|
130
|
+
|
|
124
131
|
return "unknown protocol"
|
|
125
132
|
|
|
126
133
|
|
|
@@ -230,6 +237,13 @@ def get_thinking_picker_data(config: llm_param.LLMConfigParameter) -> ThinkingPi
|
|
|
230
237
|
current_value=_get_current_budget_value(thinking),
|
|
231
238
|
)
|
|
232
239
|
|
|
240
|
+
if protocol == llm_param.LLMClientProtocol.GOOGLE:
|
|
241
|
+
return ThinkingPickerData(
|
|
242
|
+
options=_build_budget_options(),
|
|
243
|
+
message="Select thinking level:",
|
|
244
|
+
current_value=_get_current_budget_value(thinking),
|
|
245
|
+
)
|
|
246
|
+
|
|
233
247
|
return None
|
|
234
248
|
|
|
235
249
|
|