From cf96afad1e15815e5649dc996e95ab73d41c14aa Mon Sep 17 00:00:00 2001 From: thzxx Date: Sat, 11 Jul 2026 16:48:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20plan=5Ftrack=E5=B7=A5=E5=85=B7=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E6=A1=86=EF=BC=8C=E6=94=AF=E6=8C=81=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E6=89=8B=E5=8A=A8=E7=A1=AE=E8=AE=A4=E6=AD=A5=E9=AA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/components/input-area.ts | 12 +++++++++ src/renderer/components/tools-modal.ts | 36 ++++++++++++++++++++++++++ src/renderer/index.html | 9 ++++++- src/renderer/main.ts | 6 +++++ src/renderer/types.d.ts | 3 ++- 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/input-area.ts b/src/renderer/components/input-area.ts index e9ac1d7..9c38998 100644 --- a/src/renderer/components/input-area.ts +++ b/src/renderer/components/input-area.ts @@ -585,6 +585,12 @@ async function handleRetry(): Promise { }, onConfirmTool: async (call) => showToolConfirm(call), onPlanReady: async (plan: string, steps: string[]) => { + // 检查是否启用了自动确认计划 + const autoConfirm = state.get('planAutoConfirm', false); + if (autoConfirm) { + logInfo('Plan Mode: 自动确认计划(用户已启用自动确认)'); + return true; + } try { const { showHtmlConfirm } = await import('./prompt-modal.js'); const html = buildPlanConfirmHtml(plan, steps); @@ -1305,6 +1311,12 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio }, /** Plan Mode — 计划生成后等待用户确认(Markdown 渲染) */ onPlanReady: async (plan: string, steps: string[]) => { + // 检查是否启用了自动确认计划 + const autoConfirm = state.get('planAutoConfirm', false); + if (autoConfirm) { + logInfo('Plan Mode: 自动确认计划(用户已启用自动确认)'); + return true; + } try { const { showHtmlConfirm } = await import('./prompt-modal.js'); const html = buildPlanConfirmHtml(plan, steps); diff --git a/src/renderer/components/tools-modal.ts b/src/renderer/components/tools-modal.ts index fc227ff..b5f4066 100644 --- a/src/renderer/components/tools-modal.ts +++ b/src/renderer/components/tools-modal.ts @@ -32,6 +32,18 @@ function updateToolBadge(toolName: string, mode: ToolMode): void { badge.className = `tool-card-badge ${info.cls}`; } +function updatePlanBadge(autoConfirm: boolean): void { + const badge = modalEl.querySelector('#badge_plan_track') as HTMLElement; + if (!badge) return; + if (autoConfirm) { + badge.textContent = '自动确认'; + badge.className = 'tool-card-badge auto'; + } else { + badge.textContent = '需确认'; + badge.className = 'tool-card-badge confirm'; + } +} + export function initToolsModal(): void { modalEl = document.querySelector('#toolsModal')!; @@ -65,6 +77,22 @@ export function initToolsModal(): void { logInfo(`工具模式切换: ${toolName} → ${mode}`); }); }); + + // Plan 确认模式下拉框 + const planSelect = modalEl.querySelector('#select_plan_confirm'); + if (planSelect) { + planSelect.addEventListener('change', async () => { + const autoConfirm = planSelect.value === 'auto'; + const db = state.get(KEYS.DB); + + state.set('planAutoConfirm', autoConfirm); + if (db) await db.saveSetting('planAutoConfirm', autoConfirm); + updatePlanBadge(autoConfirm); + + showToast(`计划确认:${autoConfirm ? '自动确认' : '需确认'}`, 'info'); + logInfo(`计划确认模式切换: → ${autoConfirm ? 'auto' : 'confirm'}`); + }); + } } export function openToolsModal(): void { @@ -79,6 +107,14 @@ export function openToolsModal(): void { updateToolBadge(toolName, mode); }); + // 同步 Plan 确认模式下拉框 + const planSelect = modalEl.querySelector('#select_plan_confirm'); + if (planSelect) { + const autoConfirm = state.get('planAutoConfirm', false); + planSelect.value = autoConfirm ? 'auto' : 'confirm'; + updatePlanBadge(autoConfirm); + } + modalEl.style.display = ''; } diff --git a/src/renderer/index.html b/src/renderer/index.html index 89f5562..a871db1 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -705,8 +705,15 @@
哈希计算(MD5/SHA1/SHA256/SHA384/SHA512)
-
📋plan_trackPlan
+
📋plan_track需确认
Plan 模式专属:追踪执行进度,标记/查看步骤完成状态
+
+ + +
diff --git a/src/renderer/main.ts b/src/renderer/main.ts index 8f6607c..4c86444 100644 --- a/src/renderer/main.ts +++ b/src/renderer/main.ts @@ -460,6 +460,12 @@ async function init(): Promise { } } + // ── Plan 自动确认设置 ── + { + const planAutoConfirm = await db.getSetting('planAutoConfirm', false); + state.set('planAutoConfirm', planAutoConfirm); + } + // ── MCP 工具注册 ── await startAllMCPServers(); await refreshMCPTools(); diff --git a/src/renderer/types.d.ts b/src/renderer/types.d.ts index ba28a02..ef61139 100644 --- a/src/renderer/types.d.ts +++ b/src/renderer/types.d.ts @@ -289,7 +289,8 @@ export type StateKey = | '_planResumeData' | '_lastPlanStatus' | '_planLastInjectedDone' - | 'toolModes'; + | 'toolModes' + | 'planAutoConfirm'; // ═══════════════════════════════════════════════════════════ // Tool Calling 类型