-
Notifications
You must be signed in to change notification settings - Fork 8
Diff 批注与保存/拒绝流程分支 #8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
HCPTangHY
wants to merge
40
commits into
Lianues:main
Choose a base branch
from
HCPTangHY:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Contributor
HCPTangHY
commented
Jan 15, 2026
- Google 搜索工具(后端 + 前端组件 + 设置面板)
- 背景移除本地 AI 引擎(GeminiEngine, TransformersEngine)
- Diff 批注与保存/拒绝流程(DiffHandlers)
- 图片缩放工具的填充模式和缩放算法支持
- 其他修复和优化
引入 `cleanHistoryStart` 方法来清理历史记录。该改动确保对话历史始终以 `user` 角色开始,并自动过滤掉裁剪后可能残留的孤立 `functionResponse` 消息,以满足 Gemini 等 API 的调用规范。
1. **后端重构**:在 `ChatHandler` 中将工具迭代逻辑提取为 `continueToolLoop` 私有方法,并新增 `continueWithAnnotation` 接口,实现了工具执行与后续 AI 生成逻辑的解耦。 2. **交互流程优化**:调整工具确认流程,在工具执行完成后向前端发送 `needAnnotation` 信号并返回,允许用户在 AI 处理工具结果前提供额外的指导信息(批注)。 3. **前端状态管理**:更新 `chatStore` 和 `ToolMessage`,由 store 统一处理批注消息的 UI 插入、输入框清空以及后续的继续对话请求,确保对话历史顺序正确。 4. **协议与通信**:在 `types.ts` 中新增批注请求接口定义,并在 `ChatViewProvider` 中实现了相应的消息转发与流式响应处理。
- 在 ToolMessage 组件中为 apply_diff 和 write_file 工具添加保存/拒绝按钮 - 实现 pending diff 轮询机制以追踪待处理的文件修改 - 增强 rejectDiff 方法支持还原文件内容并关闭标签页 - 添加 diff.accept、diff.reject、diff.getPending 消息处理 - write_file 工具支持展示用户编辑内容 - 补充多语言翻译支持(en/ja/zh-CN)
将 needAnnotation 自动处理逻辑与 diff 场景分离: - 检测到 apply_diff/write_file 工具成功执行时,不再自动继续对话 - 重命名 sendDiffAnnotation 为 continueDiffWithAnnotation - 保存/拒绝操作后统一调用 continueDiffWithAnnotation 继续对话 - 支持无批注时也能继续对话
- 后端在 needAnnotation 时返回 pendingDiffToolIds,前端无需推断 - 重构 ToolMessage 组件的 diff 状态管理,支持多个工具的批量处理 - 添加已处理/等待中的视觉状态反馈 - 修复换行符差异(CRLF vs LF)导致的用户编辑误判 - 修复 ConversationManager 并发创建对话的竞态条件 - 添加防重复发送 continueWithAnnotation 请求的保护 - 修复前后端工具 ID 不匹配时的状态同步问题
- 后端新增 ManualSaveListener 机制,监听用户手动保存事件 - 重构 saveListener 逻辑,复用 acceptDiff 完成状态更新 - 前端提取 markDiffAsAccepted/markDiffAsRejected 公共方法 - 前端监听 diffManualSaved 消息,直接更新 UI 状态无需重复调用 API - 解决 CTRL+S 保存与按钮点击保存行为不一致的问题
问题一:两条并发 AI 请求 - 用户点击保存/拒绝按钮时,可能触发两条 continueWithAnnotation 请求 - 修复:areAllDiffsProcessed() 必须等待 requiredDiffToolIds 设置后才返回 true - 修复:添加 isSendingContinue 防重标志 问题二:批注丢失(拒绝按钮场景) - 用户拒绝 diff 时,hasFileModificationToolInResults 错误判断为执行错误 - 修复:只检查 error 字段,不检查 success === false 问题三:批注丢失(diff 确认等待场景) - 工具确认时用户输入的批注,在等待 diff 确认期间丢失 - 修复:引入 pendingAnnotation 机制,暂存批注并在 diff 确认时合并发送 - 修复:ChatViewProvider 补齐字段转发(pendingAnnotation, annotationUsed) 主要改动: - backend/ChatHandler.ts: 重构 hasFileModificationToolInResults 逻辑,增加 pendingAnnotation 返回 - frontend/chatStore.ts: 添加批注暂存、合并和防重复发送逻辑 - frontend/ToolMessage.vue: 优化 diff 确认状态管理 - webview/ChatViewProvider.ts: 补齐 toolIteration 消息字段转发
添加 isDiffProcessingStarted 标志解决时序问题: - 用户点击保存/拒绝按钮时立即调用 markDiffProcessingStarted() - handleStreamChunk 检查此标志,跳过设置 pendingDiffToolIds - 在流式完成/取消/错误及切换对话时重置标志
将 isDiffProcessingStarted 检查逻辑从 store 移至 ToolMessage 组件: - shouldShowDiffArea 中检查,阻止按钮显示 - enhancedTools 中检查,防止状态被设为 pending - shouldPollDiffs 中检查,停止轮询防止数据覆盖 - 模板中双重检查确保响应式更新 store 层始终设置 pendingDiffToolIds,因为 areAllDiffsProcessed 依赖它 同时修复 Gemini API 请求体缺少 role 字段的问题
- 直接解构 Pinia store 会丢失响应性,导致值是挂载时的快照 - 使用 storeToRefs 确保 isDiffProcessingStarted 能正确追踪变化 - 简化 isDiffProcessed 逻辑,不再依赖可能返回旧数据的 pendingDiffMap - resetDiffState 不再清空 processedDiffTools,防止按钮重现 - 在轮询中增加竞态条件检查,防止异步返回覆盖用户操作 - 重置 isSendingAnnotation 标志,防止上次请求未完成导致后续失败
- 修复 isDiffProcessingStarted 检查会阻止所有新工具按钮显示的问题 - 该保护已在 enhancedTools、轮询逻辑等其他地方实现 - 同时修复 remove_background API 请求体缺少 role 字段的问题
即使 isSendingAnnotation 为 true,当 needAnnotation 未定义(如 diff 失败)时,后端仍会继续发送 AI 响应。移除之前的拦截逻辑,以确保在这种情况下能正常创建占位消息接收后续响应。
修复总结对话后functionCall被错误裁剪、支持工具确认后的分步批注提交
- 解决版本号冲突,统一至 1.0.29 - 合并 CHANGELOG 更新日志 - 同步 i18n 语言文件版本显示
- 后端:在 DiffManager 自动保存成功后主动通知前端,确保 UI 状态(如接受/拒绝按钮)能及时更新。 - 前端:优化带批注拒绝工具的流程,引入 `isSendingAnnotation` 标志位以防止重复提交请求。 - 前端:在发送批注请求前预先创建 Assistant 占位消息,确保后端后续生成的流式响应能正确追加到新消息中。 - 前端:完善错误处理机制,在请求失败时重置相关状态标志,并在 `retryAfterError` 中增加冲突检查。
在 ToolMessage.vue 中引入 checkAndContinueConversationWithFallback,处理 pendingDiffToolIds 为空的情况,确保 diff 处理后能正常触发对话继续。同时优化 chatStore.ts 中的批注发送逻辑,显式处理用户消息的添加,避免在 diff 迭代过程中出现消息计数错误或消息丢失。
优化取消状态的检测逻辑,仅在 abortSignal 真正被触发时才判定为用户取消。通过移除对错误名称和消息字符串(如 "fetch failed")的模糊匹配,避免因网络异常导致的会话错误暂停。
- Gemini 格式化器:清理 API 不支持的字段(如 functionCall/functionResponse 中的 id 字段)。 - 响应处理:修复 proxyFetch 和 ChannelManager 中 Response body 因重复读取导致的潜在错误。 - 对话总结:在 ChatHandler 总结历史时过滤 inlineData(Base64 数据),仅保留文本以优化 Payload。 - 前端 Store:修正 processedDiffTools 的清空时机,防止在继续执行 diff 时 UI 状态回退。
- 支持多种填充模式(fill, cover, contain, inside, outside)以灵活处理宽高比 - 支持多种缩放算法(lanczos3, lanczos2, cubic, mitchell, nearest)以平衡质量与速度 - 更新工具的参数定义,允许用户和模型指定 fit 和 kernel 参数 - 优化任务执行逻辑,支持参数验证并返回实际缩放后的尺寸信息
- 移除 ToolMessage.vue 中对 requiredDiffToolIds 的 watch 监听,统一通过 tryToContinueDiff 入口处理,解决逻辑重复触发与竞态冲突。 - 修复对话完成后由于 processedDiffTools 被清空导致 UI 状态回退至 pending 且按钮重复出现的 Bug。 - 优化 shouldShowDiffArea 的判断逻辑,增加对用户正在处理状态(isUserProcessing)的检查,并改善 loading 状态显示。 - 在 chatStore 中新增 setIsSendingDiffContinue 方法,以便在组件层同步控制请求状态,防止重复发送继续对话指令。
- 后端:在发送给 Gemini API 前过滤掉 parts 为空的消息,满足 API 必须包含有效内容的规范。 - 前端:重构 `ToolMessage` 的 Diff 处理逻辑,引入 `handledDiffIds` 和 `handledFilePaths` 以支持多文件顺序确认,防止状态竞争。 - 流程修复:在 `tryToContinueDiff` 中增加对后端 `toolIteration` 的等待逻辑,并在 `chatStore` 接收到该状态后自动触发后续对话,解决确认后的对话卡死问题。 - 调试增强:在 `ChatViewProvider` 的流式响应处理中增加详细日志输出,并透传更多状态字段。
将原本存储在 ToolMessage 组件内的 diff 批注逻辑移至 chatStore 管理。这解决了在 store 级别处理自动继续对话逻辑时,无法访问组件内部状态导致批注丢失的问题。 主要变更: - 在 chatStore 中新增 diffAnnotation 状态及相关 getter/setter - 优化 ToolMessage 组件,使其通过 store 读写批注内容 - 完善了批注状态在对话完成、报错及手动清理时的重置逻辑z
引入基于 Transformers.js (RMBG-1.4) 的本地抠图引擎,支持完全离线运行并提供发丝级精度的背景移除功能。同时重构了相关模块以支持多引擎扩展。 具体变更包括: 1. **引擎重构**:建立抠图引擎工厂模式,将原有的 Gemini 逻辑解耦为独立引擎,并新增 Transformers 本地引擎。 2. **本地模型支持**:集成 @huggingface/transformers,支持加载 RMBG-1.4 模型进行本地推理。
将 ToolMessage 组件内的 handledDiffIds 和 handledFilePaths 移至 chatStore 进行统一管理,解决组件重新渲染时 diff 处理状态丢失的问题。 - 修复对话完成后因 processedDiffTools 被清空导致操作按钮重新出现的 Bug - 优化 write_file 多文件工具的处理逻辑,通过 store 追踪每个文件的处理决定 - 增强状态清理逻辑,确保在对话重置或流结束时正确重置处理记录
- 优化 `toolIteration` 中查找待更新消息的逻辑,使其在 `isSendingAnnotation` 为真时能正确定位助手消息。 - 在流式数据处理中增加对 `skipContinueConversation` 和 `isSendingAnnotation` 的状态校验,防止在前端重复添加用户消息。 - 修复 `continueDiffWithAnnotation` 中的逻辑,确保当存在已存储批注时不再重复创建用户消息。 - 细化批注发送流程中的状态管理,提升工具调用确认环节的 UI 稳定性。
- 合并上游 OpenAI Responses API 支持 - 保留本地 continueToolLoop 模块化实现
- 重新加入 continueWithAnnotation 流请求(backend/webview/frontend 全链路) - webview 增加 diff.accept/diff.reject/diff.getPending handler,并转发 diffManualSaved - streamChunk 转发 needAnnotation/pendingDiffToolIds/annotationUsed/pendingAnnotation - 前端 chatStore 恢复 pendingDiffToolIds/processedDiffTools 等状态与 continueDiffWithAnnotation 逻辑 迁移自 backup/main-before-upstream-1.0.38(包含原 chatStore 竞态修复逻辑 19d1647 的行为)
- ToolsSettings 重新加入 google_search 配置面板 - 补回 en/ja/zh-CN 的 googleSearch 文案 - 更新 i18n 类型定义以匹配新增 key
为文件 diff 流程添加了以下翻译项: - save / reject (保存/拒绝) - saved / rejected (已保存/已拒绝) - waitingOthers (等待其他文件) - userEdited (用户已编辑) 同步更新了 en, ja, zh-CN 语言包及相关的类型定义。
1. 简化批注捕获:批注改为在 continueDiffWithAnnotation 时统一从输入框捕获,不再随单个文件的保存/拒绝操作分散传递。 2. 增强工具检测:优化后端 getFileModificationToolIds 逻辑,支持更准确地识别 apply_diff 和 write_file 中的待处理 diff。 3. 优化状态管理:在对话重试、流结束或错误时增加对 diff 相关状态(如 processedDiffTools, handledDiffIds)的重置逻辑。 4. 提升交互稳定性:移除 ToolMessage 中的冗余 watch 逻辑和日志,统一由手动触发源控制对话继续,避免竞态条件。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.