From 96eb05856e7a099808d0b4650dc7022614171086 Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Thu, 14 Aug 2025 00:21:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20opusplan=20=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/commands/claude.rs | 24 +++++++++++++++++++++--- src/components/ClaudeCodeSession.tsx | 6 +++--- src/components/FloatingPromptInput.tsx | 14 ++++++++++---- src/locales/en/common.json | 2 ++ src/locales/zh/common.json | 2 ++ 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src-tauri/src/commands/claude.rs b/src-tauri/src/commands/claude.rs index a8b426e..b402c5c 100644 --- a/src-tauri/src/commands/claude.rs +++ b/src-tauri/src/commands/claude.rs @@ -926,11 +926,17 @@ pub async fn execute_claude_code( let claude_path = find_claude_binary(&app)?; + // Map opus-plan to the appropriate Claude CLI parameter + let claude_model = match model.as_str() { + "opus-plan" => "opusplan".to_string(), + _ => model.clone() + }; + let args = vec![ "-p".to_string(), prompt.clone(), "--model".to_string(), - model.clone(), + claude_model, "--output-format".to_string(), "stream-json".to_string(), "--verbose".to_string(), @@ -957,12 +963,18 @@ pub async fn continue_claude_code( let claude_path = find_claude_binary(&app)?; + // Map opus-plan to the appropriate Claude CLI parameter + let claude_model = match model.as_str() { + "opus-plan" => "opusplan".to_string(), + _ => model.clone() + }; + let args = vec![ "-c".to_string(), // Continue flag "-p".to_string(), prompt.clone(), "--model".to_string(), - model.clone(), + claude_model, "--output-format".to_string(), "stream-json".to_string(), "--verbose".to_string(), @@ -991,13 +1003,19 @@ pub async fn resume_claude_code( let claude_path = find_claude_binary(&app)?; + // Map opus-plan to the appropriate Claude CLI parameter + let claude_model = match model.as_str() { + "opus-plan" => "opusplan".to_string(), + _ => model.clone() + }; + let args = vec![ "--resume".to_string(), session_id.clone(), "-p".to_string(), prompt.clone(), "--model".to_string(), - model.clone(), + claude_model, "--output-format".to_string(), "stream-json".to_string(), "--verbose".to_string(), diff --git a/src/components/ClaudeCodeSession.tsx b/src/components/ClaudeCodeSession.tsx index d131752..6ee93d8 100644 --- a/src/components/ClaudeCodeSession.tsx +++ b/src/components/ClaudeCodeSession.tsx @@ -141,7 +141,7 @@ export const ClaudeCodeSession: React.FC = ({ const [forkSessionName, setForkSessionName] = useState(""); // Queued prompts state - const [queuedPrompts, setQueuedPrompts] = useState>([]); + const [queuedPrompts, setQueuedPrompts] = useState>([]); // 使用布局管理器的预览功能 // Note: openLayoutPreview is used directly instead of wrapping in handleOpenPreview @@ -175,7 +175,7 @@ export const ClaudeCodeSession: React.FC = ({ const unlistenRefs = useRef([]); const hasActiveSessionRef = useRef(false); const floatingPromptRef = useRef(null); - const queuedPromptsRef = useRef>([]); + const queuedPromptsRef = useRef>([]); const isMountedRef = useRef(true); const isListeningRef = useRef(false); const sessionStartTime = useRef(Date.now()); @@ -642,7 +642,7 @@ export const ClaudeCodeSession: React.FC = ({ } }; - const handleSendPrompt = async (prompt: string, model: "sonnet" | "opus") => { + const handleSendPrompt = async (prompt: string, model: "sonnet" | "opus" | "opus-plan") => { console.log('[ClaudeCodeSession] handleSendPrompt called with:', { prompt, model, projectPath, claudeSessionId, effectiveSession }); if (!projectPath) { diff --git a/src/components/FloatingPromptInput.tsx b/src/components/FloatingPromptInput.tsx index b565203..814a095 100644 --- a/src/components/FloatingPromptInput.tsx +++ b/src/components/FloatingPromptInput.tsx @@ -26,7 +26,7 @@ interface FloatingPromptInputProps { /** * Callback when prompt is sent */ - onSend: (prompt: string, model: "sonnet" | "opus") => void; + onSend: (prompt: string, model: "sonnet" | "opus" | "opus-plan") => void; /** * Whether the input is loading */ @@ -38,7 +38,7 @@ interface FloatingPromptInputProps { /** * Default model to select */ - defaultModel?: "sonnet" | "opus"; + defaultModel?: "sonnet" | "opus" | "opus-plan"; /** * Project path for file picker */ @@ -95,7 +95,7 @@ const ThinkingModeIndicator: React.FC<{ level: number }> = ({ level }) => { }; type Model = { - id: "sonnet" | "opus"; + id: "sonnet" | "opus" | "opus-plan"; name: string; description: string; icon: React.ReactNode; @@ -139,6 +139,12 @@ const FloatingPromptInputInner = ( name: t('agents.opusName'), description: t('agents.opusDescription'), icon: + }, + { + id: "opus-plan", + name: t('agents.opusPlanName'), + description: t('agents.opusPlanDescription'), + icon: } ]; @@ -180,7 +186,7 @@ const FloatingPromptInputInner = ( } ]; const [prompt, setPrompt] = useState(""); - const [selectedModel, setSelectedModel] = useState<"sonnet" | "opus">(defaultModel); + const [selectedModel, setSelectedModel] = useState<"sonnet" | "opus" | "opus-plan">(defaultModel); const [selectedThinkingMode, setSelectedThinkingMode] = useState("auto"); const [isExpanded, setIsExpanded] = useState(false); const [modelPickerOpen, setModelPickerOpen] = useState(false); diff --git a/src/locales/en/common.json b/src/locales/en/common.json index 1c4d573..690cb0b 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -198,6 +198,8 @@ "sonnetDescription": "Faster, efficient for most tasks", "opusName": "Claude 4.1 Opus", "opusDescription": "More capable, better for complex tasks", + "opusPlanName": "Opus Plan Mode", + "opusPlanDescription": "Use Opus 4.1 for planning, Sonnet 4 otherwise", "defaultTaskDescription": "This will be used as the default task placeholder when executing the agent", "systemPromptDescription": "Define the behavior and capabilities of your CC Agent", "manageAgents": "Manage your Claude Code agents", diff --git a/src/locales/zh/common.json b/src/locales/zh/common.json index 55a1be4..cbffe5a 100644 --- a/src/locales/zh/common.json +++ b/src/locales/zh/common.json @@ -187,6 +187,8 @@ "sonnetDescription": "更快,适用于大多数任务", "opusName": "Claude 4.1 Opus", "opusDescription": "功能更强,适用于复杂任务", + "opusPlanName": "Opus 计划模式", + "opusPlanDescription": "计划时使用 Opus 4.1,执行时使用 Sonnet 4", "defaultTaskDescription": "执行智能体时将用作默认任务占位符", "systemPromptDescription": "定义您的 CC 智能体的行为和功能", "manageAgents": "管理您的 Claude Code 智能体",