klaude-code 1.2.28__tar.gz → 1.2.29__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {klaude_code-1.2.28 → klaude_code-1.2.29}/PKG-INFO +1 -1
- {klaude_code-1.2.28 → klaude_code-1.2.29}/pyproject.toml +1 -1
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/config_cmd.py +13 -6
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/list_model.py +1 -1
- klaude_code-1.2.29/src/klaude_code/config/__init__.py +19 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/config/config.py +21 -17
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/mermaid_tool.py +2 -2
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/model.py +1 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/export.py +12 -13
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/session.py +2 -2
- klaude_code-1.2.29/src/klaude_code/session/templates/mermaid_viewer.html +926 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/event_handler.py +3 -1
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/assistant.py +4 -2
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/developer.py +9 -7
- klaude_code-1.2.29/src/klaude_code/ui/renderers/mermaid_viewer.py +58 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/tools.py +39 -15
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/theme.py +6 -0
- klaude_code-1.2.28/src/klaude_code/config/__init__.py +0 -9
- {klaude_code-1.2.28 → klaude_code-1.2.29}/README.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/debug.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/main.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/runtime.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/self_update.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/cli/session_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/clear_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/command_abc.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/debug_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/export_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/export_online_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/fork_session_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/help_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/model_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/prompt-init.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/prompt-jj-describe.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/prompt_command.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/refresh_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/registry.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/release_notes_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/status_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/command/thinking_cmd.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/config/assets/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/config/builtin_config.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/config/select_model.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/const.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/executor.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/manager/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompt.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/reminders.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/task.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/read_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/report_back_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/shell/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/skill/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/todo/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/tool_context.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/tool_registry.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/tool_runner.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/truncation.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/core/turn.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/anthropic/client.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/anthropic/input.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/codex/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/codex/client.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/input_common.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openai_compatible/input.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openrouter/client.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openrouter/input.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/registry.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/responses/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/responses/client.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/responses/input.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/llm/usage.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/commands.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/events.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/llm_param.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/op.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/op_handler.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/sub_agent/task.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/sub_agent/web.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/protocol/tools.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/codec.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/store.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/session/templates/export_session.html +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/loader.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/manager.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/skill/system_skills.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/trace/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/trace/log.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/core/display.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/core/stage_manager.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/debug/display.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/exec/display.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/completers.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/display.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/common.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/diffs.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/errors.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/metadata.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/thinking.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/renderers/user_input.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/code_panel.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/live.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/markdown.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/quote.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/searchable_text.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/rich/status.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/terminal/color.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/terminal/control.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/terminal/notifier.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/utils/__init__.py +0 -0
- {klaude_code-1.2.28 → klaude_code-1.2.29}/src/klaude_code/ui/utils/common.py +0 -0
|
@@ -6,7 +6,7 @@ import sys
|
|
|
6
6
|
|
|
7
7
|
import typer
|
|
8
8
|
|
|
9
|
-
from klaude_code.config import config_path, load_config
|
|
9
|
+
from klaude_code.config import config_path, create_example_config, example_config_path, load_config
|
|
10
10
|
from klaude_code.trace import log
|
|
11
11
|
|
|
12
12
|
|
|
@@ -57,17 +57,24 @@ def edit_config() -> None:
|
|
|
57
57
|
else: # Linux and other Unix systems
|
|
58
58
|
editor = "xdg-open"
|
|
59
59
|
|
|
60
|
-
# Ensure config
|
|
61
|
-
|
|
60
|
+
# Ensure config directory exists and create example config if needed
|
|
61
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
62
|
+
if create_example_config():
|
|
63
|
+
log(f"Created example config: {example_config_path}", style="dim")
|
|
64
|
+
|
|
65
|
+
# Decide which file to open
|
|
66
|
+
target_path = config_path if config_path.exists() else example_config_path
|
|
67
|
+
if target_path == example_config_path:
|
|
68
|
+
log(f"Opening example config (copy to {config_path.name} to use)", style="yellow")
|
|
62
69
|
|
|
63
70
|
try:
|
|
64
71
|
if editor == "open -a TextEdit":
|
|
65
|
-
subprocess.run(["open", "-a", "TextEdit", str(
|
|
72
|
+
subprocess.run(["open", "-a", "TextEdit", str(target_path)], check=True)
|
|
66
73
|
elif editor in ["open", "xdg-open"]:
|
|
67
74
|
# For open/xdg-open, we need to pass the file directly
|
|
68
|
-
subprocess.run([editor, str(
|
|
75
|
+
subprocess.run([editor, str(target_path)], check=True)
|
|
69
76
|
else:
|
|
70
|
-
subprocess.run([editor, str(
|
|
77
|
+
subprocess.run([editor, str(target_path)], check=True)
|
|
71
78
|
except subprocess.CalledProcessError as e:
|
|
72
79
|
log((f"Error: Failed to open editor: {e}", "red"))
|
|
73
80
|
raise typer.Exit(1) from None
|
|
@@ -218,7 +218,7 @@ def display_models_and_providers(config: Config):
|
|
|
218
218
|
|
|
219
219
|
panel = Panel(
|
|
220
220
|
panel_content,
|
|
221
|
-
title=Text(f"Provider: {provider.provider_name}", style=
|
|
221
|
+
title=Text(f"Provider: {provider.provider_name}", style=ThemeKey.CONFIG_PROVIDER),
|
|
222
222
|
border_style=ThemeKey.CONFIG_PANEL_BORDER,
|
|
223
223
|
padding=(0, 1),
|
|
224
224
|
title_align="left",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .config import (
|
|
2
|
+
Config,
|
|
3
|
+
UserConfig,
|
|
4
|
+
config_path,
|
|
5
|
+
create_example_config,
|
|
6
|
+
example_config_path,
|
|
7
|
+
load_config,
|
|
8
|
+
print_no_available_models_hint,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"Config",
|
|
13
|
+
"UserConfig",
|
|
14
|
+
"config_path",
|
|
15
|
+
"create_example_config",
|
|
16
|
+
"example_config_path",
|
|
17
|
+
"load_config",
|
|
18
|
+
"print_no_available_models_hint",
|
|
19
|
+
]
|
|
@@ -51,6 +51,7 @@ def resolve_api_key(value: str | None) -> str | None:
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
config_path = Path.home() / ".klaude" / "klaude-config.yaml"
|
|
54
|
+
example_config_path = Path.home() / ".klaude" / "klaude-config.example.yaml"
|
|
54
55
|
|
|
55
56
|
|
|
56
57
|
class ModelConfig(BaseModel):
|
|
@@ -227,8 +228,8 @@ class Config(BaseModel):
|
|
|
227
228
|
def get_example_config() -> UserConfig:
|
|
228
229
|
"""Generate example config for user reference (will be commented out)."""
|
|
229
230
|
return UserConfig(
|
|
230
|
-
main_model="
|
|
231
|
-
sub_agent_models={"explore": "
|
|
231
|
+
main_model="opus",
|
|
232
|
+
sub_agent_models={"explore": "haiku", "oracle": "gpt-5.2", "webagent": "sonnet", "task": "sonnet"},
|
|
232
233
|
provider_list=[
|
|
233
234
|
UserProviderConfig(
|
|
234
235
|
provider_name="my-provider",
|
|
@@ -357,30 +358,32 @@ def _load_user_config() -> UserConfig | None:
|
|
|
357
358
|
raise ValueError(f"Invalid config file: {config_path}") from e
|
|
358
359
|
|
|
359
360
|
|
|
360
|
-
def
|
|
361
|
-
"""
|
|
362
|
-
|
|
363
|
-
|
|
361
|
+
def create_example_config() -> bool:
|
|
362
|
+
"""Create example config file if it doesn't exist.
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
True if file was created, False if it already exists.
|
|
366
|
+
"""
|
|
367
|
+
if example_config_path.exists():
|
|
368
|
+
return False
|
|
364
369
|
|
|
365
370
|
example_config = get_example_config()
|
|
366
|
-
|
|
371
|
+
example_config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
367
372
|
config_dict = example_config.model_dump(mode="json", exclude_none=True)
|
|
368
373
|
|
|
369
|
-
# Comment out all example config lines
|
|
370
374
|
yaml_str = yaml.dump(config_dict, default_flow_style=False, sort_keys=False) or ""
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
_ =
|
|
375
|
+
header = "# Example configuration for klaude-code\n"
|
|
376
|
+
header += "# Copy this file to klaude-config.yaml and modify as needed.\n"
|
|
377
|
+
header += "# Run `klaude list` to see available models.\n"
|
|
378
|
+
header += "#\n"
|
|
379
|
+
header += "# Built-in providers (anthropic, openai, openrouter, deepseek) are available automatically.\n"
|
|
380
|
+
header += "# Just set the corresponding API key environment variable to use them.\n\n"
|
|
381
|
+
_ = example_config_path.write_text(header + yaml_str)
|
|
382
|
+
return True
|
|
378
383
|
|
|
379
384
|
|
|
380
385
|
def _load_config_uncached() -> Config:
|
|
381
386
|
"""Load and merge builtin + user config. Always returns a valid Config."""
|
|
382
|
-
_ensure_config_file_exists()
|
|
383
|
-
|
|
384
387
|
builtin_config = _get_builtin_config()
|
|
385
388
|
user_config = _load_user_config()
|
|
386
389
|
|
|
@@ -417,6 +420,7 @@ def print_no_available_models_hint() -> None:
|
|
|
417
420
|
log(f" export {env_var}=<your-api-key>", style="dim")
|
|
418
421
|
log("")
|
|
419
422
|
log(f"Or add custom providers in: {config_path}", style="dim")
|
|
423
|
+
log(f"See example config: {example_config_path}", style="dim")
|
|
420
424
|
|
|
421
425
|
|
|
422
426
|
# Expose cache control for tests and callers that need to invalidate the cache.
|
|
@@ -11,7 +11,7 @@ from klaude_code.core.tool.tool_abc import ToolABC, load_desc
|
|
|
11
11
|
from klaude_code.core.tool.tool_registry import register
|
|
12
12
|
from klaude_code.protocol import llm_param, model, tools
|
|
13
13
|
|
|
14
|
-
_MERMAID_LIVE_PREFIX = "https://mermaid.live/
|
|
14
|
+
_MERMAID_LIVE_PREFIX = "https://mermaid.live/view#pako:"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
@register(tools.MERMAID)
|
|
@@ -49,7 +49,7 @@ class MermaidTool(ToolABC):
|
|
|
49
49
|
|
|
50
50
|
link = cls._build_link(args.code)
|
|
51
51
|
line_count = cls._count_lines(args.code)
|
|
52
|
-
ui_extra = model.MermaidLinkUIExtra(link=link, line_count=line_count)
|
|
52
|
+
ui_extra = model.MermaidLinkUIExtra(code=args.code, link=link, line_count=line_count)
|
|
53
53
|
output = f"Mermaid diagram rendered successfully ({line_count} lines)."
|
|
54
54
|
return model.ToolResultItem(status="success", output=output, ui_extra=ui_extra)
|
|
55
55
|
|
|
@@ -421,12 +421,6 @@ def _render_diff_span(span: model.DiffSpan, line_kind: str) -> str:
|
|
|
421
421
|
return f'<span class="diff-span">{text}</span>'
|
|
422
422
|
|
|
423
423
|
|
|
424
|
-
def _get_diff_ui_extra(ui_extra: model.ToolResultUIExtra | None) -> model.DiffUIExtra | None:
|
|
425
|
-
if isinstance(ui_extra, model.DiffUIExtra):
|
|
426
|
-
return ui_extra
|
|
427
|
-
return None
|
|
428
|
-
|
|
429
|
-
|
|
430
424
|
def _render_markdown_doc(doc: model.MarkdownDocUIExtra) -> str:
|
|
431
425
|
encoded = _escape_html(doc.content)
|
|
432
426
|
file_path = _escape_html(doc.file_path)
|
|
@@ -481,21 +475,28 @@ def _build_add_only_diff(text: str, file_path: str) -> model.DiffUIExtra:
|
|
|
481
475
|
def _get_mermaid_link_html(
|
|
482
476
|
ui_extra: model.ToolResultUIExtra | None, tool_call: model.ToolCallItem | None = None
|
|
483
477
|
) -> str | None:
|
|
484
|
-
|
|
478
|
+
code = ""
|
|
479
|
+
link: str | None = None
|
|
480
|
+
line_count = 0
|
|
481
|
+
|
|
482
|
+
if isinstance(ui_extra, model.MermaidLinkUIExtra):
|
|
483
|
+
code = ui_extra.code
|
|
484
|
+
link = ui_extra.link
|
|
485
|
+
line_count = ui_extra.line_count
|
|
486
|
+
|
|
487
|
+
if not code and tool_call and tool_call.name == "Mermaid":
|
|
485
488
|
try:
|
|
486
489
|
args = json.loads(tool_call.arguments)
|
|
487
490
|
code = args.get("code", "")
|
|
488
491
|
except (json.JSONDecodeError, TypeError):
|
|
489
492
|
code = ""
|
|
490
|
-
|
|
491
|
-
code = ""
|
|
493
|
+
line_count = code.count("\n") + 1 if code else 0
|
|
492
494
|
|
|
493
|
-
if not code and not
|
|
495
|
+
if not code and not link:
|
|
494
496
|
return None
|
|
495
497
|
|
|
496
498
|
# Prepare code for rendering and copy
|
|
497
499
|
escaped_code = _escape_html(code) if code else ""
|
|
498
|
-
line_count = code.count("\n") + 1 if code else 0
|
|
499
500
|
|
|
500
501
|
# Build Toolbar
|
|
501
502
|
toolbar_items: list[str] = []
|
|
@@ -512,8 +513,6 @@ def _get_mermaid_link_html(
|
|
|
512
513
|
'<button type="button" class="fullscreen-mermaid-btn" title="View Fullscreen">Fullscreen</button>'
|
|
513
514
|
)
|
|
514
515
|
|
|
515
|
-
link = ui_extra.link if isinstance(ui_extra, model.MermaidLinkUIExtra) else None
|
|
516
|
-
|
|
517
516
|
if link:
|
|
518
517
|
link_url = _escape_html(link)
|
|
519
518
|
buttons_html.append(
|
|
@@ -213,7 +213,7 @@ class Session(BaseModel):
|
|
|
213
213
|
forked.file_tracker = {k: v.model_copy(deep=True) for k, v in self.file_tracker.items()}
|
|
214
214
|
forked.todos = [todo.model_copy(deep=True) for todo in self.todos]
|
|
215
215
|
|
|
216
|
-
items = [
|
|
216
|
+
items = [it.model_copy(deep=True) for it in self.conversation_history]
|
|
217
217
|
if items:
|
|
218
218
|
forked.append_history(items)
|
|
219
219
|
|
|
@@ -246,7 +246,7 @@ class Session(BaseModel):
|
|
|
246
246
|
def need_turn_start(self, prev_item: model.ConversationItem | None, item: model.ConversationItem) -> bool:
|
|
247
247
|
if not isinstance(
|
|
248
248
|
item,
|
|
249
|
-
model.
|
|
249
|
+
model.ReasoningTextItem | model.AssistantMessageItem | model.ToolCallItem,
|
|
250
250
|
):
|
|
251
251
|
return False
|
|
252
252
|
if prev_item is None:
|