mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-06 01:07:35 +00:00
fix(agent): 补齐 registerToolCancel 的定义——修复 HEAD 不可编译
## 我造成的破坏 上一个提交e6023e1里,我用 `git add internal/agent/core/toolcall.go` (整文件)时,把工作区中**别人尚未提交**的两行调用一起暂存了: toolCancelID := a.registerToolCancel(cancel) defer a.unregisterToolCancel(toolCancelID) 而这两个方法与它们依赖的字段(cancelTools/toolSeq/toolMu)留在了 agent.go / eventloop.go 里没被提交。 ⇒ **e6023e1 单独 checkout 编译不过**: internal/agent/core/toolcall.go:234:20: a.registerToolCancel undefined (type *Agent has no field or method registerToolCancel) 已用 git worktree 在e6023e1上实测确认,不是推测。 ## 为什么这违反了模块化设计 按本仓的模块化设计,`eventloop.go` 里的 registerToolCancel 与 `agent.go` 的字段是**一个内聚单元**,必须同批提交。把它们与 toolcall.go 的调用拆散, 就等于交付了一个引用不存在的符号 —— 构建的可 bisect 性被破坏。 ★ 根因是我的提交操作,不是设计问题:我用整文件 add 代替了只暂存自己的 hunk。当时确实检查过 toolcall.go「只有我的改动」,但只 grep 了 `cancelRunningTools|cancelTool`,漏掉了 `registerToolCancel` —— **检查用了错误的模式串,等于没检查**。 ## 本次提交 把那个内聚单元的完整改动补齐(这是「停止键能取消正在跑的工具」特性): - `agent.go`:cancelTools / toolSeq / toolMu 字段 - `eventloop.go`:registerToolCancel / unregisterToolCancel / cancelRunningTools 以及 stop 分支的调用点 - `stop_cancels_tool_test.go`:该特性的判据 特性说明见字段与方法上的注释(原始作者撰写)。 ## 验证 go build ./... → 0 go test -run TestStopCancelsRunningTool → PASS go test ./... -count=1 -race → 见下一条
This commit is contained in:
@ -218,6 +218,26 @@ type Agent struct {
|
||||
cancelLLM context.CancelFunc
|
||||
llmMu sync.Mutex
|
||||
|
||||
// 进行中的**工具调用**取消函数集合(2026-10-31 加)。
|
||||
//
|
||||
// ❗为何需要它:`cancelCurrentLLM` 只能停 LLM 流。而工具可能是长阻塞的
|
||||
// (实测:`browser_start` 被模型要求 30m、被硬上限夹到 10m)。
|
||||
// 那种情况下用户按「停止」什么都不发生 —— 日志里只有
|
||||
// `stop requested ... (queued=1 will be short-circuited at pre-action)`,
|
||||
// 而当前轮仍卡在工具里直到自己超时。
|
||||
//
|
||||
// ❗为何是**集合**而不是单个槽:同一轮可并发执行多个工具
|
||||
// (批内全部声明 ParallelSafe 时),单槽会互相覆盖,且先完成的那个
|
||||
// 会把别人的取消函数清掉。
|
||||
//
|
||||
// ❗为何只给「停止」用、不给中断抢占用:工具执行期间不取消是用户
|
||||
// 裁定(R5)—— 副作用不可回滚,中途掤断会把「决定执行但未执行」
|
||||
// 变成尴尬状态。所以 `cancelRunningTools` 只在 stop 分支调,
|
||||
// 不在 `requestPreempt` 分支调(见 eventloop.go)。
|
||||
cancelTools map[uint64]context.CancelFunc
|
||||
toolSeq uint64
|
||||
toolMu sync.Mutex
|
||||
|
||||
// 模型思考模式(thinking/reasoning)
|
||||
thinkingEnabled bool
|
||||
|
||||
|
||||
Reference in New Issue
Block a user