01men/ybkk-AIOS4

dsh-enterprise-ops

企业 AI 资源统一管理平台 —— 基于 DeepSeek Harness「一切皆插件」架构

包名
dsh-enterprise-ops
版本
1.1.0
许可证
MIT
最近更新
2026年9月12日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:01men/ybkk-AIOS

榕器 · 企业AI资源管理平台

基于 DeepSeek Harness(dsh)「一切皆插件」 架构实现的企业级 AI 资源管理平台。 对应设计方案:《企业服务资源统一管理方案 V1.0》与《技术实现规划》;生态平台演进设计见 docs/ecosystem-design-v1.2.md(商业化部分已随 M0 废止,见文内横幅), 宿主轨迭代计划以《榕器开发计划-主分支》为最新基线(M1-1 契约冻结见下)。

组织账号(IAM)· 统一认证(Authn + OIDC Provider)· MCP 部署服务 · Skill/插件市场 · Agent 本体 · AI 应用本体 · 用量透明计量(usage)· 模型接入网关(modelgw)· 审计与告警 ——多类资源,一套身份、一套权限、一套计量、一套审计。

M0 合规收敛(2026-09-09):商业模式为私有化年费 + 治理包。平台对外只呈现用量与内部成本穿透—— 价格簿为零价快照(charge 恒 0)+ 内部采购成本参考,不呈现任何金额结算语义;用量透明月度报表 (部门/Agent/Skill tokens 三维聚合 + CSV 自助导出)见 J4 契约 docs/contract-j4-usage-report.md。 原钱包/分账子系统(plugin-billing)已整体下线封存(存量流水 CSV 封存 90 天,登记见 docs/billing-archive-register.md)。

M1-1 契约冻结 v1 齐套(2026-09-11):J1 面板技能/Agent 点名直调(诚实降级 200+ok:false, contract-j1-panel-invoke.md)· J2 统一入口分诊 (contract-j2-entry-triage.md)· J3 会话直通 (contract-j3-session-passthrough.md)· J4 用量报表。 同批加固:安全响应头默认开启(SECURITY_HEADERS=off 可关)、usage 事件保留策略默认 730 天 (USAGE_RETENTION_DAYS,0=永久)——详见 docs/release-notes-2026-09-11-optimization.md

IAW 缺口批次 + F 域余量反馈(2026-09-11):新增 flow-core 流程编排域(TF 编排 + 步骤状态机 / 模板库 contextPack / SLA 与进度 / 甘特时间轴,contract-c2-flow-tf.md)· 数据要素域(数据集登记 / 四维质量分 / 血缘反向追溯 / 指标字典口径仲裁)· 模型渠道治理 (分级路由 / 渠道组降级链 / 预算熔断,contract-c1-modelgw-channel-governance.md)· Agent 自治与 A2A(autonomy A0-A3 + 点名调用端点,contract-c3-agent-a2a.md)· IAM 场景级授权(sceneCode,deny→allow→fail-closed)· 审计证据锚点与场景维度时间线 · 通知中心持久化—— 详见 docs/release-notes-2026-09-11-iaw-batch.md


一、快速开始

npm install          # 安装依赖(@deepseek-ai/cordis)
npm start            # 启动平台(默认 http://127.0.0.1:7300)

打开 http://127.0.0.1:7300 进入管理控制台。首次启动在空数据目录上执行基线初始化(生产形态): 内置角色 + 根组织 + 平台管理员 admin(无任何演示业务数据)。

  • admin 口令取 ADMIN_PASSWORD 环境变量;未设置则随机生成,一次性写入 data/admin-initial-password.txt 并打印在启动日志(请立即登录并妥善保管)。
  • 忘记口令:清空数据目录重启,或由持有 iam.user.write 的管理员在「组织与账号 → 账号详情 → 重置口令」重置。

演示模式(评估/培训,自动生成完整演示数据与演示账号,口令均为 Ybk@2026):

