feat: 计划模式 + 后续消息 + 会话分支接云端 (#65)

- 计划模式:tasks 加 plan 列;plan 与 approval=full / goal 冲突时
  400;执行器在 approval 参数后追加 --sandbox read-only(本地
  dispatch/run/goal/popen 与 Docker 内层命令全覆盖),host 任务
  存下 sandbox 后续轮次自动继承只读。
- 后续消息:新表 task_followups;POST/GET /tasks/{id}/followups
  (仅 queued/running 的非 goal 任务;direct 立即往链路追加
  phase=followup-direct 条目,本轮跑完后优先于排队执行;排队
  按 direct 优先、队内先来先服务逐条再跑一轮,同一 thread;
  一条失败即停、剩余 pending 留给重试入口;取消时回 pending)。
- 会话分支:POST /tasks/{id}/fork(仅终态任务;继承 executor/
  模型/强度/权限/计划,goal 字段置空);worker 先 fork 再跑首轮,
  首轮失败不自动重试、不重复分叉,失败后走重试入口重跑首轮。
- 修任务级模型被覆盖:worker 此前无条件写成主模型,控制台
  选的模型实际不生效;现为任务级 > worker 主模型 > 配置。
- Docker 租户准备抽成 _docker_task_context,供普通尝试与 fork 共用。
- console:新建任务计划勾选(含冲突拦截)、详情计划徽标与
  分支来源、分支按钮与表单、后续消息区、列表 [计划]/[分支] 标记。
- 测试:cloud/tests/test_task_links.py 17 个(server 校验与继承、
  worker 模型优先、只读命令、排空顺序与停排、goal 不排空、
  fork 单次性);全量 cloud 542、host 49、deploy 14。

Co-authored-by: host <host@test.local>
This commit is contained in:
openqjandhost authored and GitHub committed 2026-10-27 03:17:51 +08:00
1 parent 6da3745127
commit f4443dca4f
7 files changed
+1120 -74

No files matched your search

+9
View File
@@ -239,6 +239,15 @@ python3 host.py daemon-stop
`GET /tasks/{id}/trace/stream`(运行中任务的 SSE:先 snapshot 再逐条
entry,终态发 done 关流;命令台详情的链路区用 fetch 流式读它,
EventSource 不能带 X-API-Key 头故不用)。
新业务链路:建任务可带 `plan`(计划模式:只读沙箱,执行器传
`--sandbox read-only`;不能与 `approval=full` 或 goal 同用);
`POST /tasks/{id}/followups`(body/mode,mode 为 queued 或
direct;仅 queued/running 的非 goal 任务可接)与
`GET /tasks/{id}/followups`(按创建时间排序)——排队不打断当前
轮、跑完按序再跑一轮,直接发送立即进链路(phase=followup-direct)
且跑完当前轮后优先于排队执行;`POST /tasks/{id}/fork`
(message 必填;仅终态任务可分支,继承 executor/模型/强度/
权限/计划,goal 字段置空,首轮失败不自动重试、不重复分叉)。
## GitHub PR/CI 的外部条件(真实 PR 仍缺这两样)