Merge remote-tracking branch 'origin/main' into HEAD
ci / test (pull_request) Failing after 1m30s

This commit is contained in:
2026-10-03 10:23:58 +00:00
40 changed files with 771 additions and 12 deletions
+34
View File
@@ -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。
+44
View File
@@ -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。
+76
View File
@@ -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。
+84
View File
@@ -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。
@@ -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-reminder>` 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。
+35
View File
@@ -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。
@@ -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。
@@ -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。
@@ -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。
@@ -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。
@@ -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 |
@@ -0,0 +1,25 @@
# feature/native-squad-full-upgrade 任务卡
任务主记录:<PR 链接,task-finish 时填写>;状态:进行中;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 |
## 结果与验证(完成后填写)
- 结果:
- 验证:
- 影响与剩余项:
+24 -4
View File
@@ -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-*`。
+8 -1
View File
@@ -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=<id>"; 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 相互隔离。
+9
View File
@@ -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 .
```
+7
View File
@@ -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
+12
View File
@@ -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")
},
})
}
+19
View File
@@ -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")
}
}
+8
View File
@@ -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() {}
@@ -0,0 +1 @@
{ "id": "feishu", "kind": "feishu", "title": "飞书" }
@@ -0,0 +1 @@
{ "id": "notes", "title": "笔记", "description": "数据集声明,检索引擎在基座" }
+5
View File
@@ -0,0 +1,5 @@
export function mount(el, bridge) {
el.textContent = '声明示例页面'
el.dataset.bridge = bridge ? 'ready' : ''
}
export function unmount() {}
@@ -0,0 +1 @@
{ "id": "home", "title": "声明示例", "module": "./page.mjs" }
+13
View File
@@ -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"]
}
}
@@ -0,0 +1,3 @@
# welcome
声明式技能示例。描述任务步骤,不携带可执行代码。
+17
View File
@@ -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)
}
}
+15
View File
@@ -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": "主题是什么?"
}
]
}
]
+4
View File
@@ -32,6 +32,10 @@
],
"commands": [
"demo"
],
"workflows": [
"demo-brief",
"demo-script"
]
}
}
+57
View File
@@ -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": "不会再改"}
]
}
}
]
}
@@ -0,0 +1,13 @@
{
"id": "demo.script",
"title": "示例脚本",
"description": "插件自带脚本。需要打开 runtime.workflowScripts。不绑定意图,用 run_workflow 启动。",
"steps": [
{
"id": "run",
"title": "跑脚本",
"kind": "script",
"script": "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")
+30
View File
@@ -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"
+37
View File
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
# 生成声明式插件骨架:make plugin-new NAME=<id>
set -euo pipefail
name="${1:-}"
if [ -z "$name" ]; then
echo "usage: plugin-new.sh <id>" >&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" <<EOF
{
"id": "$name",
"name": "$name",
"version": "0.1.0",
"apiVersion": "2.0-experimental",
"requires": { "network": [] },
"provides": { "skills": ["welcome"], "pages": ["home"] }
}
EOF
printf '# %s\n\n描述这个技能做什么、何时使用。\n' "$name" > "$dest/skills/welcome.md"
cat > "$dest/pages/home.json" <<EOF
{ "id": "home", "title": "$name", "module": "./page.mjs" }
EOF
cat > "$dest/page.mjs" <<'EOF'
export function mount(el, bridge) {
el.textContent = '插件页面'
el.dataset.bridge = bridge ? 'ready' : ''
}
export function unmount() {}
EOF
echo "wrote $dest"