DEMO_SEED=1 npm start   # 首次启动注入演示数据(组织树/演示账号/MCP/Skill/Agent/应用/28 天历史)
演示账号角色用途
admin平台超级管理员全功能
ops资源管理员MCP/Skill/Agent/应用管理
hr组织管理员组织/账号/三方同步
dev开发者提交 Skill、注册 Agent
audit审计员(只读)审计与告警

演示模式下钉钉免密登录可用(mock 连接器):登录页「钉钉扫码」输入工号 DD0002(林小满);生产基线不配置连接器,三方登录入口自动隐藏。

npm run selftest      # 功能自测:隔离实例(DEMO_SEED)端到端断言,全绿(数量以本次运行为准)
npm run lint:manifests  # 插件清单五面 YAML 校验
DSHCTL_USER=admin DSHCTL_PASS=*** node cli/dshctl.mjs help    # CLI 帮助(凭据经环境变量或 DSHCTL_TOKEN 提供)

平台自更新(v1.1+)

两类安装形态(GitHub 源码检出 / dsh 插件市场安装)都能感知上游仓库新版本,是否升级永远由管理员决定

  • 自动检查:默认每 24h 一次(启动 15s 后首查),比对远端 package.json 版本 + GitHub compare 提交差; 发现新版本 → 控制台顶栏「可更新」徽标 + platform.update.available 事件(audit 留痕)。控制台抽屉可开关/调频。
  • 手动升级:控制台顶栏徽标 → 抽屉「一键升级」(source 形态:git pull --ff-only + npm install,支持 dry-run 预演、原因留痕、完成后提示重启);CLI:dshctl update status | check | apply [--dry-run]; Agent 工具:update_status / update_check / update_apply。bundle 形态给出 dsh plugin update 指引。
  • 内网/限流GITHUB_TOKEN 提升限额;DSH_UPDATE_API_BASE / DSH_UPDATE_RAW_BASE 指向私有镜像; DSH_UPDATE_AUTO_CHECK=off 关闭自动检查。权限点:platform.update.read(查看/检查)、platform.update.apply(升级)。

企业部署 / Agent 一键接入:部署 runbook、dsh 运行时接入与「可直接下达给 dsh 自带 Agent 的一键部署指引」 见 docs/deploy-enterprise.md;日常运维 Agent 指引见 skills/dsh-ops-admin/SKILL.md

二、架构:一切皆插件

运行中的平台就是一棵 cordis 插件树(与 dsh 同一插件框架,@deepseek-ai/cordis)。 每个业务域 = 一个插件包,独立声明依赖/权限点/事件,可独立启停:

接入层   dsh-plugin-console        REST 网关 + 控制台 SPA + 工具桥 + 种子数据
业务域   dsh-plugin-iam            组织/账号/角色/用户组/三方连接器(钉钉演示)
         dsh-plugin-authn          双轨身份 + 令牌 + on-behalf-of 链
         dsh-plugin-mcp            部署/灰度/回滚/健康熔断/权限组/调用网关/监控(真实 HTTP 传输层)
         dsh-plugin-skillhub       提交→静态扫描→两级审批→版本化上架
         dsh-plugin-agent          Agent 本体(resource-core 底座 + 机器凭证)
         dsh-plugin-app            AI 应用(编排拓扑 + 应用指标 + 成本穿透)
         dsh-plugin-usage          计量管道(schema v1 / 幂等 / 死信重放 / 价格簿 / 三方对账 / 能力漂移)
         dsh-plugin-modelgw        模型接入网关(OpenAI 兼容真实转发 / 零价快照计量 / 内部成本参考)
         dsh-plugin-market         第三方与自营插件市场(契约五面 / Ed25519 验签 / L0 运行时 / 零价计量声明)
         dsh-plugin-audit          四类审计日志 + 告警规则 + 成本归集 + 审批中心
         dsh-plugin-connect        远程 dsh 接入(宿主角色:接入码/enroll/客户端管理;客户端角色:凭证申请 + 工具远程代理 + 本机配置页)
         dsh-plugin-update         平台自更新:上游版本检查(自动+手动)→ 通知 → source 形态一键升级(git pull + npm install,dry-run/审计/权限点)
         dsh-plugin-portal         门户数据通道(外部拉取端点·非核心:企业门户免鉴权只读拉取已上线应用/Agent/技能,CORS + 可见性留痕,PORTAL_SYNC=off 可停用,见 docs/portal-integration.md)
