diff --git a/.task/archive/feature-agent-harness-p0.md b/.task/archive/feature-agent-harness-p0.md new file mode 100644 index 00000000..4a58330d --- /dev/null +++ b/.task/archive/feature-agent-harness-p0.md @@ -0,0 +1,34 @@ +# feature/agent-harness-p0 任务卡 + +任务主记录:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/134 ;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 342efd8e08950329d620c9b49a06d2cb1bafaefa +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-harness-p0(worktree);分支:feature/agent-harness-p0 +- 授权与交付终点:用户批准 harness 提案 + P0 落地。允许:本 worktree 编辑、子仓 feature/agent-harness-p0 提交与推送、建 PR、推进 gitlink。未授权:合入 PR、改写历史、动分支保护、发版、实施 P1–P4。 +- 子仓分支均从各自 origin/main 切出(documents 当时比 Dev 指针多 1 个已合入提交,backend 同)。 + +## 目标与非目标 + +- 目标:写出 harness 设计提案(对标 ZCode 与 Claude Code,P0–P4),并落地 P0:助手历史按原生工具消息回放;虚假交付守卫改为最多纠正 2 次,用尽后附系统提示。 +- 非目标:不改 agent-native 内核(P1);不改纪要内容质量;不把小队入口的一次性失败改成纠正轮次。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 342efd8e08950329d620c9b49a06d2cb1bafaefa | 342efd8e08950329d620c9b49a06d2cb1bafaefa | 2026-10-01T12:23:35Z | + +## 结果与验证 + +- 结果:Documents 提案 `docs/proposals/2026-10-01-agent-harness.md`,并在基座路线图第 3 阶段加上链接。Backend 回放与守卫见提交 `188c633`。子仓 PR:Documents https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/32 ;Backend https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/42 。 +- 验证:启动 precheck verdict READY(head=342efd8e08)。Backend `go test ./...` 通过。Dev worktree `make test` 通过(boundaries、core、backend、frontend vitest 51、ui vitest 71、agent-command)。 +- 影响与剩余项:gitlink 指向上述两个子仓分支头。P1–P4 未实施。Dev PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/134 ,合入权在所有者。 +| 同步前验收 | 342efd8e08950329d620c9b49a06d2cb1bafaefa | 897d12d6b5f158f8140164ac2195f8862f583456 | 2026-10-01T12:31:33Z | + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 46b9e53f75f5383ea1ac961b8e6fa587f88ce64a(PR #134)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin the harness proposal and native tool-call replay' (#134) from feature/agent-harness-p0 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-agent-harness-p1.md b/.task/archive/feature-agent-harness-p1.md new file mode 100644 index 00000000..d0f8b1e9 --- /dev/null +++ b/.task/archive/feature-agent-harness-p1.md @@ -0,0 +1,44 @@ +# feature/agent-harness-p1 任务卡 + +任务主记录:PR #136 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/136;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 701d4ab1e351b83bbc05c1b3f306467941064805 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-harness-p1(worktree);分支:feature/agent-harness-p1 +- 授权与交付终点:实现 P1(直连改走 runtime.Run,内核新能力默认关闭)。允许改 agent-native、backend、agent-squad 与 Dev 的 gitlink,并在各仓 feature/agent-harness-p1 上提 PR。未授权:合入 main、改小队行为、做 P2 计划回灌或 P3 子代理。 +- precheck(2026-10-01):verdict READY;R0=701d4ab1e351b83bbc05c1b3f306467941064805;branch=main head=701d4ab1e3;ahead=0 behind=0;tree clean。 + +## 目标与非目标 + +- 目标:直连 LLMRunner 改为 runtime.Run 适配;内核补 Stop、工具钩子、提醒、重复调用提醒、length 续写与 FinishReason。新字段零值保持今天的行为,P1 只给直连打开 RepeatGuard 与 ContinueOnLength。 +- 非目标:不改小队路径;不实现 Reminders 的计划回灌(P2);不改 SubLLMRunner / delegate_task(P3)。 +- 裁定:Stop 在 follow-up 排空之后才看;两者同时设置时,本轮有 follow-up 就不调用 Stop。length 续写优先于 follow-up 与 Stop。History 只在会话转录为空时作为初始转录,且不回写进 Session。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 701d4ab1e351b83bbc05c1b3f306467941064805 | 701d4ab1e351b83bbc05c1b3f306467941064805 | 2026-10-01T12:51:56Z | +| 同步前验收 | 701d4ab1e351b83bbc05c1b3f306467941064805 | b7631c71a81592b01ffe9b2d35bbb651b97eed56 | 2026-10-01T13:30:00Z | + +## 结果与验证 + +- 结果:直连 `LLMRunner` 改为 `runtime.Run` 适配。内核新增可选的 Stop、BeforeTool/AfterTool、Reminders、RepeatGuard、ContinueOnLength、History、UnknownTool 与 `llm.Event.FinishReason`。直连打开 RepeatGuard 与 ContinueOnLength;小队不设置这些字段。三处 agent-native gitlink 同为 `a34689c`(Dev `deps/agent-native`、backend `deps/agent-native`、agent-squad `deps/agent-native`)。 +- 指针:agent-native `a34689c`,backend `cfcf95d`,agent-squad `590fd86`。 +- 裁定:未在画像里声明、但模型仍然发出的工具调用走 `UnknownTool`,零值保持 unknown tool 错误。注册表 schema 用宽松 object,真实 schema 仍经流式请求声明,避免空参数被内核校验提前拒绝。 +- 验证: + - precheck(启动):verdict READY;R0=701d4ab1e351b83bbc05c1b3f306467941064805;head=701d4ab1e3;ahead=0 behind=0;tree clean。 + - agent-native `go test ./...` 通过。 + - backend `go test ./...` 通过。现有 `internal/runtime` 断言未改;新增工具整批超限落库与 length 续写。 + - agent-squad `scripts/submodule-consistency.sh` 全部 ok;`go test ./...` 通过。 + - Dev `make test` 通过(boundaries ok,core/backend go test,frontend vitest 51,ui vitest 71,agent-command ok)。 + - task-sync:`Already up to date.` `[synced] sync_base=701d4ab1e3 tested_head=b7631c71a8 checked_at=2026-10-01T13:30:00Z` +- 影响与剩余项:合入顺序为 Agent-Native #6,然后 Backend #43 与 Agent-Squad #6,最后 Dev #136。均未合入。P2 的 Reminders 仍为 nil。小队行为留到 P3。 +| 同步前验收 | 701d4ab1e351b83bbc05c1b3f306467941064805 | 1417fbef9d5d745f42d9c6b919213d7a52a53a8c | 2026-10-01T13:41:48Z | + +## 闭合记录(card-autoclose 回填) + +- 依据:merge def110d784dfeb0139062cb511a0b7de6e59ae81(PR #136)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin the harness turn loop across the three native checkouts' (#136) from feature/agent-harness-p1 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-agent-harness-p2.md b/.task/archive/feature-agent-harness-p2.md new file mode 100644 index 00000000..7d83a346 --- /dev/null +++ b/.task/archive/feature-agent-harness-p2.md @@ -0,0 +1,76 @@ +# feature/agent-harness-p2 任务卡 + +任务主记录:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/138 ;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= d02fa9c20a594da287983d8edd47156ddbd49e01 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-harness-p2(worktree);分支:feature/agent-harness-p2 +- 授权与交付终点:实现 P2 结果把控。允许改 Agent-System-Backend,并在 `feature/agent-harness-p2` 上提 PR;Dev 仓只推进 `modules/backend` 并提 PR。未授权:合入 main、改 agent-native 内核、改小队路径、改 SubLLMRunner、做工作流执行器。 +- 启动自检(2026-10-01T13:44Z):`make precheck` verdict READY。head=d02fa9c20a,origin/main 同步,树干净,linked worktrees=0。必读 core/baseline.md、workflows/delivery.md §1 已读。 + +## 目标与非目标 + +- 目标:直连终轮在 `deliverableGate` 之后做确定性检查(工件存在且非空;md/txt/docx 走 quality,lint error 或评分不过即不通过),再由不带工具的验证器输出 `{passed, reason, nextAction}`。出错或无法解析判不通过并给 Notice。计划和待办连续 3 个工具轮未更新时提醒一次,每 run 最多 3 次,不落库。 +- 非目标:不改 agent-native;不改小队路径和 SubLLMRunner;不做工作流执行器。`runtime.verify` 缺省读取为 false,生产默认 true。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | d02fa9c20a594da287983d8edd47156ddbd49e01 | d02fa9c20a594da287983d8edd47156ddbd49e01 | 2026-10-01T13:45:07Z | +| 同步前验收 | d02fa9c20a594da287983d8edd47156ddbd49e01 | f9d7bbe9f2cb4ccc3966faf3d3d7c2949dffcbc6 | 2026-10-01T13:54:53Z | + +## 结果与验证 + +- 结果:直连终轮在 `deliverableGate` 之后检查本轮工件(存在、非空;md/txt/docx 走 `quality.ScoreBytes`),再由不带工具的验证器给出 `{passed, reason, nextAction}`。验证器出错或无法解析时不再续跑主模型,并附 Notice「本轮回复未通过独立验证(验证器不可用)」。计划和待办连续 3 个工具轮未更新提醒一次,每 run 最多 3 次,不落库。Backend `a3ae1b9`。Dev 只推进 `modules/backend` 到该提交。三处 agent-native 仍为 `a34689c`(Dev `deps/agent-native`、backend `deps/agent-native`、agent-squad `deps/agent-native`)。 +- 验证:见下方三段输出。`make test` 退出码 0(boundaries、core、backend、frontend vitest 51、ui vitest 71、agent-command)。 +- 影响与剩余项:`runtime.verify` 默认开启,每个终轮多一次轻量模型调用,可用该设置关闭。普通问答也会被「拿不准判不通过」,最多续跑 3 次。Backend PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/44 与 Dev PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/138 均未合入。小队路径与 SubLLMRunner 未改。 + +### precheck + +``` +[repo] branch=main head=d02fa9c20a +[remote] origin/main=d02fa9c20a ahead=0 behind=0 +[tree] clean submodules_drift=0 uninit=0 +[worktrees] linked=0 +[recycle] merged un-recycled branches: feature/card-close-20261001-124542Z feature/card-close-20261001-134217Z feature/card-close-base-extension-roadmap +[required-reading] core/baseline.md, workflows/delivery.md §1 +[R0] d02fa9c20a(完整:d02fa9c20a594da287983d8edd47156ddbd49e01) +[verdict] READY — 可建任务工作区:make task-start NAME=feature/your-branch +``` + +### task-sync + +``` +Already up to date. +[synced] sync_base=d02fa9c20a tested_head=f9d7bbe9f2 checked_at=2026-10-01T13:54:53Z +[next] 跑正式验收(make test 等),证据写入任务卡 +``` + +### make test + +``` +bash scripts/lint-boundaries.sh +boundaries ok +cd modules/core && go test ./... +ok agent-system-core 0.002s +cd modules/backend && go test ./... +(各包 ok,含 internal/runtime、internal/quality、internal/server) +cd modules/frontend && npm ci && npx vitest run + Test Files 9 passed (9) + Tests 51 passed (51) +cd modules/ui && npm ci && npx tsc --noEmit && npx vitest run + Test Files 11 passed (11) + Tests 71 passed (71) +cd deps/agent-command && go vet ./... && go test -count=1 ./... +ok agent-command 0.002s +ok agent-command/conformance 0.002s +``` +| 同步前验收 | d02fa9c20a594da287983d8edd47156ddbd49e01 | 9df951323ab83e6d3338b67c64e69156d3734989 | 2026-10-01T14:00:37Z | + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 1939d50a7fcb61bdb4bc98cba84173e7e5fc9a11(PR #138)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin backend to the final-turn result checks' (#138) from feature/agent-harness-p2 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-agent-harness-p3.md b/.task/archive/feature-agent-harness-p3.md new file mode 100644 index 00000000..7f81bf57 --- /dev/null +++ b/.task/archive/feature-agent-harness-p3.md @@ -0,0 +1,84 @@ +# feature/agent-harness-p3 任务卡 + +任务主记录:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/140 ;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= bc8fef76bb8cec7b6ea1acf6c061232d20a78102 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-harness-p3(worktree);分支:feature/agent-harness-p3 +- 授权与交付终点:实现 P3a(子代理 profile、带工具的子循环、深度 1、历史隔离)。允许改 Agent-System-Backend,并在 `feature/agent-harness-p3` 上提 PR;Dev 仓只推进 `modules/backend` 并提 PR。未授权:合入 main、改 agent-native、改 agent-squad、改 core 契约、做后台通知或评审流水线。 +- 启动自检(2026-10-01T14:01Z):`make precheck` verdict READY。head=bc8fef76bb,origin/main 同步,树干净。必读 core/baseline.md、workflows/delivery.md §1 已读。 +- 裁定:profile 的 tools、model、maxTurns 只从内置库文件读取,用户覆盖正文不能改这三项,因此不改 `core.PromptModule`。子代理不挂终轮 Stop 检查,父回复的终轮检查覆盖子代理产出的工件。小队步骤一律用 `agent.sub.general`。 + +## 目标与非目标 + +- 目标:`delegate_task` 按 profile 拉起带工具的内核子循环,深度为 1,父会话只收到摘要和工件;子 run 消息不进入主对话历史。小队步骤经 `SpawnSubagent` 走同一运行时。 +- 非目标:后台运行与完成通知、评审流水线、小队角色到 profile 的映射。不改内核、小队仓和 core 契约。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | bc8fef76bb8cec7b6ea1acf6c061232d20a78102 | bc8fef76bb8cec7b6ea1acf6c061232d20a78102 | 2026-10-01T14:02:12Z | +| 同步前验收 | bc8fef76bb8cec7b6ea1acf6c061232d20a78102 | 5ed3649b42679d1a75cbbb8c14d615bd141ac4eb | 2026-10-01T14:13:39Z | +| 合入前同步 | bc8fef76bb8cec7b6ea1acf6c061232d20a78102 | 53f8a059bdba71a515e9c978c43c8b97a27f15bb | 2026-10-01T14:50:18Z | + +## 结果与验证 + +- 结果:六个 `agent-sub-*.md` 写入 tools、model、maxTurns,只从内置库读取。`SubLLMRunner` 改为带工具的内核子循环,深度为 1,父会话收到摘要和已确认工件。子 run 消息不进入 `History()`,`ListMessages` 仍保留。Backend `5051a06`。Dev 只推进 `modules/backend` 到该提交(`5ed3649`)。三处编译用 agent-native 仍为 `a34689c`(Dev `deps/agent-native`、`deps/agent-squad/deps/agent-native`、backend `deps/agent-native`)。 +- 验证:见下方三段输出。`make test` 退出码 0(boundaries、core、backend、frontend vitest 51、ui vitest 71、agent-command)。 +- 影响与剩余项:小队步骤改为最多 12 轮的轻量子循环,不含执行类工具。子代理不挂终轮 Stop 检查。用户不能改工具白名单。Backend PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/45 与 Dev PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/140 均未合入。 + +## 真实对话核对 + +服务 `p3a`(`scripts/svc.sh p3a deploy --from dev@f823118`,http://127.0.0.1:8934,数据从 dev 复制)。未改代码。 + +- explore(`cnv_feb01f134edd`):子 run `run_afe7397a04c6` 调用了 `knowledge_search`、`tavily_search`、`web_search`。父回复只有 `delegate_task` 的摘要。下一轮追问工具名,模型回答记录里没有这些工具名;`ListMessages` 仍保留子 run 消息。 +- writer(`cnv_73fdad281472`):子 run 调用了 `run_python` 并写了 `p3a-check.md`。父回复钉上了 `art_e7734e155382` 等工件。终轮检查给出「本轮回复未通过终轮检查」,父模型在登记后又反复改文件。 +- 确认卡(`cnv_443b8b5bcae7`,画像 `Confirm: ["knowledge_search"]`):卡片 `hitl_85bc6a141b8e` 挂在子 run `run_a2a874a6ab4c`。收件箱显示「执行工具 knowledge_search?」和「执行 / 取消」。批准后子代理继续检索并完成。 +- 小队(`cnv_bac0acb41e71`):四个步骤都是子代理工具循环,工具属于 general(`write_artifact`、`quality_review`,没有 `run_python`)。leader 写出 `output.md`(`art_0af18d24d11a`)。父 run 随后因轮次上限 16 失败,发生在质检打回后的重排,不是子代理运行时错误。 + +Tavily 返回 HTTP 402,是账户额度,不是这次的代码问题。 + +### precheck + +``` +[verdict] READY +head=bc8fef76bb,origin/main 同步,树干净 +必读 core/baseline.md、workflows/delivery.md §1 +checked_at=2026-10-01T14:01Z +``` + +### task-sync + +``` +Already up to date. +[synced] sync_base=bc8fef76bb tested_head=5ed3649b42 checked_at=2026-10-01T14:13:39Z +[next] 跑正式验收(make test 等),证据写入任务卡 +``` + +### make test + +``` +bash scripts/lint-boundaries.sh +boundaries ok +cd modules/core && go test ./... +ok agent-system-core 0.002s +cd modules/backend && go test ./... +(各包 ok,含 internal/prompts、internal/runtime、internal/runmgr、internal/server) +cd modules/frontend && npm ci && npx vitest run + Test Files 9 passed (9) + Tests 51 passed (51) +cd modules/ui && npm ci && npx tsc --noEmit && npx vitest run + Test Files 11 passed (11) + Tests 71 passed (71) +cd deps/agent-command && go vet ./... && go test -count=1 ./... +ok agent-command 0.002s +ok agent-command/conformance 0.001s +``` + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 5096a052dcaef7ee08a3251ec50a47bf7f066618(PR #140)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin backend to the depth-one subagent loop' (#140) from feature/agent-harness-p3 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-agent-harness-p3b.md b/.task/archive/feature-agent-harness-p3b.md new file mode 100644 index 00000000..9724f1c6 --- /dev/null +++ b/.task/archive/feature-agent-harness-p3b.md @@ -0,0 +1,39 @@ +# feature/agent-harness-p3b 任务卡 + +任务主记录:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/142 ;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= fdd311c8c029f3e8a7b47437d9695691bc125e9e +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-harness-p3b(worktree);分支:feature/agent-harness-p3b +- 授权与交付终点:实现 P3b(跨 run 后台子代理与合并通知、评审流水线、小队角色映射、用户可覆盖 tools/model/maxTurns)。允许改 Core、Backend、Frontend、UI,并在各自 `feature/agent-harness-p3b` 上提 PR;Dev 仓推进 `modules/core`、`modules/backend`、`modules/frontend`、`modules/ui` 并提 PR。未授权:合入 main、改 agent-native、改 agent-squad 契约。 +- 启动自检(2026-10-01T14:51Z):`make precheck` verdict READY。head=fdd311c8c0,origin/main 同步,树干净。必读 core/baseline.md、workflows/delivery.md §1 已读。 +- 裁定:后台通知只存在内存里,服务重启后在途子代理标为 interrupted,未投递的通知丢失。每个会话最多同时 3 个后台子代理,超出时工具报错。用户覆盖只走现有 `POST /api/prompts`,不新增前端编辑器;覆盖不能加入 `delegate_task`、`squad_orchestrate`、`review_findings`,以保持深度为 1。 + +## 目标与非目标 + +- 目标:`delegate_task` 可后台运行,完成后自动发起一次父回合,多条通知合并成一条 system 消息。`review_findings` 并行找问题、逐条验证、丢掉未验证的再汇总。小队步骤按角色映射到子代理 profile。`PromptModule` 增加 tools、model、maxTurns,用户行可以覆盖内置 spec。 +- 非目标:不改内核与小队仓契约。不新增提示词编辑界面。通知不落库。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | fdd311c8c029f3e8a7b47437d9695691bc125e9e | fdd311c8c029f3e8a7b47437d9695691bc125e9e | 2026-10-01T14:52:39Z | +| 同步前验收 | fdd311c8c029f3e8a7b47437d9695691bc125e9e | 1bc9954e40453f3476ef3856d50c085b83b6408d | 2026-10-01T15:39:25Z | +| 合入前同步 | fdd311c8c029f3e8a7b47437d9695691bc125e9e | d05a73872c938aaa3d46d50309d0994276d0e0e8 | 2026-10-01T15:51:28Z | + +## 结果与验证 + +- 结果:四个模块都在 `feature/agent-harness-p3b`。Core `9b8cf79` 给 PromptModule 增加 tools、model、maxTurns。Backend `46ce1b2` 做覆盖链、小队角色映射、后台子代理和评审。Frontend `f718095` 让后台子代理不再挡住发送,并把 system 消息画成通知行。UI `bd3baff` 同步契约。Dev `6430738` 推进这四个指针。agent-native 仍是 `a34689c`。 +- 验证:`make test` 通过(boundaries ok;core ok;backend 各包 ok;frontend vitest 53;ui vitest 71;agent-command ok)。 +- 真实对话:服务 `p3b`(`scripts/svc.sh p3b deploy --from local`,http://127.0.0.1:8841,数据从 dev 复制)。 + - 后台(`cnv_0aab84f51c8c`、`cnv_2a3ce768bb00`):子 run 在父 run 结束前完成,通知先排队。父 run 释放槽位后出现一条 `` system 消息,并自动开始新的父回合。没有用户再发消息。 + - 评审(`cnv_a2e5962befdc`):两个审查子代理加三个核实子代理。父回复保留化学式和奥运会年份问题,并写明「已丢弃 0 条未验证」。 +- 影响与剩余项:通知不持久。小队 writer 步骤会用到 writer profile。用户覆盖没有界面。合入不在本次授权内。五个 PR 都未合入:Core #15、Backend #46、Frontend #32、UI #26、Dev #142。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge ec4614322eaded96ee13f576992f016b47648200(PR #142)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin P3b background subagents, review, and profile overrides' (#142) from feature/agent-harness-p3b into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-agent-harness-p4.md b/.task/archive/feature-agent-harness-p4.md new file mode 100644 index 00000000..336e46c3 --- /dev/null +++ b/.task/archive/feature-agent-harness-p4.md @@ -0,0 +1,35 @@ +# feature/agent-harness-p4 任务卡 + +任务主记录:PR #144 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/144(merge 3ba104c721);状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 959179f88fafa06daeab121929112069d34e8419 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-harness-p4(worktree);分支:feature/agent-harness-p4 +- 授权与交付终点:实现 P4 意图到工作流。允许改 Core、Backend、Frontend、UI、Documents,并在各自 `feature/agent-harness-p4` 上提 PR;Dev 仓推进 `modules/core`、`modules/backend`、`modules/frontend`、`modules/ui`、`modules/documents` 与 `plugins/example` 并提 PR。终点是六个 PR 已开、不合入。未授权:合入 main、改 agent-native、改 agent-squad 契约、动 `dev` 服务。 +- 启动自检(2026-10-01T15:52Z):`make precheck` verdict READY。head=959179f88f,origin/main 同步,树干净。必读 core/baseline.md、workflows/delivery.md §1 已读。 +- 裁定:路由先命令总线,再绑定工作流,最后才是普通回合。工作流启动时拷贝一份定义,插件卸载不影响已经在跑的工作流。声明式工作流最多 20 步;模型生成的最多 8 步,不能含 `script`,执行前必须用户确认。critic 每步最多重试 3 次、缺省 1 次,整个工作流最多重试 6 次。脚本最多回调 50 次,单行不超过 1MB,超时缺省 600s、最长 1800s(墙钟,含等待 HITL 和子代理)。脚本与 `run_python` 相同,以当前用户身份运行,工作目录为会话沙箱,没有网络或文件系统隔离。回调一律经过 `runCtx.ExecuteTool`,不能调用 `run_python`、`run_shell`、`run_workflow` 和派发类工具。模型写的脚本运行前必须确认;插件自带的脚本不需要。开关 `runtime.workflowScripts` 缺省关闭。critic 无法解析按不通过处理。小队入口不提供 `run_workflow`。 + +## 目标与非目标 + +- 目标:`WorkflowDef` 有执行器。意图命中后接到绑定的工作流。critic 按步骤打回,每步和整条工作流都有上限。同时支持模型生成步骤和沙箱脚本两种动态工作流。 +- 非目标:不新增工作流界面和事件。Frontend 与 UI 只同步契约。不改内核与小队仓契约。不合入 main。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 959179f88fafa06daeab121929112069d34e8419 | 959179f88fafa06daeab121929112069d34e8419 | 2026-10-01T15:53:54Z | +| 同步前验收 | 959179f88fafa06daeab121929112069d34e8419 | 5f872f3b7f165c2a6cbef09bbcaa711f5bdf723c | 2026-10-01T16:38:23Z | + +## 结果与验证 + +- 结果:Core `f93f473` 给步骤加上 Agent、Script、Critic,kind 增加 script。Backend `4b4be2b` 注册工作流、按意图启动、执行六类步骤、确认后跑模型规划、以及 fd 3/fd 4 脚本宿主。Frontend `7d796ee` 与 UI `22666a0` 只同步了契约。Documents `974db6a` 写入 P4 裁定。Dev `5f872f3` 推进这五个模块,并给示例插件加上 `demo.brief` 与 `demo.script`。 +- 验证:启动时 `make precheck` 为 READY,head `959179f88f`(2026-10-01T15:52Z)。`make task-sync` 记录 sync_base `959179f88f`、tested_head `5f872f3`、checked_at 2026-10-01T16:38:23Z。随后在该 head 上 `make test` 通过:边界检查、core、backend、frontend vitest 53、UI tsc 与 vitest 71、agent-command。三处 agent-native 仍是 `a34689c`。p4 服务(127.0.0.1:8929,数据从 dev 备份,未改 dev)核对了三项:会话 `cnv_e3f0cf85f48d` 中「写一份简报」先问「主题是什么?」,critic 打回一次并留下丢弃理由,重跑后完成,工件 `art_76f9b51b4e27`,收件箱有「简报好了」。会话 `cnv_ccba204decb3` 中 `run_workflow` 的 goal 先请用户确认计划,确认后执行完成。打开 `runtime.workflowScripts` 后,会话 `cnv_adadae794ae2` 跑插件脚本 `demo.script`,脚本问「要记下来吗?」,确认后产出 `demo-script.md`(`art_13fe6947ef6e`)。 +- 影响与剩余项:六个 PR 不合入。核对用的 p4 服务在收尾时删除。脚本没有沙箱隔离,靠开关、确认和回调白名单。墙钟超时包含等待人工的时间。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 3ba104c721013f63be249e2f810376d3d8b26ee3(PR #144)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Add intent-to-workflow execution' (#144) from feature/agent-harness-p4 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-base-extension-roadmap.md b/.task/archive/feature-base-extension-roadmap.md new file mode 100644 index 00000000..aad0cd71 --- /dev/null +++ b/.task/archive/feature-base-extension-roadmap.md @@ -0,0 +1,34 @@ +# feature/base-extension-roadmap 任务卡 + +任务主记录:PR #132 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/132(merge db9c469047) ;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= f8fefa0f888e8f5fd5207c9e97099e59935ff69b +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-base-extension-roadmap(worktree);分支:feature/base-extension-roadmap +- 授权与交付终点:在本 worktree 落地路线图提案与基座实现,并在各子仓与父仓本地提交。不推送、不打版本 tag、不新建下游远程仓。 + +## 目标与非目标 + +- 目标:公开扩展面(`pkg/extension`)、插件契约 v2 四种形态、生命周期治理、质量回路与工程基座接线;下游薄切片只 import 公开 SDK。 +- 非目标:打 `v0.2.0-experimental`、发布 npm、改 Go module path、把目标系统(两树一网)做进基座、容器编排、旧资产导入。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | f8fefa0f888e8f5fd5207c9e97099e59935ff69b | f8fefa0f888e8f5fd5207c9e97099e59935ff69b | 2026-10-01T10:10:35Z | +| 同步前验收 | 26dfea7ed62575097f14fedf1b7713a77dedb66f | 6d496139b45bbe0d32818e56ed6c5fbba649d777 | 2026-10-01T10:39:24Z | + +## 结果与验证 + +- 结果:documents 三份提案与开发指南;core manifest v2;backend 声明/sidecar/进程内/Host API/迁移 v13/质量回路/审计与命令对拍;ui SDK 与 frontend ESM 加载;examples 与 `make plugin-new`、`make test-boundaries`。 +- 验证:`cd modules/core && go test ./...`;`cd modules/backend && go test ./...`;`bash scripts/lint-boundaries.sh`;`cd examples/downstream-rdm && go test .`;UI `tsc`+vitest 71;frontend vitest。 +- 影响与剩余项:apiVersion `2.0-experimental`。版本 tag 与 npm 发布命令留在兼容提案,由用户确认后执行。下游远程仓由用户另建。Playwright 对拍文件在 `modules/frontend/e2e/`,未安装 `@playwright/test`,不进 vitest。合入顺序:Core #14、Documents #31、UI #25、Frontend #31,然后 Backend #41,最后 Dev #132。子仓不要 squash,否则 Backend / Dev 的 gitlink 会指向不存在的提交。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge db9c469047(PR #132)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Pin the extension roadmap and downstream spike +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 + diff --git a/.task/archive/feature-final-reply-compose.md b/.task/archive/feature-final-reply-compose.md new file mode 100644 index 00000000..54412779 --- /dev/null +++ b/.task/archive/feature-final-reply-compose.md @@ -0,0 +1,34 @@ +# feature/final-reply-compose 任务卡 + +任务主记录:PR #149 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/149(merge d825067a57);状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= ad17b78fda8ffe206d2d0847dc49c361427ad5d2 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-final-reply-compose(worktree);分支:feature/final-reply-compose +- 授权与交付终点:实现终轮独立收尾并提 PR。合入由所有者执行。不改 agent-native。 + +## 目标与非目标 + +- 目标:终轮检查不再以用户口吻打回;用过工具的回合结束后,主模型另写一段直接回答用户的回复;交付物卡片在这轮结束、最终回复出现之后才显示;检查结果在过程区单独一行。 +- 非目标:不改回传给模型的工具结果截断、上下文裁剪、重复调用提醒和日 token 预算。纯对话回合不经过收尾。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | ad17b78fda8ffe206d2d0847dc49c361427ad5d2 | ad17b78fda8ffe206d2d0847dc49c361427ad5d2 | 2026-10-02T13:23:29Z | +| 同步前验收 | ad17b78fda8ffe206d2d0847dc49c361427ad5d2 | c7932dd0a50732069e197bb95fff08ebb8669afe | 2026-10-02T13:43:37Z | +| 同步前验收 | ad17b78fda8ffe206d2d0847dc49c361427ad5d2 | 5072554b097043c8918da063f32f3867f3fcbcd7 | 2026-10-02T14:07:55Z | + +## 结果与验证 + +- 结果:Core 增加 finalizing 阶段、check 部件和 run.check。验证打回改为 system-reminder,证据按时间编号并以最后一次检查为准。runtime.composeFinal 默认开启,收尾失败时回落到草稿。前端运行中不投影交付物卡片,整理回复中作为阶段文案。收尾输出会去掉 think 块、工件编号和字节数。 +- 验证:make test 通过(2026-10-02T14:06Z,worktree,frontend 13 文件 68 项、ui 11 文件 79 项)。浏览器复现 run_102f0c09ff32:阶段文案为「整理回复中」;过程区有「终轮检查通过」;最终回复单独成段,没有「您提到」、think 块、工件编号或字节数;版本发布.docx 卡片出现在这段回复之后。 +- 影响与剩余项:task-sync 按文件名把同步行写进第一张卡片,本提交已改回本卡。合入顺序:Core #18,然后 Backend #49、UI #30、Frontend #36,最后 Dev #149。合入由所有者执行。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge d825067a5771c77cc1f9a7edc41613015bd5784b(PR #149)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin the final-reply compose across core, backend, and UI' (#149) from feature/final-reply-compose into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-s4-shell-overhaul.md b/.task/archive/feature-s4-shell-overhaul.md new file mode 100644 index 00000000..da9e556e --- /dev/null +++ b/.task/archive/feature-s4-shell-overhaul.md @@ -0,0 +1,33 @@ +# feature/s4-shell-overhaul 任务卡 + +任务主记录:PR #145 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/145(merge 31639b1e48);状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 959179f88fafa06daeab121929112069d34e8419 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-s4-shell-overhaul(worktree);分支:feature/s4-shell-overhaul +- 授权与交付终点:按 S4 目标形态改造壳层与交互,提交 UI / Frontend / Dev 三仓 PR。不改后端与 Core 契约,不合入。 + +## 目标与非目标 + +- 目标:顶栏(项目 + 阶段徽章 + 待处理铃铛)、以项目为中心的左栏与体系工具、右栏全部/待处理筛选与收纳、对话整列拖拽与内联确认卡折叠/阻断、深读弹层的插件槽位、墨绿可选主题。 +- 非目标:不移植演示脚本与假的追溯/需求/变更/文档/记忆数据;不改后端;领域弹层只在 `/api/workspaces` 有声明时出现。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 959179f88fafa06daeab121929112069d34e8419 | 959179f88fafa06daeab121929112069d34e8419 | 2026-10-01T22:59:58Z | +| 验收前 | 959179f88fafa06daeab121929112069d34e8419 | 6705d521f4 | 2026-10-01T23:33:48Z | + +## 结果与验证 + +- 结果:壳层改为顶栏 + 项目左栏 + 卡片流右栏;内联确认卡支持阻断与决议后折叠;墨绿为可选主题。领域弹层仍只在工作区声明存在时出现。 +- 验证:`make test` 通过(boundaries、core、backend、frontend 61、ui 79、agent-command)。mock 浏览器核对了主界面、待处理筛选、阻断卡、折叠行与墨绿主题。 +- 影响与剩余项:命令确认卡的动作响应仍是决议前快照,前端在 confirm/cancel 后补拉一次卡片列表。未改后端。阶段徽章只在 `settings.stage` 有值时显示。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 31639b1e482475be81cb82b720cf35dccf07874b(PR #145)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Advance UI and frontend for the S4 shell overhaul' (#145) from feature/s4-shell-overhaul into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/archive/feature-stream-display-overhaul.md b/.task/archive/feature-stream-display-overhaul.md new file mode 100644 index 00000000..5b420b83 --- /dev/null +++ b/.task/archive/feature-stream-display-overhaul.md @@ -0,0 +1,32 @@ +# feature/stream-display-overhaul 任务卡 + +任务主记录:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/147 ;状态:已完成(回填);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 08ef71661d4d65d13471978185a7afb4636b3f34 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-stream-display-overhaul(worktree);分支:feature/stream-display-overhaul +- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> + +## 目标与非目标 + +- 目标:工具从开始编写参数起就可见;过程与最终回复分区,最终回复不被折进「已工作」;取消轮次、工具次数、输出长度、小队超时和执行超时硬上限。 +- 非目标:不改回传给模型的工具结果截断、上下文裁剪、重复调用提醒和日 token 预算。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 08ef71661d4d65d13471978185a7afb4636b3f34 | 08ef71661d4d65d13471978185a7afb4636b3f34 | 2026-10-02T02:03:12Z | + +## 结果与验证 + +- 结果:新增 tool.call.delta / tool.output,tool.result 带 durationMs。前端工具条目走编写中、运行中、完成。失败或无终轮正文时把最后一段解说提到回复区。同轮错误并入该条助手消息,同名交付物只留最新一张。默认画像、子代理、小队和执行工具不再设硬上限。 +- 验证:worktree 内 make test 通过(boundaries、core、backend、frontend vitest 66、ui vitest 79、agent-command)。浏览器 mock:过程块收成「已工作 1 秒 · 1 次工具调用」,回复留在外面;展开可见「思考」「搜索 · 1 次」;#error 显示「已停止」和「继续执行」;上翻后出现「回到底部」。真实模型超长 run_python 未在本机复现。 +- 影响与剩余项:Anthropic 未配置 max_tokens 时仍须传 128000(协议要求)。小队 StepTimeout 用 -1 表示不限。合入顺序:Core、Agent-Native,然后 Backend、UI、Frontend,最后 Dev gitlink。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge bb4c167c71e23285bdf9fc0c44783d42973d52bb(PR #147)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin streaming display changes across the five modules' (#147) from feature/stream-display-overhaul into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-agent-professional-deliverables.md b/.task/feature-agent-professional-deliverables.md index c92bd890..6b91f686 100644 --- a/.task/feature-agent-professional-deliverables.md +++ b/.task/feature-agent-professional-deliverables.md @@ -28,3 +28,7 @@ - 影响与剩余项:Backend PR #38 已合入(merge 2079b2dfa851bd4cbe8f399a015126c842c441ec)。本分支推进 gitlink 到该提交。样例文档仍留在主检出 .tmp,不入库。工件卡片上的“设为默认模板”按钮仍不在本次范围。 | 同步前验收 | 6f7f4a0e7858c70261d7bbeb179f5eb59303f956 | 2e8b9face3542844319f4a545768b6cf04c126a5 | 2026-10-01T08:19:31Z | | 同步前验收 | 6f7f4a0e7858c70261d7bbeb179f5eb59303f956 | f41ad95b1c5c9d2c415a12a64ac1f1551cd7b6af | 2026-10-01T08:20:22Z | +| 同步前验收 | 959179f88fafa06daeab121929112069d34e8419 | 6705d521f441b7bb558f6cd9c082f445cac192c3 | 2026-10-01T23:33:48Z | +| 同步前验收 | 959179f88fafa06daeab121929112069d34e8419 | 0f3ea6c8b545923a7dfaf46d938f682f0c879246 | 2026-10-01T23:48:16Z | +| 同步前验收 | 08ef71661d4d65d13471978185a7afb4636b3f34 | 83881c13206d97a8b5ee69cd465c621a337a70fb | 2026-10-02T02:36:24Z | +| 同步前验收 | 08ef71661d4d65d13471978185a7afb4636b3f34 | f43aec709d5e72dffd421fe157545507bd7d425e | 2026-10-02T05:03:41Z | diff --git a/.task/feature-native-squad-full-upgrade.md b/.task/feature-native-squad-full-upgrade.md new file mode 100644 index 00000000..cebc8c69 --- /dev/null +++ b/.task/feature-native-squad-full-upgrade.md @@ -0,0 +1,25 @@ +# feature/native-squad-full-upgrade 任务卡 + +任务主记录:;状态:进行中;owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= f8fefa0f888e8f5fd5207c9e97099e59935ff69b +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-native-squad-full-upgrade(worktree);分支:feature/native-squad-full-upgrade +- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> + +## 目标与非目标 + +<预期结果、受影响入口/模块/契约;明确不做什么。> + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | f8fefa0f888e8f5fd5207c9e97099e59935ff69b | f8fefa0f888e8f5fd5207c9e97099e59935ff69b | 2026-10-01T10:05:00Z | + +## 结果与验证(完成后填写) + +- 结果: +- 验证: +- 影响与剩余项: diff --git a/DESIGN.md b/DESIGN.md index 700169d0..50f9ade2 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -56,6 +56,21 @@ Agent-System-Dev 是桌面优先、Web 兼容的 AI 工作台。界面应**冷 - 语义:`--ok #46bf72`、`--warn #ff8a30`、`--err #ff5c5c`(浅色 `#1e8a3e/#e07b00/#e03131`)。 语义色只表语义;确认等待类统一绿色语言,不用红/橙装饰。 +### 2.5 墨绿主题(可选,`data-theme='molv'`) + +暖纸白工作区、深海军蓝左栏与顶栏、翠绿强调。只覆盖表面与语义色;字号标尺、圆角、间距沿用 §3–§5,不另起一套。左栏与顶栏消费 `--bg-sidebar` / `--text-sidebar*`(深色与浅色下别名到面板与正文,墨绿下翻成海军蓝)。 + +| 令牌 | 墨绿 | 用途 | +|---|---|---| +| `--bg-inset` | `#e0e0db` | 窗口间隙 | +| `--bg` | `#f2f2f0` | 对话主区 | +| `--bg-panel` | `#fbfbfa` | 右栏等面板 | +| `--bg-sidebar` | `#082d4f` | 左栏、顶栏 | +| `--text` | `#082d4f` | 主读文本 | +| `--text-sidebar` | `#e9f0f6` | 左栏与顶栏文字 | +| `--accent` | `#165f49` | 交互强调(翠绿) | +| `--primary` / `--primary-foreground` | `#082d4f` / `#f3f8f5` | 主按钮 | + ## 3. 字号标尺(唯一字号体系) 全局唯一可调变量 `--ui-font-size`(默认 14px),派生: @@ -175,10 +190,15 @@ Primary(`--primary` 反色)、Ghost(透明,hover 出表面)、Danger 助手消息在运行中按时间线逐行展开,终轮结束后折成一行。 -- 运行中始终展开:思考行显示「思考中」并带 `mk-sweep`;对用户的解说按正文样式直接显示; - 同类工具合并成一行(查阅、搜索、已运行命令、写入、卡片、委派、计划)。 -- 终轮(没有后续工具调用)结束后,过程段收进 Collapsible,触发行为「已工作 X 分 Y 秒」。 - 最终回复留在折叠行下面。不在每一轮 `responding` 时来回折叠。 +- 运行中过程块展开,块头是中文阶段(思考中、正在编写、正在运行并计时、回复中、整理回复中),带 `mk-sweep`。 + 对用户的解说按正文样式直接显示。查阅和搜索合并成一行;执行、写入、委派每次一条 ToolBlock: + 编写参数时显示「编写中」和脚本尾部,运行时显示计时和输出尾部,结束后可展开看完整参数与结果。 + 终轮检查在过程区单独一行(通过,或未通过及原因),不写进给用户的回复。 +- 终轮结束后,过程段收进 Collapsible,触发行为「已工作 X 分 Y 秒 · N 次工具调用 · N 个文件」。 + 用户在运行中手动折过的,结束后沿用这次选择。最终回复(终轮正文、交付物、错误)留在折叠行下面; + 交付物卡片等到最终回复出来、这一轮结束后才出现,工作过程中不挂预览条。 + 若这次没有终轮正文,把最后一段解说提到折叠行下面,不把回复藏进过程里。 + 不在每一轮 `responding` 时来回折叠。同一轮同名工件只留最新一张,并注明更新次数。 - 文件卡片:图标、名称、「类型 · 大小」、右侧「预览」。正文里的 `art_` 编号若对得上工件,在正文后补一张卡片; 对不上则显示「未找到该文件」,不伪装成可打开的文件。 - 标签条用 `@ui` `TabStrip`:点击激活、× 关闭、中键关闭,溢出横向滚动。只消费令牌与 `mk-*`。 diff --git a/Makefile b/Makefile index f59eb58d..2f1e7325 100644 --- a/Makefile +++ b/Makefile @@ -96,7 +96,14 @@ test-ui: contracts test-agentcmd: cd deps/agent-command && go vet ./... && go test -count=1 ./... -test: test-core test-backend test-frontend test-ui test-agentcmd +test-boundaries: + bash scripts/lint-boundaries.sh + +plugin-new: + @test -n "$(NAME)" || (echo "用法:make plugin-new NAME="; exit 2) + bash scripts/plugin-new.sh "$(NAME)" + +test: test-boundaries test-core test-backend test-frontend test-ui test-agentcmd # 运行演示(mock 模式):单二进制 + 示例插件 + 嵌入式存储,浏览器 http://127.0.0.1:8787 # 环境服务管理(scripts/svc.sh):deploy = 停旧 → 构建 → 启动;dev/prod 相互隔离。 diff --git a/deps/agent-native b/deps/agent-native index cfc840c1..c6d867cd 160000 --- a/deps/agent-native +++ b/deps/agent-native @@ -1 +1 @@ -Subproject commit cfc840c11d1e85b8f780dbb4030e9f62f670fa3b +Subproject commit c6d867cde7d87696feaf3073f097ca15b0145273 diff --git a/deps/agent-squad b/deps/agent-squad index d38f838d..590fd86f 160000 --- a/deps/agent-squad +++ b/deps/agent-squad @@ -1 +1 @@ -Subproject commit d38f838dbca0587470050b42afb91ecc1df49321 +Subproject commit 590fd86f4c8bfada0ec76efbfb57133c61607bd6 diff --git a/examples/downstream-rdm/README.md b/examples/downstream-rdm/README.md new file mode 100644 index 00000000..cb3f4347 --- /dev/null +++ b/examples/downstream-rdm/README.md @@ -0,0 +1,9 @@ +# 下游薄切片 + +本目录模拟独立仓库 `Agent-System-Plugin-RDM`。它只 import `agent-system-backend/pkg/extension`,不改基座。 + +把本目录搬到新仓库时,由 owner 创建 Git 仓库。`replace` 改成基座检出路径或已发布版本。需要拉起完整二进制时再空白导入 `agent-system-backend/pkg/extension/link`,并复制基座 `go.mod` 的 replace(下游模块不会继承它们)。 + +``` +go test . +``` diff --git a/examples/downstream-rdm/go.mod b/examples/downstream-rdm/go.mod new file mode 100644 index 00000000..4865a243 --- /dev/null +++ b/examples/downstream-rdm/go.mod @@ -0,0 +1,7 @@ +module example.com/agent-system-plugin-rdm + +go 1.27 + +require agent-system-backend v0.0.0 + +replace agent-system-backend => ../../modules/backend diff --git a/examples/downstream-rdm/plugin.go b/examples/downstream-rdm/plugin.go new file mode 100644 index 00000000..db286a89 --- /dev/null +++ b/examples/downstream-rdm/plugin.go @@ -0,0 +1,12 @@ +package rdm + +import "agent-system-backend/pkg/extension" + +func init() { + extension.RegisterCompiled(extension.InProc{ + ID: "rdm", + Register: func(reg extension.Registry) error { + return reg.AddSkill("rdm-note", "# 研发记忆\n\n下游切片技能,不修改基座。\n") + }, + }) +} diff --git a/examples/downstream-rdm/plugin_test.go b/examples/downstream-rdm/plugin_test.go new file mode 100644 index 00000000..a76969de --- /dev/null +++ b/examples/downstream-rdm/plugin_test.go @@ -0,0 +1,19 @@ +package rdm + +import ( + "testing" + + "agent-system-backend/pkg/extension" +) + +func TestCompiledSkillRegistration(t *testing.T) { + extension.ResetCompiled() + extension.RegisterCompiled(extension.InProc{ID: "rdm"}) + got := extension.Compiled() + if len(got) != 1 || got[0].ID != "rdm" { + t.Fatalf("%+v", got) + } + if extension.SurfaceVersion == "" { + t.Fatal("surface version required") + } +} diff --git a/examples/page-demo/page.mjs b/examples/page-demo/page.mjs new file mode 100644 index 00000000..04643e0d --- /dev/null +++ b/examples/page-demo/page.mjs @@ -0,0 +1,8 @@ +export function mount(el, bridge) { + const btn = document.createElement('button') + btn.type = 'button' + btn.textContent = '走命令' + btn.addEventListener('click', () => bridge.execCommand('builtin.help', {})) + el.replaceChildren(btn) +} +export function unmount() {} diff --git a/examples/plugins/decl-demo/channels/feishu.json b/examples/plugins/decl-demo/channels/feishu.json new file mode 100644 index 00000000..fc349275 --- /dev/null +++ b/examples/plugins/decl-demo/channels/feishu.json @@ -0,0 +1 @@ +{ "id": "feishu", "kind": "feishu", "title": "飞书" } diff --git a/examples/plugins/decl-demo/knowledge/notes.json b/examples/plugins/decl-demo/knowledge/notes.json new file mode 100644 index 00000000..777c970e --- /dev/null +++ b/examples/plugins/decl-demo/knowledge/notes.json @@ -0,0 +1 @@ +{ "id": "notes", "title": "笔记", "description": "数据集声明,检索引擎在基座" } diff --git a/examples/plugins/decl-demo/page.mjs b/examples/plugins/decl-demo/page.mjs new file mode 100644 index 00000000..c2d8aca8 --- /dev/null +++ b/examples/plugins/decl-demo/page.mjs @@ -0,0 +1,5 @@ +export function mount(el, bridge) { + el.textContent = '声明示例页面' + el.dataset.bridge = bridge ? 'ready' : '' +} +export function unmount() {} diff --git a/examples/plugins/decl-demo/pages/home.json b/examples/plugins/decl-demo/pages/home.json new file mode 100644 index 00000000..a245c840 --- /dev/null +++ b/examples/plugins/decl-demo/pages/home.json @@ -0,0 +1 @@ +{ "id": "home", "title": "声明示例", "module": "./page.mjs" } diff --git a/examples/plugins/decl-demo/plugin.json b/examples/plugins/decl-demo/plugin.json new file mode 100644 index 00000000..60ecf7a5 --- /dev/null +++ b/examples/plugins/decl-demo/plugin.json @@ -0,0 +1,13 @@ +{ + "id": "decl-demo", + "name": "声明示例", + "version": "0.1.0", + "apiVersion": "2.0-experimental", + "requires": { "network": ["api.example.com"] }, + "provides": { + "skills": ["welcome"], + "pages": ["home"], + "channels": ["feishu"], + "knowledge": ["notes"] + } +} diff --git a/examples/plugins/decl-demo/skills/welcome.md b/examples/plugins/decl-demo/skills/welcome.md new file mode 100644 index 00000000..977c7261 --- /dev/null +++ b/examples/plugins/decl-demo/skills/welcome.md @@ -0,0 +1,3 @@ +# welcome + +声明式技能示例。描述任务步骤,不携带可执行代码。 diff --git a/examples/sidecar-demo/main.go b/examples/sidecar-demo/main.go new file mode 100644 index 00000000..74440bf1 --- /dev/null +++ b/examples/sidecar-demo/main.go @@ -0,0 +1,17 @@ +// sidecar 示例:只通过 Host API 客户端说话,不导入 internal。 +package main + +import ( + "context" + "log" + "os" + + "agent-system-backend/pkg/extension" +) + +func main() { + c := extension.NewHostClient(os.Getenv("AGENT_HOST_API"), os.Getenv("AGENT_HOST_TOKEN"), os.Getenv("AGENT_PLUGIN_ID"), "local") + if err := c.Audit(context.Background(), "sidecar.ready", os.Getenv("AGENT_PLUGIN_ID"), []byte(`{}`)); err != nil { + log.Fatal(err) + } +} diff --git a/modules/backend b/modules/backend index 268f4a9a..46d5f7b6 160000 --- a/modules/backend +++ b/modules/backend @@ -1 +1 @@ -Subproject commit 268f4a9abf9fdf23de487cb7a2edbfbaa60ff6af +Subproject commit 46d5f7b66830167ccf00b5d6d9cd0e73ad62e47d diff --git a/modules/core b/modules/core index d4375300..7c66075e 160000 --- a/modules/core +++ b/modules/core @@ -1 +1 @@ -Subproject commit d4375300cde71320cdd2a012304603efe9eb5cf9 +Subproject commit 7c66075ee9caa9f990d6d6ad7619f7af8d9040e8 diff --git a/modules/documents b/modules/documents index 8ee5d5c4..acd6f01c 160000 --- a/modules/documents +++ b/modules/documents @@ -1 +1 @@ -Subproject commit 8ee5d5c467c364664d5c450976c51dd453a45e37 +Subproject commit acd6f01c402804e5cb797a193481dbed98dd5214 diff --git a/modules/frontend b/modules/frontend index 0ed8ad32..794c3e16 160000 --- a/modules/frontend +++ b/modules/frontend @@ -1 +1 @@ -Subproject commit 0ed8ad32f1614e4425c17616573ede582794a426 +Subproject commit 794c3e165721d374948fa5d7fde843f0c92105a1 diff --git a/modules/ui b/modules/ui index 8bfe8a89..b4a4fc1b 160000 --- a/modules/ui +++ b/modules/ui @@ -1 +1 @@ -Subproject commit 8bfe8a89dbe40d91fc9b42837270bcb29044e903 +Subproject commit b4a4fc1b5f4d9aaefe142d44aae015cc73f97ab6 diff --git a/plugins/example/intents/demo.json b/plugins/example/intents/demo.json index 370d3852..eccf1cc7 100644 --- a/plugins/example/intents/demo.json +++ b/plugins/example/intents/demo.json @@ -6,5 +6,20 @@ "description": "示例意图:命中『示例/演示』关键词(slots 声明即 HITL 该问什么;本示例无必填槽位)", "matcher": { "includes_any": ["示例", "演示"] }, "slots": [] + }, + { + "id": "demo.brief", + "domain": "demo", + "version": 1, + "description": "写一份简报。必填槽位 topic,没写就问「主题是什么?」。", + "matcher": { "includes_any": ["简报"] }, + "slots": [ + { + "key": "topic", + "required": true, + "pattern": "主题[::]\\s*(\\S+)", + "question": "主题是什么?" + } + ] } ] diff --git a/plugins/example/plugin.json b/plugins/example/plugin.json index 6b040d15..df19a2f1 100644 --- a/plugins/example/plugin.json +++ b/plugins/example/plugin.json @@ -32,6 +32,10 @@ ], "commands": [ "demo" + ], + "workflows": [ + "demo-brief", + "demo-script" ] } } diff --git a/plugins/example/workflows/demo-brief.json b/plugins/example/workflows/demo-brief.json new file mode 100644 index 00000000..f7c62945 --- /dev/null +++ b/plugins/example/workflows/demo-brief.json @@ -0,0 +1,57 @@ +{ + "id": "demo.brief", + "title": "示例简报", + "description": "命中 demo.brief 后:选篇幅、起草、落成工件、发一张结果卡,再请用户确认。", + "intentId": "demo.brief", + "steps": [ + { + "id": "length", + "title": "篇幅", + "kind": "hitl", + "hitl": { + "question": "要多长?", + "kind": "choice", + "allowFreeInput": false, + "choices": [ + {"id": "short", "label": "短", "description": "一段", "impact": "只写一段"}, + {"id": "long", "label": "长", "description": "几段", "impact": "会写得更长"} + ] + } + }, + { + "id": "draft", + "title": "起草", + "kind": "prompt", + "agent": "research", + "prompt": "写一份关于「{{slots.topic}}」的简报,篇幅:{{steps.length.output}}。", + "critic": {"criteria": "必须包含单独一行「核对标记:P4」。没有这一行就不通过,nextAction 请要求补上这一行。", "maxRetries": 1} + }, + { + "id": "save", + "title": "成稿", + "kind": "artifact", + "artifact": "demo-brief.md", + "prompt": "{{steps.draft.output}}" + }, + { + "id": "note", + "title": "收件", + "kind": "card", + "card": {"kind": "result", "title": "简报好了", "tone": "ok"} + }, + { + "id": "confirm", + "title": "确认", + "kind": "hitl", + "hitl": { + "question": "这份简报可以用吗?", + "kind": "confirm", + "allowFreeInput": false, + "choices": [ + {"id": "yes", "label": "可以用", "description": "结束", "impact": "不会再改"}, + {"id": "no", "label": "先不用", "description": "结束", "impact": "不会再改"} + ] + } + } + ] +} diff --git a/plugins/example/workflows/demo-script.json b/plugins/example/workflows/demo-script.json new file mode 100644 index 00000000..1dba4a73 --- /dev/null +++ b/plugins/example/workflows/demo-script.json @@ -0,0 +1,13 @@ +{ + "id": "demo.script", + "title": "示例脚本", + "description": "插件自带脚本。需要打开 runtime.workflowScripts。不绑定意图,用 run_workflow 启动。", + "steps": [ + { + "id": "run", + "title": "跑脚本", + "kind": "script", + "script": "workflows/scripts/demo.py" + } + ] +} diff --git a/plugins/example/workflows/scripts/demo.py b/plugins/example/workflows/scripts/demo.py new file mode 100644 index 00000000..ce23392f --- /dev/null +++ b/plugins/example/workflows/scripts/demo.py @@ -0,0 +1,6 @@ +import agentwf as wf + +now = wf.tool("time_now", {}) +answer = wf.ask("要记下来吗?", [{"id": "yes", "label": "记下", "impact": "会写入一份备忘"}]) +wf.artifact("demo-script.md", "时间 " + now + "\n选择 " + answer) +wf.step("run", "跑脚本", "done") diff --git a/scripts/lint-boundaries.sh b/scripts/lint-boundaries.sh new file mode 100755 index 00000000..e00d3e7b --- /dev/null +++ b/scripts/lint-boundaries.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# 依赖边界:公开扩展 SDK 与示例不得导入后端 internal。 +# pkg/extension/link 是唯一例外:下游空白导入它才能把 extension.Main 接到产品组合根。 +set -euo pipefail +root=$(cd "$(dirname "$0")/.." && pwd) +fail=0 + +check() { + local path="$1" + if [ -d "$path" ] && grep -R -n --include='*.go' --include='*.ts' --include='*.tsx' 'agent-system-backend/internal' "$path" >/dev/null; then + echo "boundary: $path imports agent-system-backend/internal" >&2 + grep -R -n --include='*.go' --include='*.ts' --include='*.tsx' 'agent-system-backend/internal' "$path" >&2 + fail=1 + fi +} + +sdk="$root/modules/backend/pkg/extension" +if [ -d "$sdk" ]; then + hits=$(grep -R -n --include='*.go' 'agent-system-backend/internal' "$sdk" | grep -v '/link/' || true) + if [ -n "$hits" ]; then + echo "boundary: pkg/extension imports agent-system-backend/internal" >&2 + echo "$hits" >&2 + fail=1 + fi +fi +check "$root/examples" +if [ "$fail" -ne 0 ]; then + exit 1 +fi +echo "boundaries ok" diff --git a/scripts/plugin-new.sh b/scripts/plugin-new.sh new file mode 100755 index 00000000..2526aad0 --- /dev/null +++ b/scripts/plugin-new.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# 生成声明式插件骨架:make plugin-new NAME= +set -euo pipefail +name="${1:-}" +if [ -z "$name" ]; then + echo "usage: plugin-new.sh " >&2 + exit 2 +fi +root=$(cd "$(dirname "$0")/.." && pwd) +dest="$root/examples/plugins/$name" +if [ -e "$dest" ]; then + echo "exists: $dest" >&2 + exit 1 +fi +mkdir -p "$dest/tools" "$dest/skills" "$dest/pages" +cat > "$dest/plugin.json" < "$dest/skills/welcome.md" +cat > "$dest/pages/home.json" < "$dest/page.mjs" <<'EOF' +export function mount(el, bridge) { + el.textContent = '插件页面' + el.dataset.bridge = bridge ? 'ready' : '' +} +export function unmount() {} +EOF +echo "wrote $dest"