@nanmicoder/dsh-agent-teams 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -50
- package/README_ZH.md +134 -0
- package/assets/readme/hero.svg +73 -0
- package/lib/client.js +95 -95
- package/lib/index.js +2 -2
- package/lib/members.js +152 -5
- package/lib/state.js +28 -0
- package/lib/tools.js +35 -9
- package/lib/types/members.d.ts +43 -4
- package/lib/types/state.d.ts +10 -0
- package/lib/types/types.d.ts +5 -1
- package/package.json +37 -21
package/README.md
CHANGED
|
@@ -1,93 +1,134 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="right">
|
|
2
|
+
<strong>English</strong> · <a href="./README_ZH.md">简体中文</a>
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="./assets/readme/hero.svg" width="100%" alt="dsh-agent-teams turns one DeepSeek Harness session into a coordinated multi-agent team">
|
|
7
|
+
</p>
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/@nanmicoder/dsh-agent-teams"><img src="https://img.shields.io/npm/v/@nanmicoder/dsh-agent-teams.svg" alt="npm version"></a>
|
|
11
|
+
<a href="./LICENSE"><img src="https://img.shields.io/npm/l/@nanmicoder/dsh-agent-teams.svg" alt="MIT license"></a>
|
|
12
|
+
<img src="https://img.shields.io/badge/DeepSeek%20Harness-plugin-202724" alt="DeepSeek Harness plugin">
|
|
13
|
+
</p>
|
|
7
14
|
|
|
8
|
-
|
|
15
|
+
## One prompt. A working team.
|
|
9
16
|
|
|
10
|
-
|
|
17
|
+
`dsh-agent-teams` turns the current DeepSeek Harness session into a captain that can assemble durable sub-agents, split a goal into dependency-aware tasks, and coordinate work through direct messages.
|
|
11
18
|
|
|
12
|
-
|
|
19
|
+
Ask in natural language. The plugin provides the team protocol, nine coordination tools, persistent state, and a live Web UI—without requiring a separate workflow engine.
|
|
13
20
|
|
|
14
|
-
|
|
21
|
+
<p align="center">
|
|
22
|
+
<img src="./assets/ui.png" width="100%" alt="DeepSeek Harness conversation with the AgentTeams live activity panel, members, tasks, dependencies, and reports">
|
|
23
|
+
</p>
|
|
15
24
|
|
|
16
|
-
|
|
25
|
+
## Why AgentTeams?
|
|
17
26
|
|
|
18
|
-
|
|
27
|
+
| Capability | What it changes |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| **Captain-led delegation** | The current session creates the team, assigns roles, and consolidates the final result. |
|
|
30
|
+
| **Durable members** | Members are continuable DSH sub-agents that can be woken for focused follow-up turns. |
|
|
31
|
+
| **Dependency-aware tasks** | Tasks move through explicit states and cannot be claimed before their dependencies finish. |
|
|
32
|
+
| **Direct messaging** | Members send durable mailbox messages directly to teammates or the captain—no relay required. |
|
|
33
|
+
| **Live activity panel** | The Web UI shows roles, current work, unread messages, task dependencies, and archived team history. |
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
> [!NOTE]
|
|
38
|
+
> Requires an existing [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) installation.
|
|
39
|
+
|
|
40
|
+
### npm
|
|
19
41
|
|
|
20
42
|
```sh
|
|
21
43
|
dsh plugin --profile web add @nanmicoder/dsh-agent-teams
|
|
22
44
|
```
|
|
23
45
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
> **重启生效**:安装完成后,重启正在运行的 DeepSeek Harness Web 服务并刷新页面。
|
|
46
|
+
### Build from source
|
|
27
47
|
|
|
28
|
-
|
|
48
|
+
```sh
|
|
49
|
+
git clone https://github.com/NanmiCoder/dsh-agent-teams.git
|
|
50
|
+
cd dsh-agent-teams
|
|
51
|
+
pnpm install
|
|
52
|
+
pnpm build
|
|
53
|
+
dsh plugin --profile web add .
|
|
54
|
+
```
|
|
29
55
|
|
|
30
|
-
|
|
56
|
+
Run `pnpm build` again after changing the source. The local plugin install remains linked to this checkout.
|
|
31
57
|
|
|
32
|
-
|
|
58
|
+
Validate the composed profile, restart DSH, and refresh the Web UI:
|
|
33
59
|
|
|
34
60
|
```sh
|
|
35
|
-
dsh
|
|
61
|
+
dsh --profile web --dump-config
|
|
62
|
+
dsh web
|
|
36
63
|
```
|
|
37
64
|
|
|
38
|
-
|
|
65
|
+
Then ask for a team directly:
|
|
39
66
|
|
|
40
|
-
|
|
67
|
+
> Use AgentTeams to review the commits after v0.5.3 from performance, security, and product perspectives. Return one consolidated report.
|
|
41
68
|
|
|
42
|
-
|
|
43
|
-
npx -p @deepseek-ai/dsh dsh plugin --profile web add @nanmicoder/dsh-agent-teams
|
|
44
|
-
```
|
|
69
|
+
## How it works
|
|
45
70
|
|
|
46
|
-
|
|
71
|
+
1. The current session creates a team and becomes its captain.
|
|
72
|
+
2. The captain adds role-specific members backed by continuable sub-agents.
|
|
73
|
+
3. The goal becomes tasks with owners and explicit dependencies.
|
|
74
|
+
4. Claimed tasks are dispatched through durable mailbox messages that wake each member.
|
|
75
|
+
5. Members work, update task state, and report directly to the captain or one another.
|
|
76
|
+
6. The captain presents the combined result, then archives the complete team record.
|
|
47
77
|
|
|
48
|
-
|
|
49
|
-
dsh plugin --profile web add github:NanmiCoder/dsh-agent-teams
|
|
50
|
-
```
|
|
78
|
+
Team state is stored under `<workspace>/.agent-teams/`; the Web panel reads that disk truth and combines it with live sub-agent activity.
|
|
51
79
|
|
|
52
|
-
|
|
80
|
+
Member creation is zero-interaction by default: the plugin snapshots the LLM provider, model, and reasoning effort actually used by the captain's current step, and restores that snapshot on later continuations. Only an explicit heterogeneous-team request (for example, “backend on provider A/model X, frontend on provider B/model Y”) supplies a member-specific `provider` + `model`; there is no per-member model or reasoning prompt.
|
|
53
81
|
|
|
54
|
-
|
|
55
|
-
git clone https://github.com/NanmiCoder/dsh-agent-teams.git
|
|
56
|
-
cd dsh-agent-teams
|
|
57
|
-
pnpm install
|
|
58
|
-
pnpm build
|
|
59
|
-
dsh plugin --profile web add "link:$(pwd)"
|
|
60
|
-
```
|
|
82
|
+
## Configuration
|
|
61
83
|
|
|
62
|
-
|
|
84
|
+
Defaults work without extra setup. A trusted profile can override member behavior:
|
|
63
85
|
|
|
64
|
-
|
|
86
|
+
```yaml
|
|
87
|
+
- id: agent-teams
|
|
88
|
+
config:
|
|
89
|
+
stateDir: .agent-teams
|
|
90
|
+
memberProvider: spawn
|
|
91
|
+
memberModel: deepseek-v4
|
|
92
|
+
memberMaxDepth: 1
|
|
93
|
+
maxMembers: 8
|
|
94
|
+
```
|
|
65
95
|
|
|
66
|
-
|
|
96
|
+
`memberProvider` is the sub-agent runtime backend (`spawn` / `fork`), not an LLM provider. Cross-LLM-provider routing uses the optional `provider` + `model` fields of `agent_teams_add_member`; `memberModel` is only a model default for all members.
|
|
67
97
|
|
|
68
|
-
|
|
98
|
+
## Boundaries
|
|
69
99
|
|
|
70
|
-
|
|
100
|
+
- One captain leads one active team at a time.
|
|
101
|
+
- Members act only after they are woken; mail remains durable while a participant is idle.
|
|
102
|
+
- State is file-backed and serialized within one DSH process; concurrent processes editing the same team are not coordinated.
|
|
103
|
+
- The activity panel reports persisted state as-is. Models may occasionally finish work without performing the expected task-state update.
|
|
71
104
|
|
|
72
|
-
|
|
105
|
+
See [docs/usage.md](./docs/usage.md) for the full tool reference, state model, Web UI behavior, configuration, and known limits.
|
|
73
106
|
|
|
74
|
-
|
|
107
|
+
## Plugin development Skill
|
|
108
|
+
|
|
109
|
+
The repository also ships the open Agent Skills package [`dsh-plugin-development`](./skills/dsh-plugin-development/SKILL.md):
|
|
75
110
|
|
|
76
111
|
```sh
|
|
77
112
|
npx skills add NanmiCoder/dsh-agent-teams --skill dsh-plugin-development
|
|
78
113
|
```
|
|
79
114
|
|
|
80
|
-
|
|
115
|
+
## Documentation
|
|
116
|
+
|
|
117
|
+
| Guide | Covers |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| [Usage](./docs/usage.md) | Architecture, UI behavior, tools, configuration, limits, and validation |
|
|
120
|
+
| [Verification](./docs/verification-guide.md) | Offline, composition, real e2e, and GUI verification |
|
|
121
|
+
| [Plugin development](./docs/developing-dsh-plugins.md) | Human-readable guide built from this plugin |
|
|
122
|
+
| [README writing](./docs/readme-writing-guide.md) | Repository documentation conventions |
|
|
81
123
|
|
|
82
|
-
##
|
|
124
|
+
## Development
|
|
83
125
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
| [docs/developing-dsh-plugins.md](docs/developing-dsh-plugins.md) | 面向人类阅读的开发指南(本插件为样例) |
|
|
126
|
+
```sh
|
|
127
|
+
pnpm install
|
|
128
|
+
pnpm build
|
|
129
|
+
pnpm verify
|
|
130
|
+
```
|
|
90
131
|
|
|
91
132
|
## License
|
|
92
133
|
|
|
93
|
-
MIT
|
|
134
|
+
[MIT](./LICENSE)
|
package/README_ZH.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
<p align="right">
|
|
2
|
+
<a href="./README.md">English</a> · <strong>简体中文</strong>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="./assets/readme/hero.svg" width="100%" alt="dsh-agent-teams 把一个 DeepSeek Harness 会话变成可协作的多智能体团队">
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/@nanmicoder/dsh-agent-teams"><img src="https://img.shields.io/npm/v/@nanmicoder/dsh-agent-teams.svg" alt="npm 版本"></a>
|
|
11
|
+
<a href="./LICENSE"><img src="https://img.shields.io/npm/l/@nanmicoder/dsh-agent-teams.svg" alt="MIT 许可证"></a>
|
|
12
|
+
<img src="https://img.shields.io/badge/DeepSeek%20Harness-plugin-202724" alt="DeepSeek Harness 插件">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
## 一句话,拉起一支真正协作的团队
|
|
16
|
+
|
|
17
|
+
`dsh-agent-teams` 让当前 DeepSeek Harness 会话成为队长:创建可续聊的子 Agent、把目标拆成有依赖的任务,并通过直达消息协调成员工作。
|
|
18
|
+
|
|
19
|
+
你只需用自然语言提出目标。插件会提供团队协议、9 个协作工具、持久化状态和实时 Web UI,不需要额外的 Workflow 引擎。
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<img src="./assets/ui.png" width="100%" alt="DeepSeek Harness 对话与 AgentTeams 实时活动面板,展示成员、任务依赖和回报">
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
## 为什么需要 AgentTeams?
|
|
26
|
+
|
|
27
|
+
| 能力 | 带来的变化 |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| **队长式委派** | 当前会话负责建队、分配角色并汇总最终结果。 |
|
|
30
|
+
| **可续聊成员** | 成员是可持续唤醒的 DSH 子 Agent,可以继续执行聚焦的后续轮次。 |
|
|
31
|
+
| **带依赖的任务** | 任务有明确状态;依赖未完成时不能领取。 |
|
|
32
|
+
| **成员直达消息** | 成员通过持久化邮箱直接联系队友或队长,不需要队长中转。 |
|
|
33
|
+
| **实时活动面板** | Web UI 展示角色、当前工作、未读消息、任务依赖和归档历史。 |
|
|
34
|
+
|
|
35
|
+
## 安装
|
|
36
|
+
|
|
37
|
+
> [!NOTE]
|
|
38
|
+
> 使用前请确保已安装 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)。
|
|
39
|
+
|
|
40
|
+
### npm
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
dsh plugin --profile web add @nanmicoder/dsh-agent-teams
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 从源码构建
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
git clone https://github.com/NanmiCoder/dsh-agent-teams.git
|
|
50
|
+
cd dsh-agent-teams
|
|
51
|
+
pnpm install
|
|
52
|
+
pnpm build
|
|
53
|
+
dsh plugin --profile web add .
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
修改源码后请重新执行 `pnpm build`。本地安装会继续链接到当前源码目录。
|
|
57
|
+
|
|
58
|
+
检查组合配置、重启 DSH,然后刷新 Web UI:
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
dsh --profile web --dump-config
|
|
62
|
+
dsh web
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
接着直接用自然语言拉团队:
|
|
66
|
+
|
|
67
|
+
> 使用 AgentTeams 审查 v0.5.3 之后的提交,分别从性能、安全和产品角度分工,最后输出一份汇总报告。
|
|
68
|
+
|
|
69
|
+
## 工作方式
|
|
70
|
+
|
|
71
|
+
1. 当前会话创建团队并成为队长。
|
|
72
|
+
2. 队长按角色添加由可续聊子 Agent 驱动的成员。
|
|
73
|
+
3. 目标被拆成有负责人和显式依赖的任务。
|
|
74
|
+
4. 任务领取后,通过持久化邮箱投递并唤醒对应成员。
|
|
75
|
+
5. 成员执行任务、更新状态,并直接向队长或其他成员汇报。
|
|
76
|
+
6. 队长汇总结果,随后归档完整团队记录。
|
|
77
|
+
|
|
78
|
+
团队状态保存在 `<workspace>/.agent-teams/`;Web 面板读取这份磁盘真相,并与实时子 Agent 活动合并展示。
|
|
79
|
+
|
|
80
|
+
成员创建默认零交互:插件会快照队长**当前这一步**实际使用的 LLM provider、model 与思考强度,成员后续续跑仍使用这份快照。只有当用户明确提出异构分工(例如“后端用 provider A/model X,前端用 provider B/model Y”)时,队长才会把对应的 `provider` + `model` 传给该成员;不会逐个弹出模型或思考强度选择。
|
|
81
|
+
|
|
82
|
+
## 配置
|
|
83
|
+
|
|
84
|
+
默认配置可以直接使用。受信任的 Profile 可以覆盖成员行为:
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
- id: agent-teams
|
|
88
|
+
config:
|
|
89
|
+
stateDir: .agent-teams
|
|
90
|
+
memberProvider: spawn
|
|
91
|
+
memberModel: deepseek-v4
|
|
92
|
+
memberMaxDepth: 1
|
|
93
|
+
maxMembers: 8
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
这里的 `memberProvider` 指子 Agent 的运行后端(`spawn` / `fork`),不是 LLM provider。跨 LLM provider 由 `agent_teams_add_member` 的可选 `provider` + `model` 参数表达;`memberModel` 只是所有成员的模型默认覆盖。
|
|
97
|
+
|
|
98
|
+
## 使用边界
|
|
99
|
+
|
|
100
|
+
- 一个队长同一时间只能带一个活动团队。
|
|
101
|
+
- 成员被唤醒后才行动;参与者空闲时,消息会持久保存在邮箱中。
|
|
102
|
+
- 状态使用文件持久化,并在单个 DSH 进程内串行操作;多个进程同时修改同一团队不保证一致。
|
|
103
|
+
- 活动面板如实展示持久化状态;模型偶尔可能完成工作却没有按协议更新任务状态。
|
|
104
|
+
|
|
105
|
+
完整工具列表、状态模型、Web UI 行为、配置与已知限制见 [docs/usage.md](./docs/usage.md)。
|
|
106
|
+
|
|
107
|
+
## 插件开发 Skill
|
|
108
|
+
|
|
109
|
+
仓库同时提供开放 Agent Skills 包 [`dsh-plugin-development`](./skills/dsh-plugin-development/SKILL.md):
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
npx skills add NanmiCoder/dsh-agent-teams --skill dsh-plugin-development
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 文档
|
|
116
|
+
|
|
117
|
+
| 指南 | 内容 |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| [使用指南](./docs/usage.md) | 架构、UI 行为、工具、配置、限制与验证 |
|
|
120
|
+
| [验证指南](./docs/verification-guide.md) | 离线、组合、真实 e2e 与 GUI 验证 |
|
|
121
|
+
| [插件开发](./docs/developing-dsh-plugins.md) | 基于本插件整理的人类可读开发指南 |
|
|
122
|
+
| [README 写作](./docs/readme-writing-guide.md) | 仓库文档约定 |
|
|
123
|
+
|
|
124
|
+
## 开发
|
|
125
|
+
|
|
126
|
+
```sh
|
|
127
|
+
pnpm install
|
|
128
|
+
pnpm build
|
|
129
|
+
pnpm verify
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## 许可证
|
|
133
|
+
|
|
134
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="360" viewBox="0 0 1200 360" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">dsh-agent-teams</title>
|
|
3
|
+
<desc id="desc">A DeepSeek Harness plugin that turns one captain session into a coordinated team of durable members working through dependent tasks and direct messages.</desc>
|
|
4
|
+
|
|
5
|
+
<defs>
|
|
6
|
+
<marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto" markerUnits="strokeWidth">
|
|
7
|
+
<path d="M0 0L8 4L0 8Z" fill="#4F8CFF"/>
|
|
8
|
+
</marker>
|
|
9
|
+
</defs>
|
|
10
|
+
|
|
11
|
+
<rect width="1200" height="360" rx="28" fill="#07111F"/>
|
|
12
|
+
<path d="M656 42V318" stroke="#20334C" stroke-width="1.5"/>
|
|
13
|
+
|
|
14
|
+
<g font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', sans-serif">
|
|
15
|
+
<text x="58" y="64" fill="#7F98BB" font-size="17" font-weight="650" letter-spacing="2.2">DEEPSEEK HARNESS · MULTI-AGENT ORCHESTRATION</text>
|
|
16
|
+
<text x="58" y="142" fill="#F4F8FF" font-size="58" font-weight="760" letter-spacing="-2.1">dsh-agent-teams</text>
|
|
17
|
+
<text x="58" y="197" fill="#C4D1E3" font-size="27" font-weight="520">One session becomes a coordinated team.</text>
|
|
18
|
+
|
|
19
|
+
<g font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="15">
|
|
20
|
+
<rect x="58" y="247" width="152" height="42" rx="21" fill="#102642" stroke="#315D91"/>
|
|
21
|
+
<circle cx="81" cy="268" r="6" fill="#4F8CFF"/>
|
|
22
|
+
<text x="98" y="274" fill="#BBD5FF" font-weight="700">CAPTAIN-LED</text>
|
|
23
|
+
<text x="232" y="274" fill="#7189AA">MEMBERS · TASKS · MESSAGES · ARCHIVE</text>
|
|
24
|
+
</g>
|
|
25
|
+
|
|
26
|
+
<g font-family="ui-monospace, SFMono-Regular, Menlo, monospace">
|
|
27
|
+
<text x="704" y="57" fill="#7F98BB" font-size="15" letter-spacing="1.7">LIVE TEAM GRAPH</text>
|
|
28
|
+
|
|
29
|
+
<path d="M790 130C844 130 850 86 912 86" fill="none" stroke="#4F8CFF" stroke-width="1.8"/>
|
|
30
|
+
<path d="M790 130H912" fill="none" stroke="#4F8CFF" stroke-width="1.8"/>
|
|
31
|
+
<path d="M790 130C844 130 850 174 912 174" fill="none" stroke="#4F8CFF" stroke-width="1.8"/>
|
|
32
|
+
<path d="M1040 86V174" fill="none" stroke="#35D5A4" stroke-width="1.4" stroke-dasharray="5 6"/>
|
|
33
|
+
|
|
34
|
+
<circle cx="755" cy="130" r="38" fill="#102642" stroke="#4F8CFF" stroke-width="2"/>
|
|
35
|
+
<circle cx="755" cy="130" r="25" fill="#4F8CFF"/>
|
|
36
|
+
<path d="M745 132L753 140L767 121" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
|
37
|
+
<text x="712" y="184" fill="#AFC4E0" font-size="14">CAPTAIN</text>
|
|
38
|
+
|
|
39
|
+
<g>
|
|
40
|
+
<rect x="912" y="61" width="222" height="50" rx="12" fill="#101F33" stroke="#2B4567"/>
|
|
41
|
+
<circle cx="936" cy="86" r="8" fill="#4F8CFF"/>
|
|
42
|
+
<text x="955" y="82" fill="#F4F8FF" font-size="15" font-weight="700">RESEARCHER</text>
|
|
43
|
+
<text x="955" y="101" fill="#7F98BB" font-size="12">collect evidence</text>
|
|
44
|
+
</g>
|
|
45
|
+
<g>
|
|
46
|
+
<rect x="912" y="117" width="222" height="50" rx="12" fill="#101F33" stroke="#2B4567"/>
|
|
47
|
+
<circle cx="936" cy="142" r="8" fill="#35D5A4"/>
|
|
48
|
+
<text x="955" y="138" fill="#F4F8FF" font-size="15" font-weight="700">ENGINEER</text>
|
|
49
|
+
<text x="955" y="157" fill="#7F98BB" font-size="12">build and verify</text>
|
|
50
|
+
</g>
|
|
51
|
+
<g>
|
|
52
|
+
<rect x="912" y="173" width="222" height="50" rx="12" fill="#101F33" stroke="#2B4567"/>
|
|
53
|
+
<circle cx="936" cy="198" r="8" fill="#F2BD62"/>
|
|
54
|
+
<text x="955" y="194" fill="#F4F8FF" font-size="15" font-weight="700">REVIEWER</text>
|
|
55
|
+
<text x="955" y="213" fill="#7F98BB" font-size="12">challenge result</text>
|
|
56
|
+
</g>
|
|
57
|
+
|
|
58
|
+
<rect x="700" y="250" width="124" height="54" rx="12" fill="#101F33" stroke="#2B4567"/>
|
|
59
|
+
<text x="719" y="272" fill="#7F98BB" font-size="12">TASK t1</text>
|
|
60
|
+
<text x="719" y="292" fill="#F4F8FF" font-size="14" font-weight="700">RESEARCH</text>
|
|
61
|
+
<path d="M824 277H850" stroke="#4F8CFF" stroke-width="1.8" marker-end="url(#arrow)"/>
|
|
62
|
+
|
|
63
|
+
<rect x="858" y="250" width="124" height="54" rx="12" fill="#101F33" stroke="#2B4567"/>
|
|
64
|
+
<text x="877" y="272" fill="#7F98BB" font-size="12">TASK t2</text>
|
|
65
|
+
<text x="877" y="292" fill="#F4F8FF" font-size="14" font-weight="700">IMPLEMENT</text>
|
|
66
|
+
<path d="M982 277H1008" stroke="#4F8CFF" stroke-width="1.8" marker-end="url(#arrow)"/>
|
|
67
|
+
|
|
68
|
+
<rect x="1016" y="250" width="118" height="54" rx="12" fill="#102A29" stroke="#2E7368"/>
|
|
69
|
+
<text x="1035" y="272" fill="#75B8AC" font-size="12">TASK t3</text>
|
|
70
|
+
<text x="1035" y="292" fill="#9AF0D9" font-size="14" font-weight="700">REVIEW</text>
|
|
71
|
+
</g>
|
|
72
|
+
</g>
|
|
73
|
+
</svg>
|