v0.16.11: Plan Mode 最小必要性清理 — 删除进度注入和死代码链

删除项:
- Plan Mode 每轮进度注入代码(formatPlanStatus() 主动注入到 user 消息)
  AI 改为从 plan_track mark_done/status 工具返回值自行推断进度
- _lastPlanStatus 死代码链(agent-engine.ts 2 处保存 + input-area.ts 2 处清空)
  保存后从未被读取使用,纯死代码
- formatPlanStatus import(已无调用点)
- _lastPlanStatus 和 _planLastInjectedDone StateKey 声明

简化项:
- "计划已批准"消息移除 (web_search、write_file 等) 工具名列举,让 AI 自行判断

修正项:
- L2431 注释从"AI 可通过 formatPlanStatus() 看到剩余步骤"
  改为"AI 通过 plan_track mark_done/status 的工具返回值获知进度"

总计 8 文件变更
This commit is contained in:
紫影233
2026-07-16 16:56:32 +08:00
parent 80581deb37
commit 45b50e4dc7
8 changed files with 12 additions and 40 deletions
+3 -3
View File
@@ -14,7 +14,7 @@
</p>
<p align="center">
<img src="https://img.shields.io/badge/version-v0.16.10-E8734A?style=flat-square" alt="version">
<img src="https://img.shields.io/badge/version-v0.16.11-E8734A?style=flat-square" alt="version">
<img src="https://img.shields.io/badge/electron-33+-47848F?style=flat-square&logo=electron" alt="electron">
<img src="https://img.shields.io/badge/typescript-5.7+-3178C6?style=flat-square&logo=typescript" alt="typescript">
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license">
@@ -253,7 +253,7 @@ npm start
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
产出:`release/Metona Ollama Setup v0.16.10.exe`
产出:`release/Metona Ollama Setup v0.16.11.exe`
## 🛠️ 常用命令
@@ -501,7 +501,7 @@ npm start
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
Output: `release/Metona Ollama Setup v0.16.10.exe`
Output: `release/Metona Ollama Setup v0.16.11.exe`
## 🛠️ Common Commands
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "metona-ollama-desktop",
"version": "0.16.10",
"version": "0.16.11",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "metona-ollama-desktop",
"version": "0.16.10",
"version": "0.16.11",
"license": "MIT",
"dependencies": {
"ffmpeg-static": "^5.2.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "metona-ollama-desktop",
"version": "0.16.10",
"version": "0.16.11",
"description": "Metona Ollama - TypeScript + Electron 桌面 AI 聊天客户端",
"main": "dist/main/main.js",
"author": "thzxx",
+1 -1
View File
@@ -101,7 +101,7 @@ export function createMenu(): void {
dialog.showMessageBox(mainWindow!, {
type: 'info',
title: '关于 Metona Ollama',
message: 'Metona Ollama Desktop v0.16.10',
message: 'Metona Ollama Desktop v0.16.11',
detail: 'TypeScript + Electron Ollama AI 聊天客户端\n\nhttps://gitee.com/thzxx/metona-ollama',
icon: getIconPath()
});
-5
View File
@@ -669,8 +669,6 @@ async function handleRetry(): Promise<void> {
// renderMessages 统一渲染 session 数据,先清掉流式 placeholder 避免 DOM 重复
clearMessagesDOM();
renderMessages();
// ── 消费 _lastPlanStatus(不再保存为 session 消息,避免 system 消息渲染到聊天界面)──
state.set('_lastPlanStatus', '');
await saveCurrentSession();
}
});
@@ -1372,9 +1370,6 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio
// 先移除流式 placeholder 再 renderMessages,避免未渲染(纯文本)和已渲染(markdown)两个卡片同时存在
removeCurrentPlaceholder();
renderMessages();
// ── 消费 _lastPlanStatus(不再保存为 session 消息,避免 system 消息渲染到聊天界面)──
state.set('_lastPlanStatus', '');
await saveCurrentSession();
}
});
+1 -1
View File
@@ -28,7 +28,7 @@
<div class="header-left">
<img class="logo" src="./assets/icons/llama.png" alt="logo" />
<span class="app-title">Metona Ollama</span>
<span class="app-version">v0.16.10</span>
<span class="app-version">v0.16.11</span>
<button class="icon-btn help-btn" id="btnHelp" title="使用帮助">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/>
+4 -25
View File
@@ -13,7 +13,6 @@ import {
needsConfirmation,
initPlanTracker,
getPlanTracker,
formatPlanStatus,
clearPlanTracker,
} from './tool-registry.js';
import {
@@ -1484,20 +1483,8 @@ async function handleThinking(
ctx.thinking = '';
ctx.toolCalls.length = 0;
// ── Plan Mode 执行进度注入 — 仅在进度变化时注入,避免每轮重复 ──
if (ctx.mode === 'plan' && ctx.loopCount >= 1) {
const tracker = getPlanTracker();
if (tracker.active && tracker.steps.length > 0) {
const lastDone = state.get<number>('_planLastInjectedDone', -1);
if (tracker.done !== lastDone) {
const status = formatPlanStatus();
if (status) {
ctx.messages.push({ role: 'user', content: status, ephemeral: true });
state.set('_planLastInjectedDone', tracker.done);
}
}
}
}
// Plan Mode 进度注入已删除 — AI 调用 plan_track mark_done 后工具返回值已含进度,
// AI 应从上下文自行推断或主动调用 plan_track status 查询
const abortController = registerAbortController();
@@ -2371,7 +2358,7 @@ async function handleReflecting(
}
ctx.messages.push({
role: 'user',
content: '计划已批准。现在开始执行——请直接调用工具web_search、write_file 等)来完成每一步。不要描述计划,直接行动。',
content: '计划已批准。现在开始执行——请直接调用工具来完成每一步。不要描述计划,直接行动。',
ephemeral: true,
});
transition(ctx, S.THINKING);
@@ -2440,17 +2427,10 @@ async function handleReflecting(
// Completion Gate 已删除 — 所有检查项(notThinking/toolResultReview/contextEfficiency/planModeCompletion)均已删除
// AI 应基于工具结果和上下文自行判断是否需要继续或完成
// Plan Mode 下 AI 通过 formatPlanStatus() 看到剩余步骤,应自行决定是否继续
// Plan Mode 下 AI 通过 plan_track mark_done/status 的工具返回值获知进度,应自行决定是否继续
logInfo('模型停止工具调用 → ReAct Agent Loop 结束');
// ── 保存 Plan Mode 最终进度到状态,供下一轮 Loop 注入历史 ──
// 注意:不在此处 clearPlanTracker,由 finally 块统一处理(保存 resumeData 后清理)
if (ctx.mode === 'plan') {
const tracker = getPlanTracker();
if (tracker.active && tracker.steps.length > 0) {
state.set('_lastPlanStatus', formatPlanStatus());
}
}
// ── 自动记忆提取(异步,不阻塞用户看到回复)──
// P3 #12 修复:在 cleanupAbortController 之前捕获 signal 引用,避免竞态
@@ -2730,7 +2710,6 @@ default:
savedAt: Date.now(),
};
state.set('_planResumeData', resumeData);
state.set('_lastPlanStatus', formatPlanStatus());
}
}
clearPlanTracker();
-2
View File
@@ -288,8 +288,6 @@ export type StateKey =
| 'loopWatchdogMs'
| '_planTracker'
| '_planResumeData'
| '_lastPlanStatus'
| '_planLastInjectedDone'
| 'globalToolMode'
| 'planAutoConfirm';