底座     dsh-plugin-resource-core  资源本体:属性 schema + 生命周期状态机 + 依赖图
基础层   dsh-plugin-platform-core  存储(JSON集合/原子落盘) + SQLite 事务存储 + YAML 解析 + 事件总线 + ToolRuntime-lite + HTTP

插件协作铁律:状态变更必发事件;跨插件联动只通过事件总线或扩展点(ctx.platformBus), 禁止直连对方数据。例:iam.user.frozen → authn 吊销全部令牌agent.offlined → 凭证吊销 + 绑定用户通知skill.deprecated → 引用 Agent 告警mcp.unhealthy → 熔断 + 审计

一份插件代码,两种宿主

  • 独立宿主(本项目默认):node src/main.ts 启动完整平台(控制台 + API + 工具)。
  • 完整 dsh 运行时cordis.yml 把同一批插件挂载进 dsh web——此时平台注册的 运维工具直接进入 dsh 原生 ToolRuntime、对模型可见可调用(provideToolRuntime: false), Agent 即可按自然语言运维整个平台(「列出所有 MCP 服务和健康状态」→ mcp_service_list, 「Skill 市场里能装什么」→ skill_search)。
  • 单进程单入口(宿主挂载形态)plugin-dsh-bridge 把榕器数据面(REST/控制台 SPA/docs/MCP) 以 /rq 前缀挂进 dsh webServer,dsh web 端口即唯一入口;startHttp: false 关闭平台独立端口。 配套 plugin-panel-core(部门 Agent 工作台面板)、plugin-dingtalk-bridge(群桥/审批推送/告警通道)、 plugin-rq-card(会话内四态执行卡,dsh.client 双面插件)。升级与运维须知 (AGENT_SSO_ENFORCE 上线门禁 / CORS 行为 / SSE 日志脱敏)见 docs/host-features-ops-notes.md

源码检出模式(本地开发)——两条硬性要求,缺一不可:

  1. cordis.yml 必须替换为 file:/// URL 形式的绝对路径 (Windows 下裸盘符路径会被 ESM 判为 ERR_UNSUPPORTED_ESM_URL_SCHEME);
  2. 本项目 node_modules/@deepseek-ai/cordis 必须指向 dsh 源码树的 vendor/cordis (junction),保证插件与宿主加载同一个 cordis 实例——两份实例会导致 ctx.plugin(类插件) 静默失效、服务链(iam→usage→audit…)全部 pending
# 一次性设置(PowerShell,替换两处路径为你的实际检出位置):
Remove-Item -Recurse -Force node_modules/@deepseek-ai/cordis
New-Item -ItemType Junction -Path node_modules/@deepseek-ai/cordis -Target D:\dsh-harness\vendor\cordis

# 之后每次(在 deepseek-harness 源码检出中):
pnpm dsh web --patch /cordis.yml

安装模式(发布使用)——dsh plugin add 走 pnpm 安装,补丁里的 entry 以 「包名 + 子路径」声明(Node 从 profile 目录沿 node_modules 解析,无需感知安装位置):

dsh plugin --profile web add github:01men/ybkk-AIOS
# 验证:dsh --profile web --dump-config 应列出全部 ops-* entry;
# 会话中问「列出所有 MCP 服务和健康状态」,模型应调用 mcp_service_list 而非静态作答。

