🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

舰队协同引擎 17861102832/fleet-os

DeepSeek Harness
1786110283263 天前有提交已提供中文文档扫描:含敏感能力

编排多智能体分工协作,全程可审计可恢复

33.9/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装。以下命令仍可尝试,但可能失败。
无法用 dsh 插件命令安装(仓库内无 dsh 插件清单)
git clone https://github.com/17861102832/fleet-os.git
按该仓库 README 的原生方式安装;若作者另行发布了 DSH 插件包,请以其文档为准

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · skill
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 63 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/26) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包fleet-os(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 09:43:41

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 81 处,展示前 78 条)
  • 发起网络请求
    dsh/src/fleet-bridge.ts:27
    const res = await fetch(`${HUB}/v1/admin`, {
  • 发起网络请求
    dsh/src/fleet-bridge.ts:37
    const res = await fetch(`${HUB}/v1/state`)
  • 读取本地文件
    engine/src/agents-md.js:49
    if (fs.existsSync(p)) {
  • 读取本地文件
    engine/src/agents-md.js:51
    let body = fs.readFileSync(p, 'utf8');
  • 读取本地文件
    engine/src/e2e.js:196
    try { wrote = fs.existsSync(path.join(artifacts, 'solver', 'f1', 'answer.txt')) || fs.existsSync(path.join(artifacts, 'judge', 'f2', 'answer.txt')); }
  • 删除本地文件
    engine/src/e2e.js:237
    try { fs.rmSync(repo, { recursive: true, force: true }); } catch (_) {}
  • 删除本地文件
    engine/src/e2e.js:238
    try { fs.rmSync(wtBase, { recursive: true, force: true }); } catch (_) {}
  • 写入本地文件
    engine/src/e2e.js:243
    fs.writeFileSync(path.join(repo, 'base.txt'), 'hello\n');
  • 写入本地文件
    engine/src/e2e.js:248
    fs.writeFileSync(path.join(a.worktree, 'a.txt'), 'from n1\n');
  • 写入本地文件
    engine/src/e2e.js:250
    fs.writeFileSync(path.join(b.worktree, 'b.txt'), 'from n2\n');
  • 读取本地文件
    engine/src/e2e.js:254
    const files = fs.readdirSync(repo);
  • 执行外部命令来自配置/变量
    engine/src/e2e.js:261
    const p = spawn(process.execPath, [path.join(__dirname, 'mcp-server.js')], { env: Object.assign({}, process.env, { FLEET_CONFIG: cfgFile }) });
  • 写入本地文件
    engine/src/e2e.js:317
    try { fs.writeFileSync(art, 'A发现:龙头是X'); } catch (_) {}
  • 读取本地文件
    engine/src/evolve.js:102
    peek() { return { policies: fs.existsSync(path.join(this.dir, 'policies')) ? fs.readdirSync(path.join(this.dir, 'policies')) : [], genome: fs.existsSy
  • 读取本地文件
    engine/src/filemap.js:25
    try { ents = fs.readdirSync(d, { withFileTypes: true }); } catch (_) { return; }
  • 读取本地文件
    engine/src/filemap.js:31
    try { const body = fs.readFileSync(p, 'utf8'); if (re.test(body)) hits.push(p); } catch (_) {}
  • 读取本地文件
    engine/src/filemap.js:42
    try { body = fs.readFileSync(file, 'utf8'); } catch (_) { return { error: 'cannot_read' }; }
  • 读取本地文件
    engine/src/filemap.js:57
    try { ents = fs.readdirSync(d, { withFileTypes: true }); } catch (_) { return; }
  • 读取本地文件
    engine/src/filemap.js:72
    try { head = fs.readFileSync(f, 'utf8').split('\n').slice(0, 40).join('\n'); } catch (_) { continue; }
  • 读取本地文件
    engine/src/fleet.js:61
    if (p === '-') return JSON.parse(fs.readFileSync(0, 'utf8').replace(/^ FEFF/, ''));
  • 读取本地文件
    engine/src/fleet.js:62
    return JSON.parse(fs.readFileSync(p, 'utf8').replace(/^ FEFF/, ''));
  • 写入本地文件
    engine/src/fleet.js:228
    main().catch((e) => { try { ensureDirForErr(); fs.appendFileSync(path.join(__dirname, '..', 'state', 'log', 'fleet-cli.err'), (e && e.stack || e) + '\
  • 写入本地文件
    engine/src/fleet.js:230
    function ensureDirForErr() { fs.mkdirSync(path.join(__dirname, '..', 'state', 'log'), { recursive: true }); }
  • 读取本地文件
    engine/src/gas-town.js:26
    if (fs.existsSync(f)) {
  • 读取本地文件
    engine/src/gas-town.js:27
    try { for (const b of JSON.parse(fs.readFileSync(f, 'utf8'))) this.index.set(b.id, b); } catch (_) {}
  • 写入本地文件
    engine/src/gas-town.js:55
    try { fs.mkdirSync(dir, { recursive: true }); } catch (_) {}
  • 读取本地文件
    engine/src/gas-town.js:62
    if (fs.existsSync(f)) {
  • 读取本地文件
    engine/src/gas-town.js:63
    try { for (const c of JSON.parse(fs.readFileSync(f, 'utf8'))) this.index.set(c.id, c); } catch (_) {}
  • 执行外部命令来自配置/变量
    engine/src/git.js:16
    return execFileSync(cmd, args, { encoding: 'utf8', maxBuffer: 32 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] });
  • 读取本地文件
    engine/src/git.js:23
    if (fs.existsSync(wt)) return { worktree: wt, branch: br, created: false };
  • 写入本地文件
    engine/src/hub.js:87
    try { fs.appendFileSync(this.logFile, line + '\n'); } catch (_) {}
  • 读取本地文件
    engine/src/hub.js:494
    return send(200, fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '<pre>fleet hub ok</pre>', 'text/html');
  • 读取本地文件
    engine/src/jobstore.js:29
    if (fs.existsSync(idxFile)) {
  • 读取本地文件
    engine/src/jobstore.js:30
    try { for (const j of JSON.parse(fs.readFileSync(idxFile, 'utf8'))) this.index.set(j.id, j); } catch (_) {}
  • 读取本地文件
    engine/src/langgraph.js:45
    if (fs.existsSync(f)) { try { for (const t of JSON.parse(fs.readFileSync(f, 'utf8'))) this.threads.set(t.threadId, t); } catch (_) {} }
  • 写入本地文件
    engine/src/mcp-server.js:82
    log(...a) { try { fs.appendFileSync(path.join(__dirname, '..', 'state', 'log', 'mcp.log'), `[${new Date().toISOString()}] ${a.join(' ')}\n`); } catch
  • 读取本地文件
    engine/src/persona.js:20
    if (!fs.existsSync(this.dir)) return this;
  • 读取本地文件
    engine/src/persona.js:21
    for (const f of fs.readdirSync(this.dir)) {
  • 读取本地文件
    engine/src/persona.js:24
    const c = JSON.parse(fs.readFileSync(path.join(this.dir, f), 'utf8'));
  • 读取本地文件
    engine/src/persona.js:37
    const raw = fs.readFileSync(file, 'utf8');
  • 写入本地文件
    engine/src/persona.js:53
    fs.writeFileSync(path.join(this.dir, id + '.json'), JSON.stringify(card, null, 2), 'utf8');
  • 读取本地文件
    engine/src/role.js:27
    if (!fs.existsSync(this.dir)) return;
  • 读取本地文件
    engine/src/role.js:28
    for (const f of fs.readdirSync(this.dir)) {
  • 读取本地文件
    engine/src/role.js:31
    const data = JSON.parse(fs.readFileSync(require('path').join(this.dir, f), 'utf8'));
  • 读取本地文件
    engine/src/skills.js:25
    if (!fs.existsSync(this.root)) return;
  • 读取本地文件
    engine/src/skills.js:26
    for (const dir of fs.readdirSync(this.root)) {
  • 读取本地文件
    engine/src/skills.js:29
    if (!fs.statSync(full).isDirectory()) continue;
  • 读取本地文件
    engine/src/skills.js:31
    if (!fs.existsSync(file)) continue;
  • 读取本地文件
    engine/src/skills.js:32
    const raw = fs.readFileSync(file, 'utf8');
  • 读取本地文件
    engine/src/skills.js:67
    out.push({ id, content: fs.readFileSync(file, 'utf8') });
  • 写入本地文件
    engine/src/state.js:81
    try { fs.renameSync(f, this.snapshotFile); } catch (e) {
  • 写入本地文件
    engine/src/state.js:85
    try { fs.renameSync(f, this.snapshotFile); ok = true; } catch (_) { Atomics && Atomics.wait && Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),
  • 写入本地文件
    engine/src/state.js:87
    if (!ok) try { fs.copyFileSync(f, this.snapshotFile); fs.unlinkSync(f); } catch (_) {}
  • 读取本地文件
    engine/src/state.js:555
    if (!fs.existsSync(dir)) return [];
  • 读取本地文件
    engine/src/state.js:556
    return fs.readdirSync(dir).filter((f) => f.endsWith('.json')).map((f) => {
  • 读取本地文件
    engine/src/state.js:557
    try { return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8')); } catch (_) { return null; }
  • 读取本地文件
    engine/src/subagents.js:31
    if (!fs.existsSync(f)) return;
  • 读取本地文件
    engine/src/subagents.js:32
    try { const arr = JSON.parse(fs.readFileSync(f, 'utf8')); arr.forEach((r) => { this.registry.set(r.id, r); this.personas.cards.set(r.id, r); }); } cat
  • 写入本地文件
    engine/src/tracing.js:47
    try { fs.mkdirSync(dir, { recursive: true }); } catch (_) {}
  • 写入本地文件
    engine/src/util.js:14
    fs.mkdirSync(d, { recursive: true });
  • 读取本地文件
    engine/src/util.js:19
    if (!fs.existsSync(file)) return [];
  • 读取本地文件
    engine/src/util.js:21
    for (const line of fs.readFileSync(file, 'utf8').split('\n')) {
  • 写入本地文件
    engine/src/util.js:31
    fs.appendFileSync(file, JSON.stringify(obj) + '\n', 'utf8');
  • 写入本地文件
    engine/src/util.js:36
    fs.writeFileSync(file, String(text), 'utf8');
  • 读取本地文件
    engine/src/util.js:62
    const raw = JSON.parse(fs.readFileSync(file, 'utf8'));
  • 写入本地文件
    engine/src/worker.js:68
    try { fs.appendFileSync(this.logs, line + '\n'); } catch (_) {}
  • 写入本地文件
    engine/src/worker.js:144
    fs.writeFileSync(file, body);
  • 写入本地文件
    engine/src/worker.js:156
    fs.writeFileSync(pf, prompt, 'utf8');
  • 执行外部命令来自配置/变量
    engine/src/worker.js:159
    const stdout = execSync(finalCmd, { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, timeout: (this.provider.timeoutMs || 600000), cwd: ctx.workdir || p
  • 删除本地文件
    engine/src/worker.js:164
    try { fs.unlinkSync(pf); } catch (_) {}
  • 写入本地文件
    engine/src/worker.js:191
    for (const f of (o.files || [])) { try { ensureDir(path.dirname(path.resolve(workdir, f.path))); fs.writeFileSync(path.resolve(workdir, f.path), f.bod
  • 发起网络请求
    engine/src/worker.js:208
    const res = await fetch(`${base}/chat/completions`, {
  • 写入本地文件
    engine/src/worker.js:232
    if (name === 'Write') { try { fs.writeFileSync(path.resolve(workdir, String(args.path)), String(args.content || '')); return { ok: true, path: args.pa
  • 读取本地文件
    engine/src/worker.js:299
    const body = fs.readFileSync(p, 'utf8');
  • 读取本地文件
    engine/src/worker.js:309
    let body = fs.readFileSync(p, 'utf8');
  • 写入本地文件
    engine/src/worker.js:312
    fs.writeFileSync(p, body, 'utf8');
  • 执行外部命令来自配置/变量
    engine/src/worker.js:318
    const out = execSync(String(cmd).replace(/[<>]/g, ''), { encoding: 'utf8', cwd: workdir, shell: true, timeout: 30000, maxBuffer: 4 * 1024 * 1024 });
  • 发起网络请求
    engine/src/ws.js:194
    const req = mod.request({
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 多智能体分工编排
  • 全程可审计可恢复
  • 跨舰队接力协作
展开完整介绍(121 字)↓

Fleet OS · 舰队模式 — 生产级多 Agent 协同引擎:WS 黑板 + 事件溯源 + 盲评对抗 + 跨舰队接力 + 上下文压缩 + 多厂商负载均衡 + 自进化。36 模块,零运行时依赖,MCP 40 工具,48 项 e2e 全绿。

README

由 DeepSeek 最新模型翻译生成
Fleet OS · 舰队模式 生产级多 Agent 协同引擎 —— WebSocket 黑板 + 事件溯源 + 盲评对抗 + 跨舰队接力 + 自进化。零 npm 依赖,36 模块,单进程可跑。 这不是又一个“并行 N 个子代理”的玩具。 每一个槽位、每道闸、每条账、每段上下文都可审计、可恢复、可 fork、可接力、会自进化、会负载均衡。 - 48 项端到端测试全绿(node src/e2e.js) - 20 节点冒烟:complete / 0 失败 - MCP 服务器 40 个工具,可被任意支持 MCP 的 IDE/Agent 直接指挥 为什么不是 Kimi Agent Swarm Kimi 的“100 子 agent”是权重里焊死的营销数字。同质模型并行辩论的从众率实测高达 85.5%(The Cost of Consensus, 2025);Anthropic 数据显示 multi-agent 烧掉 ≈15× chat token。
展开完整文档(README 剩余 1 节)
Fleet OS · 舰队模式

生产级多 Agent 协同引擎 —— WebSocket 黑板 + 事件溯源 + 盲评对抗 + 跨舰队接力 + 自进化。零 npm 依赖,36 模块,单进程可跑。

这不是又一个“并行 N 个子代理”的玩具。 每一个槽位、每道闸、每条账、每段上下文都可审计、可恢复、可 fork、可接力、会自进化、会负载均衡。

- 48 项端到端测试全绿(node src/e2e.js)
- 20 节点冒烟:complete / 0 失败
- MCP 服务器 40 个工具,可被任意支持 MCP 的 IDE/Agent 直接指挥

为什么不是 Kimi Agent Swarm

Kimi 的“100 子 agent”是权重里焊死的营销数字。同质模型并行辩论的从众率实测高达 85.5%(The Cost of Consensus, 2025);Anthropic 数据显示 multi-agent 烧掉 ≈15× chat token。舰队模式用硬工程对抗这些:

| 维度 | Kimi Swarm | Fleet OS v6 |
| 并行 | 100 权重硬编码 | 配额 + 默认扇出 3~5(Anthropic 最佳实践)+ max_threads=6 / max_depth=1 护栏 |
| 通信 | 同进程共享 | WS 黑板 + 产物落盘指针(token 隔离) |
| 验证 | 自判 | N 路盲评(盲采样)+ 裁决 + verifier rerank + 级联升级 |
| 上下文 | 无压缩 | Compactor 热/冷分层 + observation masking(防 context rot) |
| 模型绑定 | 单模型 | Balancer 多厂商 round-robin / cheapest / least_error + error-aware 降级 |
| 权限 | 无 | 四权限模式 bypass/acceptEdits/plan/default + 人工审批闭环 |
| 跨舰队 | 无 | FleetBus handoff 只传指针不传全文 + 依赖门 |
| 持久化 | 会话断即丢 | append-only ledger × checkpoint × hooks × traces × beads/convoy |
| 自进化 | 无 | settled 自动提炼 policies / skills-genome / persona-boost |
| 时间旅行 | 无 | replay / fork checkpoint |

架构总览(36 模块)

协调中枢 hub.js(HTTP+WS 双栈、舰队状态机、自动续传)调度 topology.js(solo/fanout/mapreduce/sample-verify/tournament/hierarchical 自动选)状态 state.js(DAG 节点 + 盲评 + 级联 + checkpoint + replay/fork)黑板 board.js(append-only + 相关性检索 + token 预算裁剪)压缩 compactor.js(热/冷分层 + observation masking,防 context rot)均衡 balancer.js(多 provider 轮流/最便宜/最少错误 + 自动降级)人格 persona.js + role.js(独立立场 + seed 切入角 + Role Contract + Codex 三型角色卡)安全 policy.js + permissions.js + guardrails.js(allow/ask/deny + 三档 tripwire)执行 worker.js(demo / cli(claude·codex·dsh·trae-cli) / api(OpenAI 兼容 + 真实工具执行器))隔离 git.js(N 路 git worktree 物理隔离,并行写不踩脚)协同 fleetbus.js(跨舰队 handoff + 依赖门 + Agent Teams 同层互喂)进化 evolve.js(跑完自动提炼策略/技能基因/人格增强)观测 tracing.js + hooks.js + filemap.js + public/board.html(浏览器看板)桥接 mcp-server.js(40 工具,MCP stdio)

对齐的实现:OpenAI Agents SDK(role contract / guardrails / tracing)、Claude Code(hooks / permission modes)、Codex CLI(AGENTS.md 叠加 / 子代理三型 / max_threads 边界)、AutoGen v0.4(TopicBus actor 模型)、MetaGPT(SOP 契约)、LangGraph(Command / Checkpoint / time-travel)、Aider(repo map)、Gas Town(beads/convoy/refinery)、FrugalGPT / RouteLLM(级联路由)。

快速开始

cd engine
npm install # 仅 dev 依赖;运行时零依赖

1. 起舰(Hub:HTTP+WS 中枢 + 看板 http://127.0.0.1:7788/board.html)
node src/hub.js fleet.config.json

2. 起舰员(demo 模式不烧 token)
node src/worker.js --mode=demo --slots=2

3. 下单(spec 里写目标/拓扑/验收标准/预算)
node src/fleet.js run fleet.config.json spec.json

4. 观战
node src/fleet.js status fleet.config.json
或浏览器打开 board.html

接入真模型:复制 fleet.config.example.json → fleet.config.json,填入 OpenAI 兼容端点(支持多厂商并存,Balancer 自动轮询/降级)。

MCP 接入(让 IDE/Agent 当舰长)

json
{ "mcpServers": { "fleet": { "command": "node", "args": ["/engine/src/mcp-server.js", "/engine/fleet.config.json"] } } }

40 个工具覆盖:plan / status / adopt / board / rerank / fork / subagents / handoff / deps / consume / bus_snap / perm_check / balancer / compile_stats / evolve / team_join / peer_ping …

DeepSeek Harness 深度集成(dsh-fleet)

Fleet OS 同时是 DeepSeek Harness 的插件(dsh-plugin topic)。

DSH 架构一页纸

Agent = Model + Harness
│
┌─────────┴──────────┐
│ Cordis 内核 │ ← 来自 Koishi.js 生态的依赖注入/插件生命周期框架 │ (挂载/卸载/依赖) │ 只管插件,不提供任何能力 └─────────┬──────────┘ 一切皆插件:models · tools · skills · sessions · sandboxes storage · loops · scheduling · UI

- 插件三形式:函数 export function apply(ctx) / 对象 / class Service;export const inject = ['tools'] 声明依赖,Cordis 等服务就绪才加载
- 工具 DSL:ctx.tools.register(defineTool({ name, description, parameters, output{schema,render}, execute })) —— args 自动校验,output.render 决定模型看到的形态
- 四种运行时模式:Standard(全家桶)/ Code(模型写 TS 编排多轮工具)/ Minimal(双工具基准)/ Creator(运行时检查 + 在线试插件)
- 全链路可追溯:append-only session log(system prompt/推理/工具调用/子代理调度/每次上下文注入全记录),Trajectory 视图按来源检查,resume/fork/search/replay 全走同一事件流
- 能力分层:Service Definition / Service Provider / Consumer 三包拆分,任何能力可换
- 挂载方式:cordis.yml overlay pnpm dsh web --patch ./cordis.yml,路径必须绝对;ctx.effect() 提供卸载清理

Fleet OS ↔ DSH 架构映射

| DSH 原生 | Fleet OS 对应 | 增量 |
| append-only session log | append-only ledger + checkpoints | 多一层 replay/fork time-travel |
| subagents | 舰队节点(扇出 3~5 + max_threads/depth 护栏) | 盲评对抗 + verifier rerank + tier 级联 |
| Trajectory view | /board 实时看板 | 舰队级 DAG 视图 + balancer 健康 + 待审批告警 |
| 模型插件 | Balancer 多厂商负载均衡 | round-robin/cheapest/least_error + 自动降级 |
| Context 注入 | Compactor 热/冷分层 | observation masking,防 context rot |

三步挂载 bash
1. 起舰队 hub
node engine/src/hub.js engine/fleet.config.json

2. 把 dsh/cordis.yml 里的路径改成你的绝对路径(插件源:dsh/src/fleet-bridge.ts —— 注册 8 个 fleet_* 工具)

3. DSH 加载 overlay
pnpm dsh web --patch /absolute/path/to/fleet-os/dsh/cordis.yml

Harness 里的 agent 即获得:fleet_plan(编排一支舰队)/ fleet_status / fleet_state(全量快照)/ fleet_board(读黑板)/ fleet_approvals + fleet_approve(人工审批闭环)/ fleet_handoff(跨舰队接力)/ fleet_evolve(技能基因提炼)。

测试 bash
node src/e2e.js # 48 项端到端:审批闭环/冷续传/api真执行器/cli外设/worktree隔离/MCP/子代理/自进化/跨舰队/权限/团队/压缩/负载均衡

许可证

MIT
预览分享卡片长什么样 ↓17861102832/fleet-os
分享 · DeepSeek Harness Hub
17861102832/fleet-os

编排多智能体分工协作,全程可审计可恢复

这是你的仓库?认领条目

回到顶部