klaude-code 2.20.0__tar.gz → 2.21.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.20.0 → klaude_code-2.21.0}/PKG-INFO +2 -4
- {klaude_code-2.20.0 → klaude_code-2.21.0}/README.md +1 -3
- {klaude_code-2.20.0 → klaude_code-2.21.0}/pyproject.toml +6 -2
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/.DS_Store +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/log_viewer.html +18 -5
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/main.py +1 -23
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/assets/builtin_config.yaml +34 -104
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/config.py +0 -14
- klaude_code-2.21.0/src/klaude_code/config/sub_agent_model_helper.py +110 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/thinking.py +0 -4
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/const.py +5 -5
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/agent_profile.py +8 -108
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/bash_mode.py +3 -3
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/executor.py +9 -10
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/loaded_skills.py +14 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/llm_clients_builder.py +1 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/sub_agent_manager.py +0 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/memory.py +37 -1
- klaude_code-2.21.0/src/klaude_code/core/prompts/auto-memory-prompt.md +29 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/base-system-prompt.md +13 -15
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/system_prompt.py +89 -2
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/reminders.py +44 -13
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/task.py +7 -6
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/__init__.py +0 -4
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/rewind_tool.md +1 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/task_tool.md +1 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/task_tool.py +0 -7
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_fetch_tool.py +24 -13
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/turn.py +2 -30
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/anthropic/input.py +3 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/google/client.py +0 -68
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/google/input.py +4 -9
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/image.py +0 -63
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/input_common.py +15 -29
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/input.py +1 -2
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/stream.py +0 -50
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_responses/input.py +3 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/client.py +0 -9
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/input.py +19 -10
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/reasoning.py +4 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/usage.py +0 -7
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/events.py +1 -16
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/llm_param.py +0 -18
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/message.py +6 -50
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/model.py +2 -17
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/model_id.py +0 -21
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/op.py +1 -2
- klaude_code-2.21.0/src/klaude_code/protocol/sub_agent/AGENTS.md +19 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/sub_agent/__init__.py +2 -11
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/tools.py +0 -2
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/export.py +12 -187
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/session.py +13 -17
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/store.py +3 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/templates/export_session.html +0 -308
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/.DS_Store +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/.DS_Store +0 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/frontend-design/SKILL.md +42 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/.DS_Store +0 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/LICENSE.txt +201 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/SKILL.md +175 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/cli.md +132 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/codex-network.md +28 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/image-api.md +36 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/prompting.md +81 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/references/sample-prompts.md +384 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/gpt-image-gen/scripts/image_gen.py +851 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/SKILL.md +107 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/cli.md +140 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/gemini-api.md +92 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/prompting.md +141 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/sample-prompts.md +183 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/references/vertex-setup.md +108 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/nano-banana-image-gen/scripts/gemini_image_gen.py +571 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/SKILL.md +315 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/forms.md +294 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/reference.md +612 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/check_bounding_boxes.py +69 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/check_fillable_fields.py +9 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/convert_pdf_to_images.py +31 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/create_validation_image.py +37 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/extract_form_field_info.py +123 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/extract_form_structure.py +116 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/fill_fillable_fields.py +102 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/pdf/scripts/fill_pdf_form_with_annotations.py +99 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/.gitignore +1 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/SKILL.md +28 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/bun.lock +182 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/package.json +9 -0
- klaude_code-2.21.0/src/klaude_code/skill/assets/render-mermaid/scripts/render_mermaid.js +182 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/skill-creator/SKILL.md +75 -17
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/loader.py +54 -6
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/manager.py +16 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/system_skills.py +2 -2
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/auth_selector.py +1 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/copy_cmd.py +4 -39
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/refresh_cmd.py +5 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/sub_agent_model_cmd.py +1 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/commands.py +0 -11
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/metadata.py +0 -16
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/markdown.py +70 -16
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/status.py +14 -42
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/theme.py +10 -5
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/tools.py +74 -125
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/welcome.py +33 -8
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/display.py +14 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/completers.py +31 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/paste.py +1 -1
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/machine.py +1 -24
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/renderer.py +23 -31
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/runner.py +0 -14
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/image.py +46 -9
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/selector.py +2 -14
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/__init__.py +0 -2
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/common.py +0 -10
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/core/display.py +1 -1
- klaude_code-2.20.0/src/klaude_code/config/sub_agent_model_helper.py +0 -213
- klaude_code-2.20.0/src/klaude_code/core/prompts/prompt-sub-agent-image-gen.md +0 -6
- klaude_code-2.20.0/src/klaude_code/core/tool/image_gen_tool.md +0 -16
- klaude_code-2.20.0/src/klaude_code/core/tool/image_gen_tool.py +0 -147
- klaude_code-2.20.0/src/klaude_code/core/tool/mermaid_tool.md +0 -64
- klaude_code-2.20.0/src/klaude_code/core/tool/mermaid_tool.py +0 -74
- klaude_code-2.20.0/src/klaude_code/protocol/sub_agent/AGENTS.md +0 -28
- klaude_code-2.20.0/src/klaude_code/protocol/sub_agent/image_gen.py +0 -38
- klaude_code-2.20.0/src/klaude_code/session/templates/mermaid_viewer.html +0 -1011
- klaude_code-2.20.0/src/klaude_code/tui/components/mermaid_viewer.py +0 -163
- klaude_code-2.20.0/src/klaude_code/ui/debug_mode.py +0 -37
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/app/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/app/auth_flow.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/app/runtime.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/AGENTS.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/base.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/exceptions.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/oauth.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/claude/token_manager.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/exceptions.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/oauth.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/copilot/token_manager.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/auth/env.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/config_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/cost_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/debug.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/list_model.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/log_server.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/oauth_usage.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/cli/self_update.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/assets/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/builtin_config.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/config/model_matcher.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/AGENTS.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/compaction.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/overflow.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/compaction/prompts.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/rewind/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/rewind/manager.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/context.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/read_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/offload.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/report_back_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/rewind_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/tool_registry.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/tool_runner.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/external_content.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/ssrf.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_cache.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/anthropic/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/bedrock_anthropic/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/bedrock_anthropic/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/claude/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/claude/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/copilot/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/copilot/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/google/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/google_vertex/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/google_vertex/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/json_stable.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_codex/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_codex/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_responses/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openai_responses/client.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/partial_message.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/registry.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/llm/stream_parts.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/log.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/commands.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/op_handler.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/protocol/sub_agent/task.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/codec.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/executing-plans/SKILL.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/session-logs/SKILL.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/web-search/SKILL.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/skill/assets/writing-plans/SKILL.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/clear_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/command_abc.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/compact_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/continue_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/debug_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/export_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/export_online_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/fork_session_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/login_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/logout_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/model_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/model_picker.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/prompt-init.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/prompt_command.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/registry.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/resume_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/status_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/command/thinking_cmd.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/bash_syntax.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/command_output.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/common.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/developer.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/diffs.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/errors.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/cjk_wrap.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/code_panel.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/live.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/rich/quote.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/sub_agent.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/thinking.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/components/user_input.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/AGENTS.md +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/drag_drop.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/images.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/key_bindings.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/input/prompt_toolkit.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/color.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/control.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/notifier.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/tui/terminal/progress_bar.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.0}/src/klaude_code/ui/terminal/title.py +0 -0
- {klaude_code-2.20.0 → klaude_code-2.21.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.21.0
|
|
4
4
|
Summary: Minimal code agent CLI
|
|
5
5
|
Requires-Dist: anthropic>=0.66.0
|
|
6
6
|
Requires-Dist: chardet>=5.2.0,<6
|
|
@@ -29,7 +29,7 @@ Minimal code agent CLI.
|
|
|
29
29
|
- **Keep reasoning item in context**: Interleaved thinking support
|
|
30
30
|
- **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
|
|
31
31
|
- **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
|
|
32
|
-
- **Sub-agents**: Task, Explore, Web
|
|
32
|
+
- **Sub-agents**: Task, Explore, Web
|
|
33
33
|
- **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
|
|
34
34
|
- **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
|
|
35
35
|
- **External file sync**: Monitoring for external edits (linter, manual)
|
|
@@ -37,7 +37,6 @@ Minimal code agent CLI.
|
|
|
37
37
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
38
38
|
- **Agent Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `//skill` or `/skill`)
|
|
39
39
|
- **Sessions**: Resumable with `--continue`
|
|
40
|
-
- **Mermaid diagrams**: Terminal image preview and Interactive local HTML viewer with zoom, pan, and SVG export
|
|
41
40
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
42
41
|
|
|
43
42
|
## Installation
|
|
@@ -275,4 +274,3 @@ The main agent can spawn specialized sub-agents for specific tasks:
|
|
|
275
274
|
| **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
|
|
276
275
|
| **Task** | Handle complex multi-step tasks autonomously |
|
|
277
276
|
| **WebAgent** | Search the web, fetch pages, and analyze content. Uses Brave LLM Context API when `BRAVE_API_KEY` is set, otherwise falls back to DuckDuckGo |
|
|
278
|
-
| **ImageGen** | Generate images from text prompts via OpenRouter Nano Banana Pro |
|
|
@@ -7,7 +7,7 @@ Minimal code agent CLI.
|
|
|
7
7
|
- **Keep reasoning item in context**: Interleaved thinking support
|
|
8
8
|
- **Model-aware tools**: Claude Code tool set for Opus, `apply_patch` for GPT-5/Codex
|
|
9
9
|
- **Reminders**: Cooldown-based todo tracking, instruction reinforcement and external file change reminder
|
|
10
|
-
- **Sub-agents**: Task, Explore, Web
|
|
10
|
+
- **Sub-agents**: Task, Explore, Web
|
|
11
11
|
- **Structured sub-agent output**: Main agent defines JSON schema and get schema-compliant responses via constrained decoding
|
|
12
12
|
- **Recursive `@file` mentions**: Circular dependency protection, relative path resolution
|
|
13
13
|
- **External file sync**: Monitoring for external edits (linter, manual)
|
|
@@ -15,7 +15,6 @@ Minimal code agent CLI.
|
|
|
15
15
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
16
16
|
- **Agent Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `//skill` or `/skill`)
|
|
17
17
|
- **Sessions**: Resumable with `--continue`
|
|
18
|
-
- **Mermaid diagrams**: Terminal image preview and Interactive local HTML viewer with zoom, pan, and SVG export
|
|
19
18
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
20
19
|
|
|
21
20
|
## Installation
|
|
@@ -253,4 +252,3 @@ The main agent can spawn specialized sub-agents for specific tasks:
|
|
|
253
252
|
| **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
|
|
254
253
|
| **Task** | Handle complex multi-step tasks autonomously |
|
|
255
254
|
| **WebAgent** | Search the web, fetch pages, and analyze content. Uses Brave LLM Context API when `BRAVE_API_KEY` is set, otherwise falls back to DuckDuckGo |
|
|
256
|
-
| **ImageGen** | Generate images from text prompts via OpenRouter Nano Banana Pro |
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "klaude-code"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.21.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
|
+
"ruff==0.14.3",
|
|
43
44
|
"ty>=0.0.8",
|
|
44
45
|
]
|
|
45
46
|
|
|
@@ -69,7 +70,10 @@ venv = ".venv"
|
|
|
69
70
|
extraPaths = ["src"]
|
|
70
71
|
reportMissingImports = "warning"
|
|
71
72
|
reportMissingModuleSource = "warning"
|
|
72
|
-
exclude = [
|
|
73
|
+
exclude = [
|
|
74
|
+
".venv/",
|
|
75
|
+
"src/klaude_code/skill/assets/**/scripts/",
|
|
76
|
+
]
|
|
73
77
|
|
|
74
78
|
[[tool.pyright.executionEnvironments]]
|
|
75
79
|
root = "."
|
|
Binary file
|
|
@@ -93,10 +93,13 @@ body {
|
|
|
93
93
|
flex-wrap: wrap;
|
|
94
94
|
}
|
|
95
95
|
.filter-btn {
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
display: inline-flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
gap: 6px;
|
|
99
|
+
background: var(--bg-surface);
|
|
100
|
+
border: 1px solid var(--border-strong);
|
|
98
101
|
color: var(--fg-secondary);
|
|
99
|
-
padding: 4px
|
|
102
|
+
padding: 4px 10px;
|
|
100
103
|
border-radius: 6px;
|
|
101
104
|
font-size: 16px;
|
|
102
105
|
font-weight: 700;
|
|
@@ -105,13 +108,23 @@ body {
|
|
|
105
108
|
transition: all 0.2s ease;
|
|
106
109
|
line-height: 1.2;
|
|
107
110
|
}
|
|
108
|
-
.filter-btn:hover {
|
|
111
|
+
.filter-btn:hover {
|
|
112
|
+
background: var(--bg-hover);
|
|
113
|
+
color: var(--fg);
|
|
114
|
+
border-color: var(--fg-tertiary);
|
|
115
|
+
}
|
|
109
116
|
.filter-btn.active {
|
|
110
117
|
background: #dbeafe;
|
|
111
118
|
color: #1e3a8a;
|
|
112
|
-
border-color:
|
|
119
|
+
border-color: #bfdbfe;
|
|
113
120
|
box-shadow: none;
|
|
114
121
|
}
|
|
122
|
+
.filter-btn.active::after {
|
|
123
|
+
content: '\00d7';
|
|
124
|
+
font-size: 14px;
|
|
125
|
+
line-height: 1;
|
|
126
|
+
opacity: 0.85;
|
|
127
|
+
}
|
|
115
128
|
|
|
116
129
|
#search-box {
|
|
117
130
|
background: var(--bg-surface);
|
|
@@ -35,7 +35,6 @@ def _build_env_help() -> str:
|
|
|
35
35
|
" KLAUDE_READ_GLOBAL_LINE_CAP Max lines to read (default: 2000)",
|
|
36
36
|
" KLAUDE_READ_MAX_CHARS Max total chars to read (default: 50000)",
|
|
37
37
|
" KLAUDE_READ_MAX_IMAGE_BYTES Max image bytes to read (default: 64MB)",
|
|
38
|
-
" KLAUDE_IMAGE_OUTPUT_MAX_BYTES Max decoded image bytes (default: 64MB)",
|
|
39
38
|
]
|
|
40
39
|
)
|
|
41
40
|
return "\n\n".join(lines)
|
|
@@ -188,12 +187,6 @@ def main_callback(
|
|
|
188
187
|
"--vanilla",
|
|
189
188
|
help="Minimal mode: basic tools only, no system prompts",
|
|
190
189
|
),
|
|
191
|
-
banana: bool = typer.Option(
|
|
192
|
-
False,
|
|
193
|
-
"--banana",
|
|
194
|
-
help="Image generation mode (alias for --model banana)",
|
|
195
|
-
rich_help_panel="LLM",
|
|
196
|
-
),
|
|
197
190
|
version: bool = typer.Option(
|
|
198
191
|
False,
|
|
199
192
|
"--version",
|
|
@@ -208,10 +201,6 @@ def main_callback(
|
|
|
208
201
|
if ctx.invoked_subcommand is None:
|
|
209
202
|
from klaude_code.log import log
|
|
210
203
|
|
|
211
|
-
if vanilla and banana:
|
|
212
|
-
log(("Error: --banana cannot be combined with --vanilla", "red"))
|
|
213
|
-
raise typer.Exit(2)
|
|
214
|
-
|
|
215
204
|
resume_by_id_value = resume_by_id.strip() if resume_by_id is not None else None
|
|
216
205
|
if resume_by_id_value == "":
|
|
217
206
|
log(("Error: --resume <id> cannot be empty", "red"))
|
|
@@ -249,18 +238,7 @@ def main_callback(
|
|
|
249
238
|
update_terminal_title()
|
|
250
239
|
|
|
251
240
|
chosen_model = model
|
|
252
|
-
if
|
|
253
|
-
keywords = ["gemini-3-pro-image", "gemini-2.5-flash-image"]
|
|
254
|
-
model_result = select_model_interactive(keywords=keywords)
|
|
255
|
-
if model_result.status == ModelSelectStatus.SELECTED and model_result.model is not None:
|
|
256
|
-
chosen_model = model_result.model
|
|
257
|
-
elif model_result.status == ModelSelectStatus.CANCELLED:
|
|
258
|
-
return
|
|
259
|
-
else:
|
|
260
|
-
log(("Error: no available nano-banana model", "red"))
|
|
261
|
-
log(("Hint: set OPENROUTER_API_KEY or GOOGLE_API_KEY to enable nano-banana models", "yellow"))
|
|
262
|
-
raise typer.Exit(2)
|
|
263
|
-
elif model or select_model:
|
|
241
|
+
if model or select_model:
|
|
264
242
|
model_result = select_model_interactive(preferred=model)
|
|
265
243
|
if model_result.status == ModelSelectStatus.SELECTED and model_result.model is not None:
|
|
266
244
|
chosen_model = model_result.model
|
|
@@ -42,28 +42,19 @@ provider_list:
|
|
|
42
42
|
reasoning_summary: concise
|
|
43
43
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
44
44
|
|
|
45
|
-
- model_name: gpt-5.
|
|
46
|
-
model_id: gpt-5.
|
|
47
|
-
context_limit: 400000
|
|
48
|
-
verbosity: high
|
|
45
|
+
- model_name: gpt-5.3-codex
|
|
46
|
+
model_id: gpt-5.3-codex
|
|
49
47
|
thinking:
|
|
50
|
-
reasoning_effort:
|
|
51
|
-
reasoning_summary:
|
|
52
|
-
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
53
|
-
|
|
54
|
-
- model_name: gpt-5.2-low
|
|
55
|
-
model_id: gpt-5.2
|
|
48
|
+
reasoning_effort: high
|
|
49
|
+
reasoning_summary: auto
|
|
56
50
|
context_limit: 400000
|
|
57
|
-
|
|
58
|
-
thinking:
|
|
59
|
-
reasoning_effort: low
|
|
60
|
-
reasoning_summary: concise
|
|
51
|
+
max_tokens: 128000
|
|
61
52
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
62
53
|
|
|
63
|
-
- model_name: gpt-5.3-codex
|
|
54
|
+
- model_name: gpt-5.3-codex-xhigh
|
|
64
55
|
model_id: gpt-5.3-codex
|
|
65
56
|
thinking:
|
|
66
|
-
reasoning_effort:
|
|
57
|
+
reasoning_effort: xhigh
|
|
67
58
|
reasoning_summary: auto
|
|
68
59
|
context_limit: 400000
|
|
69
60
|
max_tokens: 128000
|
|
@@ -75,7 +66,7 @@ provider_list:
|
|
|
75
66
|
model_list:
|
|
76
67
|
|
|
77
68
|
- model_name: gpt-5.3-codex
|
|
78
|
-
model_id: gpt-5.3-codex
|
|
69
|
+
model_id: openai/gpt-5.3-codex
|
|
79
70
|
thinking:
|
|
80
71
|
reasoning_effort: high
|
|
81
72
|
reasoning_summary: auto
|
|
@@ -83,23 +74,22 @@ provider_list:
|
|
|
83
74
|
max_tokens: 128000
|
|
84
75
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
85
76
|
|
|
86
|
-
- model_name: gpt-5.
|
|
87
|
-
model_id: openai/gpt-5.
|
|
88
|
-
max_tokens: 128000
|
|
89
|
-
context_limit: 400000
|
|
90
|
-
verbosity: high
|
|
77
|
+
- model_name: gpt-5.3-codex-xhigh
|
|
78
|
+
model_id: openai/gpt-5.3-codex
|
|
91
79
|
thinking:
|
|
92
|
-
reasoning_effort:
|
|
93
|
-
reasoning_summary:
|
|
80
|
+
reasoning_effort: xhigh
|
|
81
|
+
reasoning_summary: auto
|
|
82
|
+
context_limit: 400000
|
|
83
|
+
max_tokens: 128000
|
|
94
84
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
95
85
|
|
|
96
|
-
- model_name: gpt-5.2-
|
|
86
|
+
- model_name: gpt-5.2-high
|
|
97
87
|
model_id: openai/gpt-5.2
|
|
98
88
|
max_tokens: 128000
|
|
99
89
|
context_limit: 400000
|
|
100
90
|
verbosity: high
|
|
101
91
|
thinking:
|
|
102
|
-
reasoning_effort:
|
|
92
|
+
reasoning_effort: high
|
|
103
93
|
reasoning_summary: concise
|
|
104
94
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
105
95
|
|
|
@@ -176,32 +166,6 @@ provider_list:
|
|
|
176
166
|
reasoning_effort: medium
|
|
177
167
|
cost: { input: 0.5, output: 3, cache_read: 0.05 }
|
|
178
168
|
|
|
179
|
-
- model_name: nano-banana-pro
|
|
180
|
-
model_id: google/gemini-3-pro-image-preview
|
|
181
|
-
context_limit: 66000
|
|
182
|
-
modalities:
|
|
183
|
-
- image
|
|
184
|
-
- text
|
|
185
|
-
image_config:
|
|
186
|
-
image_size: "4K"
|
|
187
|
-
cost: { input: 2, output: 12, cache_read: 0.2, image: 120 }
|
|
188
|
-
|
|
189
|
-
- model_name: nano-banana
|
|
190
|
-
model_id: google/gemini-2.5-flash-image
|
|
191
|
-
context_limit: 33000
|
|
192
|
-
modalities:
|
|
193
|
-
- image
|
|
194
|
-
- text
|
|
195
|
-
cost: { input: 0.3, output: 2.5, cache_read: 0.03, image: 30 }
|
|
196
|
-
|
|
197
|
-
- model_name: aurora
|
|
198
|
-
model_id: openrouter/aurora-alpha
|
|
199
|
-
context_limit: 128000
|
|
200
|
-
thinking:
|
|
201
|
-
type: enabled
|
|
202
|
-
budget_tokens: 2048
|
|
203
|
-
cost: { input: 0, output: 0 }
|
|
204
|
-
|
|
205
169
|
- model_name: grok
|
|
206
170
|
model_id: x-ai/grok-4.1-fast
|
|
207
171
|
context_limit: 2000000
|
|
@@ -230,22 +194,6 @@ provider_list:
|
|
|
230
194
|
- z-ai
|
|
231
195
|
cost: { input: 1, output: 3.2, cache_read: 0.1 }
|
|
232
196
|
|
|
233
|
-
- model_name: seedream
|
|
234
|
-
model_id: bytedance-seed/seedream-4.5
|
|
235
|
-
context_limit: 4000
|
|
236
|
-
cost: { input: 0, output: 9.581, image: 9.581 }
|
|
237
|
-
modalities:
|
|
238
|
-
- image
|
|
239
|
-
- text
|
|
240
|
-
|
|
241
|
-
- model_name: flux
|
|
242
|
-
model_id: black-forest-labs/flux.2-max
|
|
243
|
-
context_limit: 47000
|
|
244
|
-
cost: { input: 7.32, output: 7.32, image: 7.32 }
|
|
245
|
-
modalities:
|
|
246
|
-
- image
|
|
247
|
-
- text
|
|
248
|
-
|
|
249
197
|
- provider_name: google
|
|
250
198
|
protocol: google
|
|
251
199
|
api_key: ${GOOGLE_API_KEY}
|
|
@@ -265,24 +213,6 @@ provider_list:
|
|
|
265
213
|
reasoning_effort: medium
|
|
266
214
|
cost: { input: 0.5, output: 3, cache_read: 0.05 }
|
|
267
215
|
|
|
268
|
-
- model_name: nano-banana-pro
|
|
269
|
-
model_id: gemini-3-pro-image-preview
|
|
270
|
-
context_limit: 66000
|
|
271
|
-
modalities:
|
|
272
|
-
- image
|
|
273
|
-
- text
|
|
274
|
-
image_config:
|
|
275
|
-
image_size: "4K"
|
|
276
|
-
cost: { input: 2, output: 12, cache_read: 0.2, image: 120 }
|
|
277
|
-
|
|
278
|
-
- model_name: nano-banana
|
|
279
|
-
model_id: gemini-2.5-flash-image
|
|
280
|
-
context_limit: 33000
|
|
281
|
-
modalities:
|
|
282
|
-
- image
|
|
283
|
-
- text
|
|
284
|
-
cost: { input: 0.3, output: 2.5, cache_read: 0.03, image: 30 }
|
|
285
|
-
|
|
286
216
|
- provider_name: google-vertex
|
|
287
217
|
protocol: google_vertex
|
|
288
218
|
google_application_credentials: ${GOOGLE_APPLICATION_CREDENTIALS}
|
|
@@ -304,24 +234,6 @@ provider_list:
|
|
|
304
234
|
reasoning_effort: medium
|
|
305
235
|
cost: { input: 0.5, output: 3, cache_read: 0.05 }
|
|
306
236
|
|
|
307
|
-
- model_name: nano-banana-pro
|
|
308
|
-
model_id: gemini-3-pro-image-preview
|
|
309
|
-
context_limit: 66000
|
|
310
|
-
modalities:
|
|
311
|
-
- image
|
|
312
|
-
- text
|
|
313
|
-
image_config:
|
|
314
|
-
image_size: "4K"
|
|
315
|
-
cost: { input: 2, output: 12, cache_read: 0.2, image: 120 }
|
|
316
|
-
|
|
317
|
-
- model_name: nano-banana
|
|
318
|
-
model_id: gemini-2.5-flash-image
|
|
319
|
-
context_limit: 33000
|
|
320
|
-
modalities:
|
|
321
|
-
- image
|
|
322
|
-
- text
|
|
323
|
-
cost: { input: 0.3, output: 2.5, cache_read: 0.03, image: 30 }
|
|
324
|
-
|
|
325
237
|
- provider_name: bedrock
|
|
326
238
|
protocol: bedrock
|
|
327
239
|
aws_access_key: ${AWS_ACCESS_KEY_ID}
|
|
@@ -441,6 +353,15 @@ provider_list:
|
|
|
441
353
|
max_tokens: 128000
|
|
442
354
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
443
355
|
|
|
356
|
+
- model_name: gpt-5.3-codex-xhigh
|
|
357
|
+
model_id: gpt-5.3-codex
|
|
358
|
+
thinking:
|
|
359
|
+
reasoning_effort: xhigh
|
|
360
|
+
reasoning_summary: auto
|
|
361
|
+
context_limit: 400000
|
|
362
|
+
max_tokens: 128000
|
|
363
|
+
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
364
|
+
|
|
444
365
|
- provider_name: copilot
|
|
445
366
|
protocol: copilot_oauth
|
|
446
367
|
model_list:
|
|
@@ -454,6 +375,15 @@ provider_list:
|
|
|
454
375
|
max_tokens: 128000
|
|
455
376
|
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
456
377
|
|
|
378
|
+
- model_name: gpt-5.3-codex-xhigh
|
|
379
|
+
model_id: gpt-5.3-codex
|
|
380
|
+
thinking:
|
|
381
|
+
reasoning_effort: xhigh
|
|
382
|
+
reasoning_summary: auto
|
|
383
|
+
context_limit: 400000
|
|
384
|
+
max_tokens: 128000
|
|
385
|
+
cost: { input: 1.75, output: 14, cache_read: 0.17 }
|
|
386
|
+
|
|
457
387
|
- model_name: sonnet
|
|
458
388
|
model_id: claude-sonnet-4-6
|
|
459
389
|
context_limit: 200000
|
|
@@ -383,20 +383,6 @@ class Config(BaseModel):
|
|
|
383
383
|
if include_disabled or not model.disabled
|
|
384
384
|
]
|
|
385
385
|
|
|
386
|
-
def has_available_image_model(self) -> bool:
|
|
387
|
-
"""Check if any image generation model is available."""
|
|
388
|
-
for entry in self.iter_model_entries(only_available=True, include_disabled=False):
|
|
389
|
-
if entry.modalities and "image" in entry.modalities:
|
|
390
|
-
return True
|
|
391
|
-
return False
|
|
392
|
-
|
|
393
|
-
def get_first_available_image_model(self) -> str | None:
|
|
394
|
-
"""Get the first available image generation model, or None."""
|
|
395
|
-
for entry in self.iter_model_entries(only_available=True, include_disabled=False):
|
|
396
|
-
if entry.modalities and "image" in entry.modalities:
|
|
397
|
-
return entry.model_name
|
|
398
|
-
return None
|
|
399
|
-
|
|
400
386
|
async def save(self) -> None:
|
|
401
387
|
"""Save user config to file (excludes builtin providers).
|
|
402
388
|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Helper for sub-agent model availability and selection logic."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from klaude_code.protocol import tools
|
|
9
|
+
from klaude_code.protocol.sub_agent import (
|
|
10
|
+
SubAgentProfile,
|
|
11
|
+
get_sub_agent_profile,
|
|
12
|
+
iter_sub_agent_profiles,
|
|
13
|
+
)
|
|
14
|
+
from klaude_code.protocol.tools import SubAgentType
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from klaude_code.config.config import Config, ModelEntry
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class SubAgentModelInfo:
|
|
22
|
+
"""Sub-agent and its current model configuration."""
|
|
23
|
+
|
|
24
|
+
profile: SubAgentProfile
|
|
25
|
+
# Explicitly configured model selector (from config), if any.
|
|
26
|
+
configured_model: str | None
|
|
27
|
+
|
|
28
|
+
# Effective model name used by this sub-agent.
|
|
29
|
+
# - When configured_model is set: equals configured_model.
|
|
30
|
+
# - When inheriting from defaults: resolved model name.
|
|
31
|
+
effective_model: str | None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass(frozen=True, slots=True)
|
|
35
|
+
class EmptySubAgentModelBehavior:
|
|
36
|
+
"""Human-facing description for an unset (empty) sub-agent model config."""
|
|
37
|
+
|
|
38
|
+
# Summary text for UI (kept UI-framework agnostic).
|
|
39
|
+
description: str
|
|
40
|
+
|
|
41
|
+
# Best-effort resolved model name (if any).
|
|
42
|
+
resolved_model_name: str | None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class SubAgentModelHelper:
|
|
46
|
+
"""Centralized logic for sub-agent availability and model selection."""
|
|
47
|
+
|
|
48
|
+
def __init__(self, config: Config) -> None:
|
|
49
|
+
self._config = config
|
|
50
|
+
|
|
51
|
+
def describe_empty_model_config_behavior(
|
|
52
|
+
self,
|
|
53
|
+
sub_agent_type: str,
|
|
54
|
+
*,
|
|
55
|
+
main_model_name: str,
|
|
56
|
+
) -> EmptySubAgentModelBehavior:
|
|
57
|
+
"""Describe what happens when a sub-agent model is not configured.
|
|
58
|
+
|
|
59
|
+
Sub-agents default to the Task model if configured, otherwise
|
|
60
|
+
they inherit the main model.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
_ = get_sub_agent_profile(sub_agent_type)
|
|
64
|
+
task_model = self._config.sub_agent_models.get(tools.TASK)
|
|
65
|
+
resolved = task_model or main_model_name
|
|
66
|
+
return EmptySubAgentModelBehavior(
|
|
67
|
+
description=f"use default behavior: {resolved}",
|
|
68
|
+
resolved_model_name=resolved,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
def get_available_sub_agents(self) -> list[SubAgentModelInfo]:
|
|
72
|
+
"""Return all available sub-agents with their current model config.
|
|
73
|
+
|
|
74
|
+
For sub-agents without explicit config, resolve from Task/main defaults.
|
|
75
|
+
"""
|
|
76
|
+
result: list[SubAgentModelInfo] = []
|
|
77
|
+
for profile in iter_sub_agent_profiles():
|
|
78
|
+
configured_model = self._config.sub_agent_models.get(profile.name)
|
|
79
|
+
effective_model = (
|
|
80
|
+
configured_model or self._config.sub_agent_models.get(tools.TASK) or self._config.main_model
|
|
81
|
+
)
|
|
82
|
+
result.append(
|
|
83
|
+
SubAgentModelInfo(
|
|
84
|
+
profile=profile,
|
|
85
|
+
configured_model=configured_model,
|
|
86
|
+
effective_model=effective_model,
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
return result
|
|
90
|
+
|
|
91
|
+
def get_selectable_models(self, sub_agent_type: str) -> list[ModelEntry]:
|
|
92
|
+
"""Return selectable models for a specific sub-agent type.
|
|
93
|
+
|
|
94
|
+
Returns all available models.
|
|
95
|
+
"""
|
|
96
|
+
_ = get_sub_agent_profile(sub_agent_type)
|
|
97
|
+
all_models = self._config.iter_model_entries(only_available=True, include_disabled=False)
|
|
98
|
+
return all_models
|
|
99
|
+
|
|
100
|
+
def build_sub_agent_client_configs(self) -> dict[SubAgentType, str]:
|
|
101
|
+
"""Return model names for each sub-agent that needs a dedicated client."""
|
|
102
|
+
result: dict[SubAgentType, str] = {}
|
|
103
|
+
for profile in iter_sub_agent_profiles():
|
|
104
|
+
model_name = self._config.sub_agent_models.get(profile.name)
|
|
105
|
+
if model_name:
|
|
106
|
+
result[profile.name] = model_name
|
|
107
|
+
task_model = self._config.sub_agent_models.get(tools.TASK)
|
|
108
|
+
if task_model:
|
|
109
|
+
result.setdefault(tools.TASK, task_model)
|
|
110
|
+
return result
|
|
@@ -10,7 +10,6 @@ from typing import Literal
|
|
|
10
10
|
from klaude_code.protocol import llm_param
|
|
11
11
|
from klaude_code.protocol.model_id import (
|
|
12
12
|
is_claude_model_any,
|
|
13
|
-
is_codex_max_model,
|
|
14
13
|
is_gemini_flash_model,
|
|
15
14
|
is_gpt51_model,
|
|
16
15
|
is_gpt52_model,
|
|
@@ -24,7 +23,6 @@ ReasoningEffort = Literal["high", "medium", "low", "minimal", "none", "xhigh"]
|
|
|
24
23
|
RESPONSES_LEVELS = ["low", "medium", "high"]
|
|
25
24
|
RESPONSES_GPT51_LEVELS = ["none", "low", "medium", "high"]
|
|
26
25
|
RESPONSES_GPT52_LEVELS = ["none", "low", "medium", "high", "xhigh"]
|
|
27
|
-
RESPONSES_CODEX_MAX_LEVELS = ["medium", "high", "xhigh"]
|
|
28
26
|
RESPONSES_GEMINI_FLASH_LEVELS = ["minimal", "low", "medium", "high"]
|
|
29
27
|
|
|
30
28
|
ANTHROPIC_LEVELS: list[tuple[str, int | None]] = [
|
|
@@ -37,8 +35,6 @@ ANTHROPIC_LEVELS: list[tuple[str, int | None]] = [
|
|
|
37
35
|
|
|
38
36
|
def get_levels_for_responses(model_name: str | None) -> list[str]:
|
|
39
37
|
"""Get thinking levels for responses protocol."""
|
|
40
|
-
if is_codex_max_model(model_name):
|
|
41
|
-
return RESPONSES_CODEX_MAX_LEVELS
|
|
42
38
|
if is_gpt52_model(model_name):
|
|
43
39
|
return RESPONSES_GPT52_LEVELS
|
|
44
40
|
if is_gpt51_model(model_name):
|
|
@@ -51,8 +51,6 @@ OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1" # OpenRouter API base URL
|
|
|
51
51
|
CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex" # Codex API base URL
|
|
52
52
|
CODEX_USER_AGENT = "pi" # Codex user agent string
|
|
53
53
|
|
|
54
|
-
SUPPORTED_IMAGE_SIZES = {"1K", "2K", "4K"} # Supported image sizes for ImageGen tool
|
|
55
|
-
|
|
56
54
|
LOW_CACHE_HIT_RATE_THRESHOLD = 0.9 # Cache hit rate below this triggers a warning
|
|
57
55
|
THROUGHPUT_MIN_DURATION_SEC = 0.15 # Minimum duration (seconds) for throughput calculation
|
|
58
56
|
INITIAL_RETRY_DELAY_S = 1.0 # Initial delay before retrying a failed turn (seconds)
|
|
@@ -82,7 +80,6 @@ READ_CHAR_LIMIT_PER_LINE = 2000 # Maximum characters per line before truncation
|
|
|
82
80
|
READ_GLOBAL_LINE_CAP = _get_int_env("KLAUDE_READ_GLOBAL_LINE_CAP", 2000) # Maximum lines to read from a file
|
|
83
81
|
READ_MAX_CHARS = _get_int_env("KLAUDE_READ_MAX_CHARS", 50000) # Maximum total characters to read
|
|
84
82
|
READ_MAX_IMAGE_BYTES = _get_int_env("KLAUDE_READ_MAX_IMAGE_BYTES", 64 * 1024 * 1024) # Max image size (64MB)
|
|
85
|
-
IMAGE_OUTPUT_MAX_BYTES = _get_int_env("KLAUDE_IMAGE_OUTPUT_MAX_BYTES", 64 * 1024 * 1024) # Max decoded image (64MB)
|
|
86
83
|
BINARY_CHECK_SIZE = 8192 # Bytes to check for binary file detection
|
|
87
84
|
|
|
88
85
|
|
|
@@ -102,13 +99,12 @@ BASH_MODE_SESSION_OUTPUT_MAX_BYTES = 200 * 1024 * 1024 # Max command output cap
|
|
|
102
99
|
WEB_FETCH_DEFAULT_TIMEOUT_SEC = 30 # Default timeout for web fetch requests (seconds)
|
|
103
100
|
WEB_FETCH_USER_AGENT = "Mozilla/5.0 (compatible; KlaudeCode/1.0)" # User-Agent header for web requests
|
|
104
101
|
WEB_FETCH_MAX_RESPONSE_BYTES = 5 * 1024 * 1024 # Maximum response body size (5MB)
|
|
105
|
-
WEB_FETCH_MAX_REDIRECTS =
|
|
102
|
+
WEB_FETCH_MAX_REDIRECTS = 10 # Maximum number of redirects to follow
|
|
106
103
|
URL_FILENAME_MAX_LENGTH = 80 # Maximum length for extracting filename from URL
|
|
107
104
|
WEB_SEARCH_DEFAULT_MAX_RESULTS = 10 # Default number of search results
|
|
108
105
|
WEB_SEARCH_MAX_RESULTS_LIMIT = 20 # Maximum number of search results allowed
|
|
109
106
|
WEB_CACHE_TTL_SECONDS = 900 # TTL for web search/fetch cache (15 minutes)
|
|
110
107
|
WEB_CACHE_MAX_ENTRIES = 100 # Maximum entries in web cache
|
|
111
|
-
MERMAID_LIVE_PREFIX = "https://mermaid.live/view#pako:" # Mermaid.live URL prefix
|
|
112
108
|
|
|
113
109
|
|
|
114
110
|
# =============================================================================
|
|
@@ -250,3 +246,7 @@ class ProjectPaths:
|
|
|
250
246
|
|
|
251
247
|
def meta_file(self, session_id: str) -> Path:
|
|
252
248
|
return self.session_dir(session_id) / "meta.json"
|
|
249
|
+
|
|
250
|
+
@property
|
|
251
|
+
def memory_dir(self) -> Path:
|
|
252
|
+
return self.base_dir / "memory"
|