安装模式的关键约束:@deepseek-ai/cordis 只在 devDependencies(本地开发/独立宿主用), 绝不能进 dependencies——否则 pnpm 会把它 hoist 进 profile 的 node_modules, 插件解析到第二份 cordis 实例,服务链整体失效(同上)。安装后插件沿 /node_modules → $DSH_HOME/profiles/node_modules(dsh 自建的宿主闭包 symlink) 解析到宿主自己的 cordis。

平台服务键已做宿主去冲突:JSON 存储服务键为 opsStorage(不是 storage—— dsh 宿主自带同名 storage 服务,曾导致 iam 等插件构造时拿到宿主服务、方法不存在而崩溃)。 tools 键是刻意共享的接缝:独立宿主下由 ToolRuntimeLite 提供,dsh 下即原生 ToolRuntime——37 个运维工具由此进入 dsh。

领域 Skill 手册skills/dsh-ops-*/SKILL.md)默认不随插件自动进入 dsh 技能系统 (dsh 只扫描 /.dsh/skills~/.dsh/skills 等根目录)。要让 Agent 获得 分领域操作手册,复制或链接一份:

# 用户级(所有会话可用):
cp -r skills/dsh-ops-* ~/.dsh/skills/
# 或项目级(仅当前项目):
mkdir -p .dsh/skills && cp -r skills/dsh-ops-* .dsh/skills/

远程 dsh 接入(第三种形态:免源码、免同机共享 data)

其他电脑经插件市场安装本平台后(安装模式见上),无需源码检出、也无需与宿主共享 data/ 目录——插件树中的 plugin-connectclient 角色运行,向宿主平台申请 机器凭证并把全部运维工具的执行远程代理到宿主(权限按模板收敛、全程审计):

宿主侧(管理员,一次性)            远程电脑(使用者,两条通道任选)
────────────────────────          ─────────────────────────────────
控制台「平台接入」页创建接入码   →   ① dsh 界面对 Agent 说:
(一次性,默认 15 分钟有效,           「接入宿主 http://宿主IP:7300,
 模板:readonly/operator/full)        接入码 enr_xxx…」
                                   Agent 调 connect_setup 自动申请口令
                                   ② 浏览器打开 http://127.0.0.1:7390
                                      本机配置页可视化填写/更新/断开

接入成功后:远程 dsh 里的 37 个运维工具自动切换为转发宿主执行(本地不再持有数据), 另新增 connect_status / connect_setup / connect_login / connect_test / connect_reset 5 个接入工具供 Agent 自助管理;客户端接入后默认每 5 分钟向 POST /api/connect/heartbeat 主动推送心跳(存活 + 工具数/运行版本/uptime 元信息,heartbeatIntervalMinutes=0 可关闭), 宿主控制台「平台接入」页可查看已接入客户端、最近使用与最近心跳, 并可随时禁用(联动吊销全部机器令牌,立即生效)。宿主侧另有 4 个接入管理工具 (connect_code_create / connect_codes / connect_clients / connect_client_disable)。

安全基线:接入码只存哈希(创建时一次性展示)、一次性消费、TTL 可配、按来源 IP 接入宿主既有失败锁定(15 分钟窗口 5 次锁定);机器凭证等价口令仅保存在远程电脑本机 (0600);enroll 端点公开但接入码本身即凭证。

详细流程与验收清单见 docs/deploy-enterprise.md 第四节。

已融合 OS-skill 模块设计(v1.1)

选择性吸收了 01men/OS-skill 两个模块中具有长远价值的设计(决策全记录见 docs/roadmap.md):

  • IdentityProviderAdapter 统一身份源抽象(auth-identity docs/03):三方登录主流程面向接口编程,钉钉/飞书/企微差异收敛在 Adapter 内
  • 引擎级唯一约束(红线工程化):collection.uniqueOn() 模拟数据库部分唯一索引,「一人一号」等业务唯一性由存储引擎兜底,取代「先查后插」
  • refresh_token 轮转链 + sid 会话(docs/06):access 30min + refresh 7d 仅存哈希、单次轮转,重放即整链吊销;前端 401 静默续期
  • state 防 CSRF + code 一次性消费 + 未命中绑定/注册分支(docs/04/05/07):完整的三方登录产品化流程
  • 自测含安全攻击演练(state/code/refresh 重放、唯一约束冲突),详见 npm run selftest

