READMESource: main@14562787
dsh-obscura-plugin
DeepSeek Harness 的 Obscura 懒人插件:在DeepSeek Harness启动时自动拉起 obscura 的 MCP 服务
安装与使用的详细说明见 INSTALL.md。
dsh plugin --profile web add github:SodiumLayer/dsh-obscura
它做什么
| 需求 | 实现 |
|---|---|
| DSH 启动时自动启动 obscura 的 MCP 服务 | 宿主半在启动序列里解析可执行文件并 spawn obscura mcp --http --port <port>,轮询 MCP 握手确认真的可用,随 DSH 退出停止(只停自己启动的进程) |
| 报告 obscura 是否可用 + 不可用时的下载入口 | 面板只显示一条 版本 信息,来自真实执行的 obscura --version ;拿不到版本就显示「不可用」 |
| 插件目录内放置可执行文件 + 一键跳转 | 包内 bin\ 目录 + 面板「打开文件夹」按钮;解析优先级:自定义路径 → 系统 PATH → 插件 bin\(含解压出的子目录)。自定义路径既接受可执行文件,也接受它所在的文件夹 |
| 一键测试 harness 是否已接入 obscura MCP | 「测试接入」分两段:服务段直接请求面板上那个 MCP 接入地址做 initialize + tools/list;接入段读 loader 条目与 mcp__obscura__* 工具数 —— 分开才能区分「服务没跑」与「服务在跑但没接入」 |
| MCP 配置开关 + 接入地址 | 开关:开 = 在 profile 的 cordis.patch.yml 写入/复用它的一行 mcp-obscura;关 = 移除该行。接入地址文本框留空则随 --port 自动生成 http://localhost:<端口>/mcp,填写则用你的地址;端口/地址变化时配置行自动跟随,手工改错了则会被明确提示不一致 |
| 服务控制 | 启动服务 / 重启服务 / 停止服务 三个按钮,外加一个自定义启动参数文本框:插件只固定子命令 mcp,host、port、stealth 等全部由这个框决定(默认 --http --host 127.0.0.1 --port 3000) |
设计要点(为什么这样写)
- 零运行时依赖:宿主半只用 node 内置模块。面板不依赖任何前端库(只用宿主注入的
react)。 - patch 文件逐行编辑:
cordis.patch.yml是你拥有的文件。本插件只替换/删除/追加mcp-obscura那一行,文件头注释、其他插件行、以及它无法解释的!!js表达式逐字节保留(有往返不变性单测)。 - 绝不假装成功:文件存在 ≠ 能运行(要真执行
--version);进程在跑 ≠ 服务健康(要真发 MCP 请求);写入配置 ≠ 已生效(挂载发生在启动时,面板会说要重启)。 - 不越界:不结束别人的进程(端口被占就报冲突)、不接管外部实例的生命周期、不联网下载其他文件、
open-folder只允许打开自己的bin。 - 所有权由子进程句柄决定,不由一个布尔标志决定:只要本实例持有子进程句柄,那个进程就是「我们的」,停止服务一定杀得掉。曾经额外依赖一个
owned标志,导致重复点「启动服务」时把自己刚拉起的监听误判成外部实例、清掉标志,从此停止服务也杀不掉它 —— 这是已修复的真实缺陷。 - 参数框是唯一控制面:插件只固定
mcp子命令与「按参数里的--port连接」这件事,主机/端口/stealth/proxy 全部来自参数框;--port决定健康检查与 harness 接入地址,因此改端口会跟着改,缺--http会明确报错而不是静默跑 stdio。 - 配置行是设置的投影,不是第二个真源:
cordis.patch.yml里那一行由effectiveMcpUrl()生成并随设置自动重写。曾经两者各自演化,导致面板测的是新端口、harness 指着旧端口 —— 面板现在还会在两者不一致时明确报警,而不是把旧值当「服务段」显示出来。 - 状态只有一个真源:MCP 开关反映的是
cordis.patch.yml里那一行是否存在,而不是「是否已挂载」;挂载与否由「测试接入」的接入段报告。两者不混为一谈。 - 一个开关只留一处:
stealth曾是独立设置项,现在被折算进启动参数(旧的stealth: true会自动迁移),面板上每个能改变行为的项都看得见、改得动。 - 不阻断 DSH:Obscura 的任何失败都收敛为面板上的一个状态与一行原因,而不是启动异常。
- 采用宿主事实:profile 的
dir/patchPath取自主机的profileContext,不靠猜 —— 否则自定义 profile 会改错文件。
许可
非官方声明
本项目是第三方插件,与 DeepSeek(DeepSeek Harness)及 Obscura 上游均无隶属关系,亦未获其背书;相关名称与商标归各自所有者
本仓库不包含、也不分发 obscura 的任何二进制或源码:bin/*.exe 请自行从上游获取,并自行遵循其许可条款
No comments yet. Be the first to write one.