fix(tasks): 任务列表改按 id 降序,消除同刻创建任务的抖动
原先按 created_at 降序排,但没有二级排序键。同一时刻创建的多个任务时间戳 相同,排序不稳定;叠加前端每 10 秒轮询、以及 Manager 用内存 map 存任务 (遍历顺序随机、每次 List 都要重排),这些任务就会在列表里频繁互换位置。 改用 id 降序:id 由 BIGSERIAL 单调递增分配,即插入顺序,唯一且稳定,最新 创建的在最前。db.ListTasks 的 ORDER BY 与 Manager.List 的内存排序同步改。 验证: 新增 TestListTasksOrderByIDDesc 连本地 PG 实跑通过;db/server 全量 无新增失败(仅剩既有的 TestCompanyScopeInvalid)。
This commit is contained in:
1 parent
dfbbb33069
commit
4cf36c7896
9 files changed
+128
-3
No files matched your search
@@ -792,6 +792,24 @@ func (e *Engine) plannerLoop(ctx context.Context, t *Task) {
|
||||
if e.isSettling(t.ID) {
|
||||
return
|
||||
}
|
||||
// goalless(人工直投)分支:任务已无 open 目标时 planner 不跑——跑了会重判
|
||||
// met→cancelExec 杀掉用户经主 agent 直投的意图。是否结束改由 frontier 决定:
|
||||
// 还有 open/running 意图 → 保持 running、静默等待;意图已全部跑干 → 落 done。
|
||||
// 整段纯 Go、不触发任何 LLM 调用,也不打规划轮 marker。
|
||||
if open, err := t.Store.HasOpenGoal(); err == nil && !open {
|
||||
t.drainTriggers() // 丢弃累积的 done/finding 触发,避免 goalless 长会话里无界增长
|
||||
if active, err := t.Store.HasActiveIntent(); err == nil && !active {
|
||||
// frontier 抽干且无在跑意图 → 收尾。用 Guarded 版做 CAS,避免踩到并发的
|
||||
// pause/delete/超时收尾的状态转换。
|
||||
if won, err := e.m.SetTaskStatusGuarded(t.ID, "done"); err != nil {
|
||||
log.Printf("[goalless] task %s 收尾落 done 失败: %v", t.ID, err)
|
||||
} else if won {
|
||||
e.emitActivity(t, db.Activity{Worker: "system", Kind: "text",
|
||||
Summary: "目标已全部达成,直投意图已执行完毕,任务结束"})
|
||||
}
|
||||
}
|
||||
return // goalless 分支永不进入 planner.Plan
|
||||
}
|
||||
if !e.beginTaskOperation(t.ID) {
|
||||
return
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user