三A、生态平台 v1.2 交付(第 0–8 步,本迭代)

在 v1.0 基础上完成生态化演进(实施依据 docs/ecosystem-design-v1.2.md):

  • 执行层/连接器真实化(第 0 步):MCP 真实 HTTP JSON-RPC 传输层(探活/超时/错误路径/实测 tokens)、 钉钉真实 OpenAPI 连接器(corp token → 部门 BFS → 成员分页)、SQLite 事务存储(WAL/幂等唯一索引/只追加表)。
  • 令牌收紧(第 1 步)aud 受众校验 + 插件 scope 命名空间强制(唯一收敛面)。
  • 多租户最小集 + 计量管道(第 2/4 步):租户建模、schema v1 计量事件、先写后发、引擎级幂等、 死信重放、价格簿(计价时点费率快照)、三方对账、运行时能力漂移检测。
  • 契约五面 + L0 市场(第 3/7 步):第三方开发者身份域、契约五面 Ed25519 验签、内容扫描、 L1 门禁、审批上架/安装/卸载、L0 提示词运行时与计量、自营首批供给(M0-3 起零价计量声明)。
  • 模型接入网关(第 5 步,M0-3 改造后):真实 OpenAI 兼容转发(无 endpoint 拒绝调用,不造假 completion), 实测 input/output tokens 零价快照计量 + 内部采购成本参考。原「钱包/预算预检」随 plugin-billing 下线封存(M0-2)。
  • OIDC Provider(第 6 步):RS256/JWKS/discovery/authorize(一次性 code)/token/id_token/userinfo, 账号冻结令牌即时失效。
  • 钱包/复式分账(原第 5/8 步)→ 已下线封存(M0-2,2026-09-09):功能面(充值/流水/预算/结转/冲正)与 API、权限点全部移除;存量流水导出 CSV 只读封存 90 天(登记与销毁日期见 docs/billing-archive-register.md)。
  • 验收:npm run selftest 244/244npm run lint:manifests 60/60;KBaaS/连接器市场/合规门户与 L1 有码沙箱为下一迭代(设计见 docs/roadmap-9-10.md)。

三B、评审缺陷修复与资产运营(本迭代,v1.3)

针对外部技术评审(严重 S1–S4 / 中等 M1–M5 / 轻微 L1–L4)逐项整改:

  • S1 归集对账硬缺陷(原则沿用):归集/对账不符即拒绝的原则保留在 usage 管道(reconcile/消费水位); 其原本针对的账期结算子系统已随 plugin-billing 下线封存(M0-2)。
  • S2 密钥轮换宽限期:轮换不再立即吊销全部令牌——旧密钥进入 24h 验签宽限期,在途请求不掉线, refresh 随时换取新密钥令牌,全局无感轮换。
  • S3 暴力破解防护:登录 / Client Credentials / SSO 绑定 / OIDC 授权与换牌全部接入失败锁定 (15 分钟窗口 5 次失败锁定,时长逐次升级至 24h,持久化防重启绕过,触发即告警)。
  • 崩溃恢复:认证类集合(令牌/主体/锁定计数)即时落盘并 fsync,登出/吊销返回 200 后被杀不丢失; 坏 JSON 集合文件自动备份为 *.corrupt-* 并显式告警,不再静默当空集合。
  • 计量消费幂等(重放不双计):引擎级消费水位(usage_consumptions 唯一索引)——replay/死信重投 对 audit 投影零重复副作用;消费失败真实即时重试 3 次后入死信,支持一键重投。
  • OIDC 收敛:scope 白名单(openid/profile/email)、PKCE S256 全链路、JWT 校验 iss/aud/kid; issuer 支持 OIDC_ISSUER 环境变量对外声明。
  • MCP 熔断业务化:真实调用失败与探活失败共用连续失败计数(连续 3 次开熔断,业务成功即半闭合); 回滚目标版本校验(当前版本/已回滚版本不可作为目标)。
  • 多租户隔离补全(M1):计量事件查询支持 tenant_id 过滤;审计/计量口径一致。
  • M2 撤销列表收敛:吊销状态全量走持久化令牌记录(去掉进程内无限增长集合), 过期令牌 7 天后物理清理(启动 + 每日巡检);refresh 哈希索引化查询。
  • 企业 AI 资产运营(新)资产运营 控制台页 + REST——统一台账(MCP/Agent/应用/Skill/模型路由 五类资产一处盘点,含归属组织、负责人、健康、近 N 天调用与消耗)、一键健康巡检(批量探活留审计)、 用量与成本穿透报表(Top 资产 / 主体分摊 / 日趋势,零价快照 + 内部成本参考口径、单位 DAU 成本) 与下架分析(弃用/下线原因聚合)。
  • 商业模式收敛(M0 决策,2026-09-09):取消按用量计费/转售/分账形态,平台以私有化年费 + 治理包交付; 计量管道保留为用量透明与内部成本参考(J4 报表口径),对外不呈现任何金额结算语义。

