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 类型