From f4443dca4f7a20037aa0f9dbb0556c4efc04af51 Mon Sep 17 00:00:00 2001 From: openqj Date: Tue, 27 Oct 2026 03:17:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AE=A1=E5=88=92=E6=A8=A1=E5=BC=8F=20?= =?UTF-8?q?+=20=E5=90=8E=E7=BB=AD=E6=B6=88=E6=81=AF=20+=20=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=88=86=E6=94=AF=E6=8E=A5=E4=BA=91=E7=AB=AF=20(#65)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 计划模式: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 --- README.md | 9 + cloud/console.html | 72 ++++- cloud/db.py | 14 + cloud/sandbox.py | 68 ++++- cloud/server.py | 258 +++++++++++++++++- cloud/tests/test_task_links.py | 485 +++++++++++++++++++++++++++++++++ cloud/worker.py | 288 +++++++++++++++----- 7 files changed, 1120 insertions(+), 74 deletions(-) create mode 100644 cloud/tests/test_task_links.py diff --git a/README.md b/README.md index 811840c..c5f2338 100644 --- a/README.md +++ b/README.md @@ -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 仍缺这两样) diff --git a/cloud/console.html b/cloud/console.html index 31f8ee4..9047f4a 100644 --- a/cloud/console.html +++ b/cloud/console.html @@ -128,6 +128,7 @@ +
@@ -183,13 +184,28 @@ +
+

实时链路

点任务行查看详情后,这里显示过程链路
+

后续消息

+
+ +
+ + + +
+
+