dsh-feyagate
DSH plugin that installs, supervises and auto-upgrades the local miloco-mcp-server background service, bridges its MCP tools into DSH and adds service, account and license settings panels.
Install
dsh plugin --profile web add dsh-feyagate
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-feyagate-gateway
这个文件解决什么问题:让三类读者各自在 3 分钟内找到自己要看的东西 —— 想装的人拿到最短安装路径,想贡献的人拿到开发环境与目录职责,关心合规的人拿到"仓库里到底有什么、没有什么"。

npm 包名 dsh-feyagate · 版本 0.3.6
0.3.6:新增「开放接口」页 + 引擎改用产品名 + 反馈入口(界面与文案层,宿主能力未变)
- 新增第 7 个分区「开放接口」:把网关的 MCP 与 HTTP 两个接口面搬进设置页 ——
MCP 地址按实时端口拼出并可一键复制、「接入配置片段」下拉可在通用 mcpServers
JSON 与纯地址之间切换;HTTP 端点速查表每行带复制 curl(引号已按 CMD / POSIX
双兼容转义);另有 API 文档入口与服务未运行时的明确提示。
文档正文见 [docs/api.zh.md](docs/api.zh.md)(MCP 握手、工具调用示例、端点参数、
端口发现方式、安全边界与常见问题),页面上只放链接,保证只有一份正文要维护。
- 引擎统一叫「FeyaGate MCP 引擎」:miloco-mcp-server 是实现细节,界面不再要求
用户认识 "miloco" 这个词(见 ENGINE_DISPLAY_NAME);下载文件名示例等事实性
文案仍然照实写。
- 顶栏第二行改为常驻入口:「GitHub 仓库」「问题反馈」直接跳转,不再显示
"免费试用还剩 N 天" —— 各平台剩余天数各不相同、0 又表示"没有试用期/已用完",
压缩成一句只会误导;每个平台的详情回到「授权 › 平台能力」看。
- 日志页新增「去 GitHub 反馈」,配合「复制全部」把日志带到 Issues。
- 「门面端口」更名为 「MCP server 端口」(字段与行为不变,只是叫法按用户视角)。
0.3.5(历史):设置页交互重做 + 授权页免费版文案修正(纯界面与展示层,宿主能力未变)
- 一屏只有一个主按钮。 顶部常驻状态条右侧只出现"现在该做的那一件事"(没装→安装、
没跑→启动、一切正常→不放按钮);原来"顶部大按钮 + 页内按钮"两个入口会各自触发安装,
现在两处共用同一段逻辑(同一个 busy、同一套错误文案)。
- 版本卡合并。 原「版本」+「指定版本」两张卡合成一张:一句结论(尚未安装 / 发现新
版本 vX / 已经是最新)+ 本机版本与最新可用两个事实 + 主按钮;「重装 / 指定版本 /
允许无校验值 / 回滚 / 兼容区间」全部收进折叠的「更多安装选项」。
- 卸载整卡默认折叠,两个危险按钮不再常驻页面。
- 每个分区加一句职责说明;顺序调整为「服务 → 平台登录 → 账号总览 → 授权 → 设置 → 日志」。
- 平台登录页新增"登录之后能干什么"小表(设备 / 摄像头 / 场景与定时 / 自动化都在聊天里
让模型调工具完成),并保留凭据只走本机回环的说明。
- 授权页免费版文案修正:免费版不再显示 —(永久或未订阅) 与
— · 还剩 0 天,改为无限期(免费版)/无限期(免费版不涉及);米家永久免费
不再显示"试用剩 0 天"。根因是子进程用空字符串表示"没有",而旧代码用 ?? 兜底
挡不住空串;现在src/child-api.ts把空值一律归一为null,并且宽限期没有到期时间时
不再把 grace_period_remaining = 0 当成"还剩 0 天"。
> ⚠ 注意 pnpm 的发布冷静期:pnpm 11 默认 minimum-release-age = 24h,
> 刚发布的版本用 dsh plugin add dsh-feyagate 可能仍装到上一个版本(会被静默降级,
> 并往pnpm-workspace.yaml写minimumReleaseAgeExclude)。要立刻装到 0.3.5,
> 请写全版本号:dsh plugin --profile <profile> add dsh-feyagate@0.3.5。
0.3.4(历史):Windows 上「安装后台服务」必然失败。0.3.3 的清单里
channel.stable["win-x64"] 指向 v1.2.19,而该版本上游**只发了 zip、没有
.sha256sidecar**,清单只能记sha256: null;安装流程的设计是"没有校验值一律拒装",
于是 Windows 用户点按钮只会看到「上游未为 … 提供校验值」。0.3.4 把 win-x64 的默认
版本改成 v1.2.21,并修掉让这个坏清单通过 CI 的原因:verify-manifest.mjs 现在
按运行时同一套排序取真正会被下载的资产,并把"默认装不上"从 warning 升级为错误,
另加 scripts/check-manifest-guard.mjs 用真清单钉死这条规则。
0.3.1 变更(历史):重新生成manifest/server-manifest.json。上游miloco-mcp-serverv1.2.20 的 mac-arm64 产物
已于 2026-09-25 重新打包并覆盖发布(旧包缺 4 个依赖库导致启动即 dyld: Library not loaded,且 MQTT 未编入
导致华为设备能登录却无法控制)。清单里的 sha256 必须跟着更新,否则安装会以校验不通过结束 ——
请先升级插件到 0.3.1 再安装/升级后台服务。
一句话
FeyaGate(飞阳网关)的 DSH 插件:在 DSH 里托管本机的后台服务 miloco-mcp-server(自动下载 → 校验 → 安装 → 守护 → 升级 → 失败回滚),把它的 76 个 MCP 工具(数量出自 FeyaGate_MCP_API.md §4)接进 DSH,并在设置面板里提供「服务 / 账号 / 授权」三个管理界面。
插件本体开源(MIT);真正的智能家居逻辑在闭源二进制里,二进制不进这个仓库、不随 npm 包分发,运行时从权利人自己的渠道下载并按清单校验(见 [NOTICE](NOTICE))。
用词约定(全文一致):平台账号相关一律说「登录」,只有许可证才说「授权」;本机这个进程一律叫「后台服务」,不叫「网关」;「飞阳网关」是产品名与设置入口名。
架构一眼看完
┌─────────────────────────────── DSH 宿主进程 ────────────────────────────────┐
│ │
│ ┌────────────────────────┐ ┌─────────────────────────────────────┐ │
│ │ 浏览器半侧 lib/client.js│ 同源 │ Host 半侧(插件本体,进程内运行) │ │
│ │ 设置 › 飞阳网关 │ ◄────► │ /dsh-feyagate/* 管理 API │ │
│ │ [服务][账号][授权] │ HTTP │ 安装·校验·守护·升级·生成 config.yaml │ │
│ └────────────────────────┘ └──────┬──────────────────┬───────────┘ │
│ │ ① spawn / 健康轮询 │ ② 常驻 │
│ ┌───────────────────────────────┐ │ /health │ │
│ │ @deepseek-ai/dsh-mcp-client │ HTTP │ ▼ │
│ │ serverName: feyagate │ ─────► │ ┌────────────────────┐ │
│ │ 工具名 mcp__feyagate__* │ │ │ MCP 门面 :38081 │ │
│ └───────────────────────────────┘ │ │ 秒答 initialize │ │
│ ▲ 模型在对话里调用 │ │ 就绪后代理工具调用 │ │
│ │ │ └─────────┬──────────┘ │
└─────────┼──────────────────────────────────┼──────────────────┼────────────┘
│ ▼ │ ③ 代理
│ ┌──────────────────────────────┐ │
│ │ 后台服务 miloco-mcp-server │◄─┘
│ │ 127.0.0.1:38080(可漂移) │
│ │ POST /mcp/http · GET /health │
│ │ 落盘 ~/.dsh/dsh-feyagate/ │
│ └───────────┬──────────────────┘
│ │ HTTPS / P2P / MQTT
│ ▼
│ 小米云 · 涂鸦云 · 美的云 · 易微联 · 华为云 · Home Assistant
│ ▲
│ │ 局域网
└─────────────── 米家摄像头 · 小爱音箱 · 小智终端
三条要点:
1. 桥连的是插件自己的常驻门面,不是子进程。门面端口写进 state.json,由 [cordis.patch.yml](cordis.patch.yml) 里的 !!js 表达式在 boot 时读取;子进程没装也能秒回 initialize(只返回空工具表),因此"先启动 DSH 再装服务"不会烧掉 MCP 桥的重连预算,升级窗口对模型也是零感知。tools/list_changed 的送达是最终一致的:桥的 SSE 流建立时若子进程已健康,门面立即补发一次;通知发出时若暂无客户端流,则标记 pending 并有界重发(5s/次、上限 12 次)——两种时序下桥都不需要重启 DSH 即可拿到工具列表。
2. 子进程真实端口是运行期细节。默认 38080,被占用时在 20 个端口范围内漂移;期望端口进 state.json 的 server.port,实际生效的端口在启动这一轮写进生成的 config.yaml,不写进任何静态配置。
3. 安装根目录本身是不可移动的。config.yaml 就放在根目录,子进程把设备身份与许可证锚定在 config.yaml 所在目录 —— 根目录一换就等于换了一份身份(见下方「数据在哪里」与 [ADR-0002](docs/adr/0002-install-directory.md))。
安装与最短路径
1. 装插件
dsh plugin --profile <profile> add dsh-feyagate
<profile> 是你要装进去的 profile 名(例如 web)。这条命令把参数原样转发给 pnpm,并在 package.json 里看到 dsh.bundle.patch 后把本插件
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::6,最后更新 2026-10-11