mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-07 01:37:34 +00:00
fix(plugin): 修两处持锁自死锁(CI 双红真因)+ tools_ready 事件声明
## 死锁(这是 CI 连续两次红的真因) `StopAll` 与 `StopPlugin` 都在持有 `r.mu` **写锁**时调用 `RemoveBuiltinSkill` → `skillDirOf` → `r.mu.RLock()` ⇒ **自死锁**。 后果不是报错而是**卡死**: - internal/plugins 卡 300s 超时(TestCapability_RestrictedPluginStillLoads) - internal/plugin 卡 840s 超时(TestStopPluginDoesNotTouchPersistentState) - CI 的 `go test ./...` 与 `go test -race` 双双红 修法:拆出**不加锁**的内部版本,持锁路径只走它: - `skillDirFrom(dataDir, name)`(纯函数) - `removeBuiltinSkillLocked(pluginName, p, dataDir)`(显式传 dataDir, 避免"看起来没取锁、一改就取锁"的隐患) - `announceSkillRemovedLocked`(持锁下直读 r.evBus) 修后:internal/plugins 300s → 12s,internal/plugin 840s → 0.7s。 ## 防回归判据 `TestStopAllAndStopPluginDoNotDeadlock`:死锁**不返回**,普通断言抓不到, 所以用**超时**当判据(5 秒未返回即失败),并指明应改用 Locked 版本。 ## tools_ready 事件声明 新增的 tools_ready 触发 `TestEveryPublishedEventHasAnOutwardPath` (该判据防"事件发了、客户端收不到"的静默失效)。 tools_ready 是**内核内部**就绪信号(plugin-host → seq 等订阅者), 不是对话流程事件,前端无需感知 ⇒ 在 allowed 里显式声明理由。 ## 验证 go build ./... / go vet ./... / go test -p 1 ./... / -race 全通过。
This commit is contained in:
@ -33,6 +33,25 @@ const (
|
||||
// 职责链:发现者(兼容层)→ 移交事件 → 归属者(skillmgr)加载管理。
|
||||
EventSkillDetected EventType = "skill_detected"
|
||||
|
||||
// EventToolsReady 在**全部插件加载完成、工具已注册完毕**之后发布一次。
|
||||
//
|
||||
// 语义边界(关键):它只保证"工具调用可用",**不保证 agent 正在运行**。
|
||||
// 订阅者若只是执行一段工具调用序列(如 seq 的开机序列),此刻即可开始;
|
||||
// 它们的返回值进队列,等 agent 起来后再处理即可。
|
||||
//
|
||||
// 为什么不是 AgentReady:seq 自动运行**不依赖 agent** —— 它只是一段
|
||||
// 调用序列。把事件绑在 agent.Start() 上会让时机被人为推后,且把
|
||||
// "何时可跑序列"这个内核判断外包给编排层(main),换个入口就漂移。
|
||||
//
|
||||
// 发布点:kernelmod/pluginhost 在 `ks.PluginsReady = true` 处发布
|
||||
// (那里正是"内置插件也已 LoadSkipping 完成"的时刻)。
|
||||
//
|
||||
// payload 约定:
|
||||
//
|
||||
// plugins: []string,已加载插件名
|
||||
// plugin_count: int
|
||||
EventToolsReady EventType = "tools_ready"
|
||||
|
||||
// EventMemoryAccess 是**图记忆读写事件**:谁读了/写了哪几个记忆块。
|
||||
//
|
||||
// 为什么需要它(2026-10-08):星图此前的「跟随 agent 活动」靠**工具名猜节点**
|
||||
|
||||
Reference in New Issue
Block a user