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

ChatGPT 推理桥 2025ashore/DSH-Brain-Bridge

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

把 DSH 上下文转发给 ChatGPT 换取单步决策

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 2025ashore/DSH-Brain-Bridge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 69 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

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

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

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

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 52 处,展示前 44 条)
  • 发起网络请求
    browser-autowake/background.js:6
    const response = await fetch(GATEWAY_STATUS_URL, { cache: 'no-store' });
  • 读取本地文件
    browser-autowake/cdp-daemon.mjs:23
    const parsed = JSON.parse(readFileSync(MODEL_BINDINGS_FILE, 'utf8'));
  • 读取密钥环境变量
    browser-autowake/cdp-daemon.mjs:29
    const BINDING_KEY = process.env.DSH_BRAIN_BINDING_KEY || loadBindingKey(ROUTE);
  • 发起网络请求
    browser-autowake/cdp-daemon.mjs:59
    const response = await fetch(url, { cache: 'no-store', signal: controller.signal, ...options });
  • 执行外部命令固定命令
    browser-autowake/cdp-daemon.mjs:137
    const child = spawn('/bin/bash', [RECOVERY_SCRIPT, 'recover-browser'], {
  • 发起网络请求
    browser-autowake/direct-ui-browser.mjs:166
    const response = await fetch(`${cdpBase}/json/new?${temporaryUrl}`, { method: 'PUT' });
  • 发起网络请求
    browser-autowake/direct-ui-browser.mjs:185
    try { await fetch(`${cdpBase}/json/close/${encodeURIComponent(target.id)}`); } catch {}
  • 发起网络请求
    browser-autowake/direct-ui-browser.mjs:193
    try { await fetch(`${page.cdpBase}/json/close/${encodeURIComponent(page.id)}`); } catch {}
  • 读取本地文件
    browser-autowake/direct-ui-worker.mjs:10
    const config = JSON.parse(readFileSync(process.env.DSH_DIRECT_CONFIG || `${ROOT}/config.json`, 'utf8'));
  • 读取密钥环境变量
    browser-autowake/direct-ui-worker.mjs:12
    const STATIC_TOKEN = String(process.env.DSH_DIRECT_STATIC_TOKEN || config.staticToken || '');
  • 发起网络请求
    browser-autowake/direct-ui-worker.mjs:53
    const response = await fetch(`${GATEWAY}${path}`, {
  • 发起网络请求
    browser-autowake/fresh-bootstrap.mjs:15
    const response = await fetch(url, options);
  • 发起网络请求
    browser-autowake/fresh-bootstrap.mjs:281
    try { await fetch(`${CDP_BASE}/json/close/${encodeURIComponent(target.id)}`); } catch {}
  • 读取本地文件
    server.cjs:51
    return JSON.parse(fs.readFileSync(file, 'utf8'));
  • 读取密钥环境变量
    server.cjs:60
    const OWNER_PASSWORD = process.env.DSH_MCP_OWNER_PASSWORD || config.ownerPassword;
  • 读取密钥环境变量
    server.cjs:61
    const STATIC_TOKEN = process.env.DSH_MCP_STATIC_TOKEN || config.staticToken;
  • 读取本地文件
    server.cjs:75
    const passwdRow = fs.readFileSync('/etc/passwd', 'utf8').split(/ ? /).find(line => line.startsWith(`${COMMAND_USER}:`));
  • 写入本地文件
    server.cjs:98
    fs.mkdirSync(STATE_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    server.cjs:149
    fs.writeFileSync(tmp, JSON.stringify(persisted) + '\n', { mode: 0o600 });
  • 写入本地文件
    server.cjs:150
    fs.renameSync(tmp, FUSION_STATE_FILE);
  • 读取本地文件
    server.cjs:754
    while (probe !== WORKSPACE_ROOT && !fs.existsSync(probe)) probe = path.dirname(probe);
  • 执行外部命令来自配置/变量
    server.cjs:883
    const child = spawn(binary, args, { env: { ...minimalCommandEnv(), ...envOverrides }, stdio: ['ignore', 'pipe', 'pipe'] });
  • 读取本地文件
    server.cjs:937
    if (!fs.existsSync(presetFile)) return host;
  • 读取本地文件
    server.cjs:939
    const rows = YAML.parse(fs.readFileSync(presetFile, 'utf8'));
  • 读取本地文件
    server.cjs:956
    const body = fs.readFileSync(file, 'utf8');
  • 执行外部命令固定命令
    server.cjs:1012
    ? spawn('/bin/setpriv', [
  • 执行外部命令来自配置/变量
    server.cjs:1021
    : spawn(program, args, { cwd, shell: false, env: minimalCommandEnv(), stdio: ['ignore', 'pipe', 'pipe'] });
  • 发起网络请求
    server.cjs:1412
    const req = http.request({ host: '127.0.0.1', port: 3080, path: '/', method: 'GET', timeout: 3000 }, res => {
  • 写入本地文件
    server.cjs:1519
    fs.writeFileSync(tmp, JSON.stringify(oauth, null, 2) + '\n', { mode: 0o600 });
  • 写入本地文件
    server.cjs:1520
    fs.renameSync(tmp, OAUTH_STATE_FILE);
  • 写入本地文件
    server.cjs:1521
    try { fs.chmodSync(OAUTH_STATE_FILE, 0o600); } catch {}
  • 读取密钥环境变量
    server.strict.cjs:56
    const OAUTH_ACCESS_TOKEN_MS = Math.max(15 * 60 * 1000, Number(process.env.DSH_OAUTH_ACCESS_TOKEN_MS || 60 * 60 * 1000));
  • 读取密钥环境变量
    server.strict.cjs:59
    const OAUTH_REFRESH_TOKEN_MS = Math.max(24 * 60 * 60 * 1000, Number(process.env.DSH_OAUTH_REFRESH_TOKEN_MS || 180 * 24 * 60 * 60 * 1000));
  • 读取本地文件
    server.strict.cjs:85
    return JSON.parse(fs.readFileSync(file, 'utf8'));
  • 写入本地文件
    server.strict.cjs:90
    fs.writeFileSync(temp, JSON.stringify(value) + '\n', { mode: 0o600 });
  • 写入本地文件
    server.strict.cjs:91
    fs.renameSync(temp, file);
  • 写入本地文件
    server.strict.cjs:92
    try { fs.chmodSync(file, 0o600); } catch {}
  • 读取密钥环境变量
    server.strict.cjs:99
    const OWNER_PASSWORD = process.env.DSH_MCP_OWNER_PASSWORD || config.ownerPassword;
  • 读取密钥环境变量
    server.strict.cjs:100
    const STATIC_TOKEN = process.env.DSH_MCP_STATIC_TOKEN || config.staticToken;
  • 写入本地文件
    server.strict.cjs:111
    fs.mkdirSync(STATE_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    server.strict.cjs:112
    try { fs.chmodSync(STATE_DIR, 0o700); } catch {}
  • 读取本地文件
    server.strict.cjs:227
    if (fs.statSync(TRACE_FILE).size < TRACE_MAX_BYTES) return;
  • 删除本地文件
    server.strict.cjs:229
    try { fs.rmSync(backup, { force: true }); } catch {}
  • 写入本地文件
    server.strict.cjs:230
    fs.renameSync(TRACE_FILE, backup);
扫描于 2026/11/1(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 获取单步决策
  • 接入外部推理服务

一个严格的 MCP 推理网关,把 DeepSeek Harness 智能体接到 ChatGPT Web 上,当作外部推理服务商。

README

由 DeepSeek 最新模型翻译生成
DSH ⇄ ChatGPT 融合网关 一个极简的 MCP 桥接器,将 DeepSeek Harness(DSH)保持为唯一的智能体与运行时,并仅将 ChatGPT Web 用作无状态的、单轮的推理提供方。 DSH 拥有智能体、工具、权限、会话、压缩、子智能体、工作流、目标以及真实的文件/Shell 执行。网关仅将一份不可变的 DSH 上下文快照转发到 ChatGPT “Brain” 对话,并仅回传一个决策——一个最终答案、一个动作提议,或一个有界的只读批次。网关自身从不执行所提议的动作。 User ↓ DSH UI ↓ DSH Native Agent Loop → Context / Compaction ↓ ChatGPT Fusion LLM Adapter ↓ Fusion Reasoning Gateway ← this repository ↓ ChatGPT Brain Worker (a dedicated ChatGPT Web conversation + optional wake extension) ↓ final | action_proposal | readonly_batch ↓ Gateway validation ↓
展开完整文档(README 剩余 1 节)
DSH ⇄ ChatGPT 融合网关

一个极简的 MCP 桥接器,将 DeepSeek Harness(DSH)保持为唯一的智能体与运行时,并仅将 ChatGPT Web 用作无状态的、单轮的推理提供方。

DSH 拥有智能体、工具、权限、会话、压缩、子智能体、工作流、目标以及真实的文件/Shell 执行。网关仅将一份不可变的 DSH 上下文快照转发到 ChatGPT “Brain” 对话,并仅回传一个决策——一个最终答案、一个动作提议,或一个有界的只读批次。网关自身从不执行所提议的动作。

User
↓
DSH UI
↓
DSH Native Agent Loop → Context / Compaction
↓
ChatGPT Fusion LLM Adapter
↓
Fusion Reasoning Gateway ← this repository
↓
ChatGPT Brain Worker (a dedicated ChatGPT Web conversation + optional wake extension)
↓
final | action_proposal | readonly_batch
↓
Gateway validation
↓
DSH Permissions / ToolRuntime → DSH Native Tool → Next DSH Tick

功能特性

- 严格单结果推理契约 —— 每个请求都携带一份完整、不可变的快照;Brain 仅返回一个终止结果(final、action_proposal,或一个有界的 readonly_batch,包含 read/glob/grep)。
- 可恢复投递 —— 请求会被记录到磁盘日志;崩溃的网关会恢复进行中的认领,而不是丢失它们。通过快照 + nonce 实现幂等重试。
- 多工作节点故障转移 —— 多个 Brain 对话可以为同一模型路由提供支持;停滞的认领会通过轮换的 nonce 被释放并重新投递给健康的备用节点。
- OAuth 2.0(回环) —— 为公共 ChatGPT 连接器(/brain-mcp)提供可选授权,并带有轮换的访问/刷新令牌。
- 跨平台 —— 网关和 Node 守护进程可在 Linux、macOS 和 Windows 上运行。
- 可选的浏览器唤醒 —— 一个 Chrome 扩展(browser-autowake/)轮询回环队列元数据,并在有工作等待时唤醒绑定到路由的 Brain 标签页。

环境要求

- Node.js 18+(使用全局 fetch)。
- git(在 Linux 上,还需要你配置的命令用户)用于工作区工具。

DSH 本身必须可用于 DSH 原生智能体循环和工具运行时;网关会自动检测 DSH 捆绑的 node_modules,或者你可以通过 DSH_NODE_MODULES 环境变量将其指向那里。

快速开始

git clone
cd dsh-chatgpt-mcp
npm install

将真实凭据放入 config.json 和 model-bindings.json(所有值均以 REDACTED_ 占位符形式提供),然后启动:

npm run daemon:start # background, supervised with auto-restart
npm run daemon:status

……或在前台运行:

npm start # node server.strict.cjs

网关绑定 http://127.0.0.1:7688。详细的架构与不变量见 ARCHITECTURE.md。

配置

config.json

| 键 | 含义 |
| host / port | 回环绑定地址(默认 127.0.0.1:7688)。 |
| workspaceRoot | 工具可访问的项目工作区。. = 项目根目录。 |
| ownerPassword | 用于 OAuth 授权的所有者密码(≥ 16 个字符)。 |
| staticToken | 用于回环 Brain MCP 的静态 bearer token(≥ 32 个字符)。 |
| allowedPrograms | 工作区 run_command 工具可启动的可执行文件。 |
| commandUser | 仅限 Linux:沙箱化命令通过 setpriv 降权到的用户。 |

ownerPassword、staticToken 以及绑定键是必填项,使用前必须填写。
在 macOS/Windows 上没有可移植的 setuid 辅助程序,因此沙箱化命令以当前用户身份运行, commandUser 会被忽略。

model-bindings.json

将每个 modelId + reasoningEffort 路由映射到一个 bindingKey。bindingKey 是与匹配的 brain-worker-.txt 共享的密钥;请保持两者同步。

服务控制

在 Linux、macOS 和 Windows 上行为完全一致:

node scripts/daemon.mjs start # start detached supervisor + server
node scripts/daemon.mjs stop
node scripts/daemon.mjs restart
node scripts/daemon.mjs status

这些也以 npm run daemon:start|stop|restart|status 的形式暴露。仅限 Linux 的基于 screen 的脚本仍保留在 scripts/ 中(control.sh、public_quick.sh、……),用于 Cloudflare 快速隧道和无头 Chrome worker 池。

推理协议(v4)

网关与 ChatGPT“Brain”之间使用一套严格的协议通信:

fusion_wait_for_reasoning_request → one immutable snapshot + data-only action catalog
fusion_submit_reasoning_result → exactly one {final} | {action_proposal} | {readonly_batch}
fusion_fail_reasoning_request → terminal failure for the assigned snapshot

actionCatalog 仅是数据——是对 DSH 原生工具的描述,绝不会作为 ChatGPT/MCP 工具安装。action_proposal 是一项建议,由 DSH 稍后在其自身的权限/沙箱策略下执行;网关不会运行它。

公共端点是 GET|POST /brain-mcp。原先的 /mcp 和 /fusion/tasks…
路由返回 HTTP 410(已禁用)。

权限

使用原生三级 DSH 模型——read-only、workspace-write、 danger-full-access——默认使用 workspace-write。

仓库布局

server.strict.cjs active gateway (strict v4; no legacy /mcp)
server.cjs full gateway incl. workspace file/shell tools
config.json runtime configuration (secrets are placeholders)
model-bindings.json modelId → bindingKey map
scripts/daemon.mjs cross-platform daemon (start/stop/restart/status)
scripts/.sh Linux deployment helpers (screen, cloudflared, Chrome workers)
brain-worker-.txt per-route prompts for dedicated Brain conversations
browser-autowake/ optional Chrome extension that wakes Brain tabs
tests/ selftests and headless integration workers
state/ logs/ runtime artifacts (gitignored)
测试

npm install
node tests/reasoning-contract-v4-selftest.mjs # 主要协议测试
…以及 oauth、worker-recovery、failover、context-overflow、payload-limit 自测

完整的测试矩阵请参见实现说明中的 ## 验证 部分。

安全说明

- 默认绑定到 127.0.0.1;只有 quick-tunnel 脚本会暴露一个公共 URL。
- 不要提交包含真实密钥的 config.json 或 model-bindings.json —— 本仓库出于这一原因仅提供占位符。
- 在 Linux 上使用 /bin/setpriv 将沙箱化命令降权到 commandUser;在其他平台上,命令以当前用户身份运行。

DSH ⇄ ChatGPT Fusion 是一个社区桥接项目,与 OpenAI 或 DeepSeek 无关联,也未获得其认可。
使用 ChatGPT 须遵守 OpenAI 的服务条款。
预览分享卡片长什么样 ↓2025ashore/DSH-Brain-Bridge
分享 · DeepSeek Harness Hub
2025ashore/DSH-Brain-Bridge

把 DSH 上下文转发给 ChatGPT 换取单步决策

回到顶部