fix: tmux detach 后 ask_user 不再永久阻塞
问题根因:askUserBridge.requests 是无缓冲 channel,TUI 退出后
listenAskUser goroutine 消失,LLM 调用 ask_user 工具时 handler()
阻塞在 `b.requests <- req`,只有 ctx 取消才能解除(会杀掉整个任务)。
修复:
- askUserBridge 新增 detachCh(chan struct{})和 atomic 的 detached 标志
- Detach() 用 CAS 保证只关闭一次 channel,防止 double-close panic
- handler() 两处 select 均增加 `<-b.detachCh` case,立即返回
"用户不在线,请自行决策" 错误,LLM 收到后自主继续
- tui/app.go fallback 分支(p.Run() 退出且任务仍在运行时)
立即调用 bridge.Detach(),解除所有 ask_user 阻塞
This commit is contained in:
@@ -33,7 +33,12 @@ func Run(cfg app.Config, refs tools.References, prompts app.Prompts, styles map[
|
||||
snap := rt.Snapshot()
|
||||
if snap.IsRunning {
|
||||
// 任务仍在运行(可能是 tmux detach 导致 TUI 退出),
|
||||
// 不中断任务,回退到无 UI 阻塞等待模式
|
||||
// 不中断任务,回退到无 UI 阻塞等待模式。
|
||||
|
||||
// 脱离 TUI 后解除所有阻塞在 ask_user 的 handler goroutine,
|
||||
// 让 LLM 收到"用户不在线,请自行决策"提示后继续运行,
|
||||
// 而非无限等待一个永远不会到来的用户输入。
|
||||
bridge.Detach()
|
||||
fmt.Println("\n[TUI 已退出,任务仍在后台运行中...]")
|
||||
fmt.Printf("[小说: %s | 阶段: %s | 进度: %d/%d 章]\n",
|
||||
snap.NovelName, snap.Phase, snap.CompletedCount, snap.TotalChapters)
|
||||
|
||||
Reference in New Issue
Block a user