三C、应用统一身份接入 App SSO(本迭代,v1.4)

企业内自研 AI 应用上线前完成身份纳管——「注册应用 → 签发 SSO 凭据 → 上线门禁 → 跳转登录」闭环 (设计:docs/dev-plan-app-sso.md · 执行版:docs/app-sso-实施计划-执行版.md · 接入文档:docs/app-sso-integration.md):

  • 浏览器授权流(协议合规面)GET /oauth/authorize 校验(response_type/client/redirect_uri 白名单/scope 白名单/强制 PKCE S256)→ 落授权请求(5 分钟单次消费)→ 302 平台授权页 /#/oauth/authorize?req=; 失败一律 302 平台错误页(绝不携带外部 redirect_uri,防开放重定向);POST /api/authn/oidc/authorize 用户确认(human-only,consent 卡片)→ code/state/iss(RFC 9207)回跳。 旧账密式 POST /oauth/authorize 已删除
  • 授权页登录面板支持钉钉免密:无平台会话的授权页内嵌登录面板提供「账号密码 / 钉钉扫码」双入口 (钉钉入口按 /api/auth/providers 连接器配置显隐)——钉钉用户在授权页内即可完成免密登录 (首次身份走绑定/注册分支),无需预登录控制台,随后直接进入授权确认,全程闭环在 SSO 流内。
  • 换牌协议面client_secret_basic + client_secret_post 双认证 × form/JSON 双编码;错误码状态码 归位(invalid_grant→400、invalid_client→401+WWW-Authenticate);access/id token 打标 token_use; userinfo 校验 token 类型与 aud 受众,email claim 按 scope 裁剪;JWKS 数组化(kid 匹配验签)。
  • 应用 ↔ SSO 打通:应用详情「SSO 配置」tab——owner 签发(secret 一次性)、回调行内编辑、轮换、 禁用/启用、discovery 一键复制;GET /api/apps/:idsso 块。「认证与令牌」新增 OIDC 客户端全局 管理面。owner-based 授权为全库首例(human 且 app.ownerId === userId,或持 authn.oidc.write; 机器一律 403)。
  • 上线门禁双点requestOnline() 早反馈(APP_SSO_ENFORCE 默认 web,h5 形态须有 active 客户端, 审批单快照 ssoClientId)+ app.online 审批执行器执行期复核(挂单期间禁用 → 上线失败留痕)。
  • 生命周期联动app.offlined/app.archived → 客户端禁用(refresh 链吊销);app.onlined → 启用; app.updated → 客户端名称同步(plugin-app 补发历史缺失事件)。
  • 会话补全与安全闭环(P3):refresh_token 轮转 grant(一次一换、重放整链吊销、scope 只收窄、 实时校验用户状态);/oauth/end_session(id_token_hint 定位 client + postLogoutUris 白名单 + 登出即 吊销 refresh 链);/oauth/revoke(RFC 7009,access jti 黑名单 / refresh 整链,恒 200);JWKS 密钥 轮换端点(新 key 签名、旧 key 24h 宽限验签);冻结/禁用客户端全链即时失效。
  • public 客户端(D-a 决策):纯前端 SPA 可签发 public 形态(免 secret + 强制 PKCE + 不发 refresh), BFF 架构仍为 confidential 推荐形态(文档双指引)。
  • 双 TTL:OIDC access 默认 2h(OIDC_ACCESS_TTL_SECONDS)/ refresh 默认 7d(OIDC_REFRESH_TTL_SECONDS), 与平台会话(30min/7d)独立可调;授权码与授权请求 5 分钟单次消费。
  • 「平台接入」外部接入总览:机器凭证(按绑定资源分组)+ OIDC 客户端(含关联应用)+ 远程 dsh 客户端一处盘点,跳转对应管理页。
  • 应用指标主动上报(接入即监测):外部应用可向宿主推送产品指标——POST /api/apps/:id/metrics-reportapp.write)/ app_metrics_report 工具 / CLI app report 三端同契约(PV/UV/DAU/会话/会话深度/7 日留存, 同日 PV 累加、UV/DAU 取最大,可指定 date 补录历史);计量事件推送走 POST /api/usage/recordusage.write,schema v1 + 幂等键,CLI usage record,resource 支持 mcp: / skill: / nas: / model: / plugin:;meter key 须与价格簿一致——mcp:* 用 tokens、model:* 用 output_tokens,不符硬拒绝且报错直接给出期望键),宿主侧据此外部应用全生命周期监测。
  • 一行 SDK 式接入验证:selftest 内置 openid-client(v6)冒烟——discovery 驱动走通 authorize → token → userinfo → refresh → revoke → end_session 全链(标准客户端真实姿势回归)。

