klaude-code 2.10.1__tar.gz → 2.10.2__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.10.1 → klaude_code-2.10.2}/PKG-INFO +1 -1
- {klaude_code-2.10.1 → klaude_code-2.10.2}/pyproject.toml +1 -1
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/agent_profile.py +0 -6
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_codex/client.py +0 -22
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openrouter/client.py +4 -1
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openrouter/input.py +6 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/key_bindings.py +96 -2
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/machine.py +1 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/renderer.py +3 -0
- klaude_code-2.10.1/src/klaude_code/llm/openai_codex/prompt_sync.py +0 -237
- {klaude_code-2.10.1 → klaude_code-2.10.2}/README.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/.DS_Store +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/app/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/app/runtime.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/AGENTS.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/antigravity/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/antigravity/exceptions.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/antigravity/oauth.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/antigravity/pkce.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/antigravity/token_manager.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/base.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/claude/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/claude/exceptions.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/claude/oauth.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/claude/token_manager.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/codex/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/codex/exceptions.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/codex/oauth.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/codex/token_manager.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/auth/env.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/auth_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/config_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/cost_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/debug.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/list_model.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/main.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/cli/self_update.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/assets/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/builtin_config.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/config.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/model_matcher.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/sub_agent_model_helper.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/config/thinking.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/const.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/agent.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/bash_mode.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/compaction/AGENTS.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/compaction/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/compaction/compaction.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/compaction/overflow.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/compaction/prompts.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/executor.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/loaded_skills.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/manager/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/manager/llm_clients.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/memory.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-antigravity.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent-image-gen.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/reminders.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/task.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/context.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/_utils.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/read_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/read_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/write_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/file/write_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/offload.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/report_back_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/shell/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/sub_agent/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/sub_agent/image_gen.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/sub_agent/image_gen.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/sub_agent/task.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/sub_agent/task.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/todo/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/tool_abc.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/tool_registry.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/tool_runner.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/turn.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/anthropic/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/anthropic/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/anthropic/input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/antigravity/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/antigravity/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/antigravity/input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/bedrock_anthropic/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/bedrock_anthropic/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/claude/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/claude/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/google/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/google/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/google/input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/image.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/input_common.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/json_stable.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_codex/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_compatible/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_compatible/input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_responses/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_responses/client.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openai_responses/input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openrouter/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/partial_message.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/registry.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/stream_parts.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/llm/usage.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/log.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/commands.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/events.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/llm_param.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/message.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/model.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/op.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/op_handler.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/sub_agent/AGENTS.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/sub_agent/image_gen.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/sub_agent/task.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/sub_agent/web.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/protocol/tools.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/codec.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/export.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/selector.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/session.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/store.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/templates/export_session.html +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/.DS_Store +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/assets/.DS_Store +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/assets/create-plan/SKILL.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/loader.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/manager.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/skill/system_skills.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/clear_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/command_abc.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/compact_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/continue_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/copy_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/debug_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/export_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/export_online_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/fork_session_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/model_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/model_picker.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/prompt-init.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/prompt_command.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/refresh_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/registry.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/resume_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/status_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/sub_agent_model_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/command/thinking_cmd.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/commands.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/bash_syntax.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/command_output.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/common.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/developer.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/diffs.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/errors.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/mermaid_viewer.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/metadata.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/cjk_wrap.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/code_panel.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/live.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/markdown.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/quote.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/status.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/rich/theme.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/sub_agent.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/thinking.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/tools.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/user_input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/components/welcome.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/display.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/AGENTS.md +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/completers.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/drag_drop.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/images.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/paste.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/input/prompt_toolkit.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/runner.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/color.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/control.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/image.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/notifier.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/progress_bar.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/tui/terminal/selector.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/common.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/core/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/core/display.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/core/input.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/debug_mode.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/terminal/__init__.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/ui/terminal/title.py +0 -0
- {klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/update.py +0 -0
|
@@ -130,12 +130,6 @@ def load_system_prompt(
|
|
|
130
130
|
) -> str:
|
|
131
131
|
"""Get system prompt content for the given model and sub-agent type."""
|
|
132
132
|
|
|
133
|
-
# For codex_oauth protocol, use dynamic prompts from GitHub (no additions).
|
|
134
|
-
if protocol == llm_param.LLMClientProtocol.CODEX_OAUTH:
|
|
135
|
-
from klaude_code.llm.openai_codex.prompt_sync import get_codex_instructions
|
|
136
|
-
|
|
137
|
-
return get_codex_instructions(model_name)
|
|
138
|
-
|
|
139
133
|
# For antigravity protocol, use exact prompt without any additions.
|
|
140
134
|
if protocol == llm_param.LLMClientProtocol.ANTIGRAVITY:
|
|
141
135
|
return _load_prompt_by_path(ANTIGRAVITY_PROMPT_PATH)
|
|
@@ -146,28 +146,6 @@ class CodexClient(LLMClientABC):
|
|
|
146
146
|
)
|
|
147
147
|
except (openai.OpenAIError, httpx.HTTPError) as e:
|
|
148
148
|
error_message = f"{e.__class__.__name__} {e!s}"
|
|
149
|
-
|
|
150
|
-
# Check for invalid instruction error and invalidate prompt cache
|
|
151
|
-
if _is_invalid_instruction_error(e) and param.model_id:
|
|
152
|
-
_invalidate_prompt_cache_for_model(param.model_id)
|
|
153
|
-
|
|
154
149
|
return error_llm_stream(metadata_tracker, error=error_message)
|
|
155
150
|
|
|
156
151
|
return ResponsesLLMStream(stream, param=param, metadata_tracker=metadata_tracker)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def _is_invalid_instruction_error(e: Exception) -> bool:
|
|
160
|
-
"""Check if the error is related to invalid instructions."""
|
|
161
|
-
error_str = str(e).lower()
|
|
162
|
-
return "invalid instruction" in error_str or "invalid_instruction" in error_str
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def _invalidate_prompt_cache_for_model(model_id: str) -> None:
|
|
166
|
-
"""Invalidate the cached prompt for a model to force refresh."""
|
|
167
|
-
from klaude_code.llm.openai_codex.prompt_sync import invalidate_cache
|
|
168
|
-
|
|
169
|
-
log_debug(
|
|
170
|
-
f"Invalidating prompt cache for model {model_id} due to invalid instruction error",
|
|
171
|
-
debug_type=DebugType.GENERAL,
|
|
172
|
-
)
|
|
173
|
-
invalidate_cache(model_id)
|
|
@@ -17,7 +17,7 @@ from klaude_code.llm.client import LLMClientABC, LLMStreamABC
|
|
|
17
17
|
from klaude_code.llm.input_common import apply_config_defaults
|
|
18
18
|
from klaude_code.llm.openai_compatible.input import convert_tool_schema
|
|
19
19
|
from klaude_code.llm.openai_compatible.stream import OpenAILLMStream
|
|
20
|
-
from klaude_code.llm.openrouter.input import convert_history_to_input, is_claude_model
|
|
20
|
+
from klaude_code.llm.openrouter.input import convert_history_to_input, is_claude_model, is_xai_model
|
|
21
21
|
from klaude_code.llm.openrouter.reasoning import ReasoningStreamHandler
|
|
22
22
|
from klaude_code.llm.registry import register
|
|
23
23
|
from klaude_code.llm.usage import MetadataTracker, error_llm_stream
|
|
@@ -70,6 +70,9 @@ def build_payload(
|
|
|
70
70
|
f"{ANTHROPIC_BETA_FINE_GRAINED_TOOL_STREAMING},{ANTHROPIC_BETA_INTERLEAVED_THINKING}"
|
|
71
71
|
)
|
|
72
72
|
|
|
73
|
+
if is_xai_model(param.model_id):
|
|
74
|
+
extra_body["plugins"] = [{"id": "web", "engine": "native"}]
|
|
75
|
+
|
|
73
76
|
payload: CompletionCreateParamsStreaming = {
|
|
74
77
|
"model": str(param.model_id),
|
|
75
78
|
"tool_choice": "auto",
|
|
@@ -34,6 +34,12 @@ def is_gemini_model(model_name: str | None) -> bool:
|
|
|
34
34
|
return model_name is not None and model_name.startswith("google/gemini")
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
def is_xai_model(model_name: str | None) -> bool:
|
|
38
|
+
"""Return True if the model name represents an xAI model."""
|
|
39
|
+
|
|
40
|
+
return model_name is not None and model_name.startswith("x-ai/")
|
|
41
|
+
|
|
42
|
+
|
|
37
43
|
def _assistant_message_to_openrouter(
|
|
38
44
|
msg: message.AssistantMessage, model_name: str | None
|
|
39
45
|
) -> chat.ChatCompletionMessageParam:
|
|
@@ -76,6 +76,60 @@ def create_key_bindings(
|
|
|
76
76
|
term_program = os.environ.get("TERM_PROGRAM", "").lower()
|
|
77
77
|
swallow_next_control_j = False
|
|
78
78
|
|
|
79
|
+
def _history_backward_cursor_to_start(buf: Buffer) -> None:
|
|
80
|
+
"""Switch to previous history entry and place cursor at absolute start.
|
|
81
|
+
|
|
82
|
+
prompt_toolkit's default `Buffer.history_backward()` moves the cursor to
|
|
83
|
+
the end of the (possibly multi-line) history entry. That makes it hard
|
|
84
|
+
to keep pressing Up to continue cycling history, because subsequent Up
|
|
85
|
+
key presses start moving within the multi-line buffer.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
before = int(buf.working_index) # type: ignore[reportUnknownMemberType]
|
|
90
|
+
except Exception:
|
|
91
|
+
before = None
|
|
92
|
+
|
|
93
|
+
buf.history_backward()
|
|
94
|
+
|
|
95
|
+
try:
|
|
96
|
+
after = int(buf.working_index) # type: ignore[reportUnknownMemberType]
|
|
97
|
+
except Exception:
|
|
98
|
+
after = None
|
|
99
|
+
|
|
100
|
+
if before is not None and after is not None and before == after:
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
with contextlib.suppress(Exception):
|
|
104
|
+
buf.cursor_position = 0 # type: ignore[reportUnknownMemberType]
|
|
105
|
+
|
|
106
|
+
def _history_forward_cursor_to_end(buf: Buffer) -> None:
|
|
107
|
+
"""Switch to next history entry and place cursor at absolute end.
|
|
108
|
+
|
|
109
|
+
prompt_toolkit's default `Buffer.history_forward()` moves the cursor to
|
|
110
|
+
the end of the *first* line. For our multiline REPL, it's more useful to
|
|
111
|
+
land at the end so that pressing Down keeps cycling through history.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
before = int(buf.working_index) # type: ignore[reportUnknownMemberType]
|
|
116
|
+
except Exception:
|
|
117
|
+
before = None
|
|
118
|
+
|
|
119
|
+
buf.history_forward()
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
after = int(buf.working_index) # type: ignore[reportUnknownMemberType]
|
|
123
|
+
except Exception:
|
|
124
|
+
after = None
|
|
125
|
+
|
|
126
|
+
if before is not None and after is not None and before == after:
|
|
127
|
+
return
|
|
128
|
+
|
|
129
|
+
with contextlib.suppress(Exception):
|
|
130
|
+
text = buf.text # type: ignore[reportUnknownMemberType]
|
|
131
|
+
buf.cursor_position = len(text) # type: ignore[reportUnknownMemberType]
|
|
132
|
+
|
|
79
133
|
def _is_bash_mode_text(text: str) -> bool:
|
|
80
134
|
return text.startswith(("!", "!"))
|
|
81
135
|
|
|
@@ -151,6 +205,20 @@ def create_key_bindings(
|
|
|
151
205
|
except Exception:
|
|
152
206
|
return False
|
|
153
207
|
|
|
208
|
+
def _current_cursor_row() -> int:
|
|
209
|
+
try:
|
|
210
|
+
doc = get_app().current_buffer.document
|
|
211
|
+
return int(doc.cursor_position_row)
|
|
212
|
+
except Exception:
|
|
213
|
+
return 0
|
|
214
|
+
|
|
215
|
+
def _current_line_count() -> int:
|
|
216
|
+
try:
|
|
217
|
+
doc = get_app().current_buffer.document
|
|
218
|
+
return int(doc.line_count)
|
|
219
|
+
except Exception:
|
|
220
|
+
return 1
|
|
221
|
+
|
|
154
222
|
def _move_cursor_visually_within_wrapped_line(event: KeyPressEvent, *, delta_visible_y: int) -> None:
|
|
155
223
|
"""Move the cursor Up/Down by one wrapped screen row, keeping column."""
|
|
156
224
|
|
|
@@ -493,6 +561,32 @@ def create_key_bindings(
|
|
|
493
561
|
def _(event: KeyPressEvent) -> None:
|
|
494
562
|
_move_cursor_visually_within_wrapped_line(event, delta_visible_y=1)
|
|
495
563
|
|
|
564
|
+
@kb.add(
|
|
565
|
+
"up",
|
|
566
|
+
filter=enabled
|
|
567
|
+
& ~has_completions
|
|
568
|
+
& ~is_searching
|
|
569
|
+
& Condition(lambda: not _can_move_cursor_visually_within_wrapped_line(delta_visible_y=-1))
|
|
570
|
+
& Condition(lambda: _current_cursor_row() == 0),
|
|
571
|
+
eager=True,
|
|
572
|
+
)
|
|
573
|
+
def _(event: KeyPressEvent) -> None:
|
|
574
|
+
"""Up on first logical line: switch history and keep caret at start."""
|
|
575
|
+
_history_backward_cursor_to_start(event.current_buffer)
|
|
576
|
+
|
|
577
|
+
@kb.add(
|
|
578
|
+
"down",
|
|
579
|
+
filter=enabled
|
|
580
|
+
& ~has_completions
|
|
581
|
+
& ~is_searching
|
|
582
|
+
& Condition(lambda: not _can_move_cursor_visually_within_wrapped_line(delta_visible_y=1))
|
|
583
|
+
& Condition(lambda: _current_cursor_row() >= (_current_line_count() - 1)),
|
|
584
|
+
eager=True,
|
|
585
|
+
)
|
|
586
|
+
def _(event: KeyPressEvent) -> None:
|
|
587
|
+
"""Down on last logical line: switch history and keep caret at end."""
|
|
588
|
+
_history_forward_cursor_to_end(event.current_buffer)
|
|
589
|
+
|
|
496
590
|
@kb.add("c-j", filter=enabled)
|
|
497
591
|
def _(event: KeyPressEvent) -> None:
|
|
498
592
|
nonlocal swallow_next_control_j
|
|
@@ -617,11 +711,11 @@ def create_key_bindings(
|
|
|
617
711
|
@kb.add("escape", "up", filter=enabled & ~has_completions)
|
|
618
712
|
def _(event: KeyPressEvent) -> None:
|
|
619
713
|
"""Option+Up switches to previous history entry."""
|
|
620
|
-
event.current_buffer
|
|
714
|
+
_history_backward_cursor_to_start(event.current_buffer)
|
|
621
715
|
|
|
622
716
|
@kb.add("escape", "down", filter=enabled & ~has_completions)
|
|
623
717
|
def _(event: KeyPressEvent) -> None:
|
|
624
718
|
"""Option+Down switches to next history entry."""
|
|
625
|
-
event.current_buffer
|
|
719
|
+
_history_forward_cursor_to_end(event.current_buffer)
|
|
626
720
|
|
|
627
721
|
return kb
|
|
@@ -736,6 +736,7 @@ class DisplayStateMachine:
|
|
|
736
736
|
and not e.has_structured_output
|
|
737
737
|
and s.assistant_char_count == 0
|
|
738
738
|
and e.task_result.strip()
|
|
739
|
+
and e.task_result.strip().lower() not in {"task cancelled", "task canceled"}
|
|
739
740
|
):
|
|
740
741
|
cmds.append(StartAssistantStream(session_id=e.session_id))
|
|
741
742
|
cmds.append(AppendAssistant(session_id=e.session_id, content=e.task_result))
|
|
@@ -734,6 +734,9 @@ class TUICommandRenderer:
|
|
|
734
734
|
self._sub_agent_thinking_buffers[session_id] = ""
|
|
735
735
|
elif not self._thinking_stream.is_active:
|
|
736
736
|
self._thinking_stream.start(self._new_thinking_mdstream())
|
|
737
|
+
if not self._replay_mode:
|
|
738
|
+
self._thinking_stream.append("Thinking… \n")
|
|
739
|
+
self._thinking_stream.render(transform=c_thinking.normalize_thinking_content)
|
|
737
740
|
case AppendThinking(session_id=session_id, content=content):
|
|
738
741
|
if self.is_sub_agent_session(session_id):
|
|
739
742
|
if session_id in self._sub_agent_thinking_buffers:
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
"""Dynamic prompt synchronization from OpenAI Codex GitHub repository."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import time
|
|
5
|
-
from functools import cache
|
|
6
|
-
from importlib.resources import files
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
from typing import Any, Literal
|
|
9
|
-
|
|
10
|
-
import httpx
|
|
11
|
-
|
|
12
|
-
from klaude_code.log import DebugType, log_debug
|
|
13
|
-
|
|
14
|
-
GITHUB_API_RELEASES = "https://api.github.com/repos/openai/codex/releases/latest"
|
|
15
|
-
GITHUB_HTML_RELEASES = "https://github.com/openai/codex/releases/latest"
|
|
16
|
-
GITHUB_RAW_BASE = "https://raw.githubusercontent.com/openai/codex"
|
|
17
|
-
|
|
18
|
-
CACHE_DIR = Path.home() / ".klaude" / "codex-prompts"
|
|
19
|
-
CACHE_TTL_SECONDS = 24 * 60 * 60 # 24 hours
|
|
20
|
-
|
|
21
|
-
type ModelFamily = Literal["gpt-5.2-codex", "codex-max", "codex", "gpt-5.2", "gpt-5.1"]
|
|
22
|
-
|
|
23
|
-
PROMPT_FILES: dict[ModelFamily, str] = {
|
|
24
|
-
"gpt-5.2-codex": "gpt-5.2-codex_prompt.md",
|
|
25
|
-
"codex-max": "gpt-5.1-codex-max_prompt.md",
|
|
26
|
-
"codex": "gpt_5_codex_prompt.md",
|
|
27
|
-
"gpt-5.2": "gpt_5_2_prompt.md",
|
|
28
|
-
"gpt-5.1": "gpt_5_1_prompt.md",
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
CACHE_FILES: dict[ModelFamily, str] = {
|
|
32
|
-
"gpt-5.2-codex": "gpt-5.2-codex-instructions.md",
|
|
33
|
-
"codex-max": "codex-max-instructions.md",
|
|
34
|
-
"codex": "codex-instructions.md",
|
|
35
|
-
"gpt-5.2": "gpt-5.2-instructions.md",
|
|
36
|
-
"gpt-5.1": "gpt-5.1-instructions.md",
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@cache
|
|
41
|
-
def _load_bundled_prompt(prompt_path: str) -> str:
|
|
42
|
-
"""Load bundled prompt from package resources."""
|
|
43
|
-
return files("klaude_code.core").joinpath(prompt_path).read_text(encoding="utf-8").strip()
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class CacheMetadata:
|
|
47
|
-
def __init__(self, etag: str | None, tag: str, last_checked: int, url: str):
|
|
48
|
-
self.etag = etag
|
|
49
|
-
self.tag = tag
|
|
50
|
-
self.last_checked = last_checked
|
|
51
|
-
self.url = url
|
|
52
|
-
|
|
53
|
-
def to_dict(self) -> dict[str, str | int | None]:
|
|
54
|
-
return {
|
|
55
|
-
"etag": self.etag,
|
|
56
|
-
"tag": self.tag,
|
|
57
|
-
"last_checked": self.last_checked,
|
|
58
|
-
"url": self.url,
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
@classmethod
|
|
62
|
-
def from_dict(cls, data: dict[str, object]) -> "CacheMetadata":
|
|
63
|
-
etag = data.get("etag")
|
|
64
|
-
last_checked = data.get("last_checked")
|
|
65
|
-
return cls(
|
|
66
|
-
etag=etag if isinstance(etag, str) else None,
|
|
67
|
-
tag=str(data.get("tag", "")),
|
|
68
|
-
last_checked=int(last_checked) if isinstance(last_checked, int | float) else 0,
|
|
69
|
-
url=str(data.get("url", "")),
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def get_model_family(model: str) -> ModelFamily:
|
|
74
|
-
"""Determine model family from model name."""
|
|
75
|
-
if "gpt-5.2-codex" in model or "gpt 5.2 codex" in model:
|
|
76
|
-
return "gpt-5.2-codex"
|
|
77
|
-
if "codex-max" in model:
|
|
78
|
-
return "codex-max"
|
|
79
|
-
if "codex" in model or model.startswith("codex-"):
|
|
80
|
-
return "codex"
|
|
81
|
-
if "gpt-5.2" in model:
|
|
82
|
-
return "gpt-5.2"
|
|
83
|
-
return "gpt-5.1"
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _get_latest_release_tag(client: httpx.Client) -> str:
|
|
87
|
-
"""Get latest release tag from GitHub."""
|
|
88
|
-
try:
|
|
89
|
-
response = client.get(GITHUB_API_RELEASES)
|
|
90
|
-
if response.status_code == 200:
|
|
91
|
-
data: dict[str, Any] = response.json()
|
|
92
|
-
tag_name: Any = data.get("tag_name")
|
|
93
|
-
if isinstance(tag_name, str):
|
|
94
|
-
return tag_name
|
|
95
|
-
except httpx.HTTPError:
|
|
96
|
-
pass
|
|
97
|
-
|
|
98
|
-
# Fallback: follow redirect from releases/latest
|
|
99
|
-
response = client.get(GITHUB_HTML_RELEASES, follow_redirects=True)
|
|
100
|
-
if response.status_code == 200:
|
|
101
|
-
final_url = str(response.url)
|
|
102
|
-
if "/tag/" in final_url:
|
|
103
|
-
parts = final_url.split("/tag/")
|
|
104
|
-
if len(parts) > 1 and "/" not in parts[-1]:
|
|
105
|
-
return parts[-1]
|
|
106
|
-
|
|
107
|
-
raise RuntimeError("Failed to determine latest release tag from GitHub")
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def _load_cache_metadata(meta_file: Path) -> CacheMetadata | None:
|
|
111
|
-
if not meta_file.exists():
|
|
112
|
-
return None
|
|
113
|
-
try:
|
|
114
|
-
data = json.loads(meta_file.read_text())
|
|
115
|
-
return CacheMetadata.from_dict(data)
|
|
116
|
-
except (json.JSONDecodeError, ValueError):
|
|
117
|
-
return None
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def _save_cache_metadata(meta_file: Path, metadata: CacheMetadata) -> None:
|
|
121
|
-
meta_file.parent.mkdir(parents=True, exist_ok=True)
|
|
122
|
-
meta_file.write_text(json.dumps(metadata.to_dict(), indent=2))
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def get_codex_instructions(model: str = "gpt-5.1-codex", force_refresh: bool = False) -> str:
|
|
126
|
-
"""Get Codex instructions for the given model.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
model: Model name to get instructions for.
|
|
130
|
-
force_refresh: If True, bypass cache TTL and fetch fresh instructions.
|
|
131
|
-
|
|
132
|
-
Returns:
|
|
133
|
-
The Codex system prompt instructions.
|
|
134
|
-
"""
|
|
135
|
-
model_family = get_model_family(model)
|
|
136
|
-
prompt_file = PROMPT_FILES[model_family]
|
|
137
|
-
cache_file = CACHE_DIR / CACHE_FILES[model_family]
|
|
138
|
-
meta_file = CACHE_DIR / f"{CACHE_FILES[model_family].replace('.md', '-meta.json')}"
|
|
139
|
-
|
|
140
|
-
# Check cache unless force refresh
|
|
141
|
-
if not force_refresh:
|
|
142
|
-
metadata = _load_cache_metadata(meta_file)
|
|
143
|
-
if metadata and cache_file.exists():
|
|
144
|
-
age = int(time.time()) - metadata.last_checked
|
|
145
|
-
if age < CACHE_TTL_SECONDS:
|
|
146
|
-
log_debug(f"Using cached {model_family} instructions (age: {age}s)", debug_type=DebugType.GENERAL)
|
|
147
|
-
return cache_file.read_text()
|
|
148
|
-
|
|
149
|
-
try:
|
|
150
|
-
with httpx.Client(timeout=30.0) as client:
|
|
151
|
-
latest_tag = _get_latest_release_tag(client)
|
|
152
|
-
instructions_url = f"{GITHUB_RAW_BASE}/{latest_tag}/codex-rs/core/{prompt_file}"
|
|
153
|
-
|
|
154
|
-
# Load existing metadata for conditional request
|
|
155
|
-
metadata = _load_cache_metadata(meta_file)
|
|
156
|
-
headers: dict[str, str] = {}
|
|
157
|
-
|
|
158
|
-
# Only use ETag if tag matches (different release = different content)
|
|
159
|
-
if metadata and metadata.tag == latest_tag and metadata.etag:
|
|
160
|
-
headers["If-None-Match"] = metadata.etag
|
|
161
|
-
|
|
162
|
-
response = client.get(instructions_url, headers=headers)
|
|
163
|
-
|
|
164
|
-
if response.status_code == 304 and cache_file.exists():
|
|
165
|
-
# Not modified, update last_checked and return cached
|
|
166
|
-
if metadata:
|
|
167
|
-
metadata.last_checked = int(time.time())
|
|
168
|
-
_save_cache_metadata(meta_file, metadata)
|
|
169
|
-
log_debug(f"Codex {model_family} instructions not modified", debug_type=DebugType.GENERAL)
|
|
170
|
-
return cache_file.read_text()
|
|
171
|
-
|
|
172
|
-
if response.status_code == 200:
|
|
173
|
-
instructions = response.text
|
|
174
|
-
new_etag = response.headers.get("etag")
|
|
175
|
-
|
|
176
|
-
# Save to cache
|
|
177
|
-
cache_file.parent.mkdir(parents=True, exist_ok=True)
|
|
178
|
-
cache_file.write_text(instructions)
|
|
179
|
-
_save_cache_metadata(
|
|
180
|
-
meta_file,
|
|
181
|
-
CacheMetadata(
|
|
182
|
-
etag=new_etag,
|
|
183
|
-
tag=latest_tag,
|
|
184
|
-
last_checked=int(time.time()),
|
|
185
|
-
url=instructions_url,
|
|
186
|
-
),
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
log_debug(f"Updated {model_family} instructions from GitHub", debug_type=DebugType.GENERAL)
|
|
190
|
-
return instructions
|
|
191
|
-
|
|
192
|
-
raise RuntimeError(f"HTTP {response.status_code}")
|
|
193
|
-
|
|
194
|
-
except Exception as e:
|
|
195
|
-
log_debug(f"Failed to fetch {model_family} instructions: {e}", debug_type=DebugType.GENERAL)
|
|
196
|
-
|
|
197
|
-
# Fallback to cached version
|
|
198
|
-
if cache_file.exists():
|
|
199
|
-
log_debug(f"Using cached {model_family} instructions (fallback)", debug_type=DebugType.GENERAL)
|
|
200
|
-
return cache_file.read_text()
|
|
201
|
-
|
|
202
|
-
# Last resort: use bundled prompt
|
|
203
|
-
bundled_path = _get_bundled_prompt_path(model_family)
|
|
204
|
-
if bundled_path:
|
|
205
|
-
log_debug(f"Using bundled {model_family} instructions (fallback)", debug_type=DebugType.GENERAL)
|
|
206
|
-
return _load_bundled_prompt(bundled_path)
|
|
207
|
-
|
|
208
|
-
raise RuntimeError(f"No Codex instructions available for {model_family}") from e
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def _get_bundled_prompt_path(model_family: ModelFamily) -> str | None:
|
|
212
|
-
"""Get bundled prompt path for model family."""
|
|
213
|
-
if model_family == "gpt-5.2-codex":
|
|
214
|
-
return "prompts/prompt-codex-gpt-5-2-codex.md"
|
|
215
|
-
if model_family == "gpt-5.2":
|
|
216
|
-
return "prompts/prompt-codex-gpt-5-2.md"
|
|
217
|
-
if model_family in ("codex", "codex-max", "gpt-5.1"):
|
|
218
|
-
return "prompts/prompt-codex.md"
|
|
219
|
-
return None
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
def invalidate_cache(model: str | None = None) -> None:
|
|
223
|
-
"""Invalidate cached instructions to force refresh on next access.
|
|
224
|
-
|
|
225
|
-
Args:
|
|
226
|
-
model: If provided, only invalidate cache for this model's family.
|
|
227
|
-
If None, invalidate all cached instructions.
|
|
228
|
-
"""
|
|
229
|
-
if model:
|
|
230
|
-
model_family = get_model_family(model)
|
|
231
|
-
meta_file = CACHE_DIR / f"{CACHE_FILES[model_family].replace('.md', '-meta.json')}"
|
|
232
|
-
if meta_file.exists():
|
|
233
|
-
meta_file.unlink()
|
|
234
|
-
else:
|
|
235
|
-
if CACHE_DIR.exists():
|
|
236
|
-
for meta_file in CACHE_DIR.glob("*-meta.json"):
|
|
237
|
-
meta_file.unlink()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/manager/llm_clients_builder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-antigravity.md
RENAMED
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-claude-code.md
RENAMED
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md
RENAMED
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md
RENAMED
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent-image-gen.md
RENAMED
|
File without changes
|
{klaude_code-2.10.1 → klaude_code-2.10.2}/src/klaude_code/core/prompts/prompt-sub-agent-web.md
RENAMED
|
File without changes
|