feat: 旧任务继续会话——终端任务带新消息 + 全部选项同一会话续跑

server:POST /tasks/{id}/continue(终端非 merged 任务重排队,
resume_message 列存本轮消息,不传选项沿用原值,plan/goal 冲突
与新建一致,goal_mode=1 时转新 goal 语义;CAS 防并发改状态,
审计 task_continued);tasks.resume_message 三处迁移 + PG 建表。
worker:认领后本轮 prompt 换成续跑消息(只换内存副本),
goal 续跑走 goal-resume 而不是 goal,跑完清 resume_message
(进程被杀时不清,下次认领重跑同一条消息)。
host:goal-resume --goal-text(旧任务接续 goal 模式:跳过状态
与记录守卫,旧线程上从第 1 轮开新目标循环,新语义不限轮次;
无线程时拒绝)。
sandbox:Local/Docker goal_resume_task + popen goal-resume kind;
附带 popen goal 命令改成新语义(无验收不传 --verify,轮次 0
原样传,此前 goal 任务到本地 worker 会直接报错)。
console:详情页终端非 merged 任务出继续会话表单(消息 +
模型/强度/权限/计划/goal,模型下拉复用中转列表)。
测试:新增 test_task_continue.py 11 个 + test_host_continue.py 2 个。
This commit is contained in:
host committed 2026-10-27 04:40:11 +08:00
1 parent cf293914d9
commit 3a4997d346
9 files changed
+823 -20

No files matched your search

+18
View File
@@ -495,6 +495,24 @@ verify_command,goal 新语义(无验收)任务到本地 worker 会直接
报错,本批顺手修成与同步 goal_task 一致(无验收不传 --verify,
轮次 0 原样传)。
## 旧任务继续会话(终端任务接回来再跑一轮)
详情页对终端任务(completed/failed/interrupted/merge-failed)
提供“继续会话”:填本轮消息 + 模型/强度/权限/计划/goal 全可选
(不传的沿用任务原值),`POST /tasks/{id}/continue` 把任务重
新排队,worker 认领后在同一会话线程上再跑一轮——不是新任务
(原 prompt 不动,只换本轮输入),也不是分支(不建新线程)。
新消息存在 tasks.resume_message 列,worker 跑完清掉;进程中途
被杀时清不到,下次认领重跑同一条消息,不静默丢消息。
goal 模式的继续:server 把任务转成新 goal 语义(goal=新消息、
验收清空、轮次 0),worker 走 host.py `goal-resume --goal-text`
在旧线程上开新目标循环(不限轮次,模型宣告完成才结束);
普通任务的继续走 dispatch 撞已存在 → run 续跑(与重试同款)。
不适用:进行中任务请用后续消息(queued/running 各 409),已
合并任务 worktree 已删、请分支(merged 409);冲突与新建一致
(plan + approval=full、plan + goal 各 400)。
## 测试
```bash