三D、NAS 资产纳管 + Skill 包 NAS 存储 + 平台三端调用(本迭代,v1.5)

NAS 成为第六类受管资产(FS 文件存储类),Skill 上架产物可直传 NAS,平台能力对 CLI / REST / MCP 三端同构开放 (设计与可行性结论:docs/dev-plan-nas.md):

  • plugin-nas(resource-core Pattern A):以 synology-filestation-mcp 这类「MCP 文件网关」为访问通道—— 平台持有网关地址 + Bearer 令牌 + X-NAS-IP 设备路由头,全部文件操作经网关 tools/call 完成 (fs_list/fs_upload/fs_delete/fs_search 等),不直连 DSM 私有 API。属性表三组(基本/接入/治理)、 生命周期 draft → online → offline → archived(上线前 initialize 探活护栏)、健康巡检接入资产运营、 写类操作审计留痕、令牌回显脱敏。
  • mcpServers JSON 一键纳管POST /api/nas/import(CLI nas import / 控制台导入弹窗)直接吃 synology-filestation 形态的 mcpServers 配置 → 创建资产 → 探活 → 上线 → 工具发现。
  • Skill 包 NAS 存储GET/PUT /api/skill-storageskill.storage.write)配置包后端 local | nas(引用已纳管 NAS 资产 + basePath,凭证不重复配置)。上架时:提交携带的 packageBase64(CLI skill submit --package= / 控制台附件)原样上传;无包时由 platform-core 零依赖 ZIP 打包器(zip.ts,deflate + CRC32)从 SKILL.md 现场打包 → 平台 staging → 网关 fs_upload → 版本记录回写 package { storage, nasId, path, sizeBytes }fail-closed:上传失败即上架失败。部署约束fs_upload 在网关进程侧读本地路径, 平台与网关需同机或共享卷(资产 stagingDir 可配共享挂载点)。
  • 平台即 MCP ServerPOST /mcp(Streamable HTTP 纯 JSON 形态)