DSH ⇄ ChatGPT Fusion Gateway
by 2025ashore
README.md
# DSH ⇄ ChatGPT Fusion Gateway
A minimal MCP bridge that keeps [DeepSeek Harness](https://www.deepseek.com) (DSH) as the
**single agent and runtime**, and uses **ChatGPT Web** only as a stateless, single-turn
*reasoning provider*.
DSH owns agents, tools, permissions, sessions, compaction, subagents, workflows, goals,
and real file/shell execution. The gateway simply relays one immutable DSH context
snapshot to a ChatGPT "Brain" conversation, and relays back exactly one decision — a final
answer, one action proposal, or a bounded read-only batch. The Gateway never executes the
proposed action itself.
```
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
```
## Features
- **Strict one-result reasoning contract** — every request carries one complete, immutable
snapshot; the Brain returns exactly one terminal result (`final`, `action_proposal`, or a
bounded `readonly_batch` of read/glob/grep).
- **Recoverable delivery** — requests are journaled to disk; a crashed Gateway restores
in-flight claims instead of losing them. Retries are idempotent via snapshot + nonce.
- **Multi-worker failover** — several Brain conversations can back the same model route;
a stalled claim is released and re-delivered to a healthy standby with a rotated nonce.
- **OAuth 2.0 (loopback)** — optional authorization for the public ChatGPT connector
(`/brain-mcp`), with rotating access/refresh tokens.
- **Cross-platform** — the gateway and Node daemon run on Linux, macOS, and Windows.
- **Optional browser wake** — a Chrome extension (`browser-autowake/`) polls loopback
queue metadata and wakes a route-bound Brain tab when work is waiting.
## Requirements
- [Node.js](https://nodejs.org) **18+** (uses the global `fetch`).
- `git` (and, on Linux, your configured command user) for the workspace tools.
DSH itself must be available for the DSH-native agent loop and tool runtime; the gateway
detects the DSH-bundled `node_modules` automatically, or you can point it there with the
`DSH_NODE_MODULES` environment variable.
## Quick start
```bash
git clone <your-repo-url>
cd dsh-chatgpt-mcp
npm install
```
Put real credentials into `config.json` and `model-bindings.json` (all values ship as
`REDACTED_*` placeholders), then start:
```bash
npm run daemon:start # background, supervised with auto-restart
npm run daemon:status
```
…or run in the foreground:
```bash
npm start # node server.strict.cjs
```
The gateway binds `http://127.0.0.1:7688`. Detailed architecture and invariants live in
[`ARCHITECTURE.md`](ARCHITECTURE.md).
## Configuration
### `config.json`
| Key | Meaning |
| --- | --- |
| `host` / `port` | Loopback bind address (default `127.0.0.1:7688`). |
| `workspaceRoot` | Project workspace the tools may access. `.` = the project root. |
| `ownerPassword` | Owner password for OAuth authorization (≥ 16 chars). |
| `staticToken` | Static bearer token for the loopback Brain MCP (≥ 32 chars). |
| `allowedPrograms` | Executables the workspace `run_command` tool may launch. |
| `commandUser` | Linux-only: user the sandboxed commands drop to via `setpriv`. |
`ownerPassword`, `staticToken`, and the binding keys are **required** and must be filled in
before use. On macOS/Windows there is no portable setuid helper, so sandboxed commands run
as the current user and `commandUser` is ignored.
### `model-bindings.json`
Maps each `modelId` + `reasoningEffort` route to a `bindingKey`. The `bindingKey` is the
secret shared with the matching `brain-worker-*.txt`; keep both in sync.
## Service control
Works identically on Linux, macOS, and Windows:
```bash
node scripts/daemon.mjs start # start detached supervisor + server
node scripts/daemon.mjs stop
node scripts/daemon.mjs restart
node scripts/daemon.mjs status
```
These are also exposed as `npm run daemon:start|stop|restart|status`. Linux-only
`screen`-based scripts remain in `scripts/` (`control.sh`, `public_quick.sh`, …) for
Cloudflare quick-tunnel and the headless Chrome worker pools.
## Reasoning protocol (v4)
The gateways speaks a strict protocol to the 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` is *data only* — a description of the DSH native tools, never installed as
ChatGPT/MCP tools. An `action_proposal` is a recommendation that DSH later executes under
its own permission/sandbox policy; the Gateway does not run it.
The public endpoint is `GET|POST /brain-mcp`. The former `/mcp` and `/fusion/tasks…`
routes return `HTTP 410` (disabled).
## Permissions
Uses the native three-level DSH model — `read-only`, `workspace-write`,
`danger-full-access` — with `workspace-write` as the default.
## Repository layout
```
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)
```
## Testing
```bash
npm install
node tests/reasoning-contract-v4-selftest.mjs # primary protocol test
# …plus oauth, worker-recovery, failover, context-overflow, payload-limit selftests
```
See the `## Verification` section of the implementation notes for the full matrix.
## Security notes
- Bind to `127.0.0.1` by default; only the quick-tunnel script exposes a public URL.
- Do **not** commit `config.json` or `model-bindings.json` with real secrets — this
repository ships placeholders for that reason.
- `/bin/setpriv` is used on Linux to drop sandboxed commands to `commandUser`; on other
platforms commands run as the current user.
---
*DSH ⇄ ChatGPT Fusion is a community bridge and is not affiliated with or endorsed by
OpenAI or DeepSeek. Use of ChatGPT is subject to OpenAI's terms of service.*This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues