deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
English | 简体中文
dsh-toy is a DeepSeek Harness plugin for connecting small toys to DSH.
At connection time, the agent first asks for the brand and model, then selects the connection method automatically. If the user genuinely does not know, the agent starts unknown-hardware discovery:
Users do not need to understand or select an underlying connection method, or manually start Intiface.
Brand and model names are not an allowlist. The agent passes any user-reported name through unchanged; unfamiliar names still use local hardware discovery. The plugin also supplies a verified local compatibility mapping for RoomFun devices reporting model RF_CANNON_PT3, exposed as RoomFun Cannon with one vibration channel.
The implementation follows protocol observations from Chemtrails, together with the device model and message formats documented by Buttplug and the Buttplug Protocol Specification. This repository contains an independent TypeScript implementation; see NOTICE for attribution.
allowHold: true is explicitly configured.maxIntensityPercent and maxDurationSeconds are enforced before backend dispatch.toy_stop without a device id performs a global stop.toy_disconnect stop output and await WebSocket shutdown.Use only hardware you own or are explicitly authorized to control. Treat sharing tokens as temporary control credentials and keep them out of Git, logs, and conversations.
Requirements: Node.js 22.19 or newer and pnpm on PATH. Raw macOS BLE discovery additionally uses the Swift compiler from Xcode Command Line Tools. Install pnpm once if needed with npm install --global pnpm@10, then add the plugin directly from GitHub:
npx -y @deepseek-ai/dsh plugin --profile web add github:c3ll256/dsh-toy
Start DSH with the same profile:
npx -y @deepseek-ai/dsh web
The first command installs and activates the bundle persistently in the web profile. Re-running DSH does not reinstall it. To inspect the composed configuration or remove the bundle:
npx -y @deepseek-ai/dsh --profile web --dump-config
npx -y @deepseek-ai/dsh plugin --profile web remove dsh-toy
Replace web with another profile name when needed.
You can tell the agent directly:
My toy is a Lovense Lush 3. Connect it and scan for devices.
When the brand or model is unknown, say:
I do not know the brand or model. Try Bluetooth discovery directly.
On macOS, the agent first calls toy_scan_raw_ble. If the scan exposes a plausible advertised name, it uses that hardware-reported name for toy_connect; otherwise it falls back to unknown, connects Intiface automatically, and scans verified protocols. Before scanning, turn the toy on, keep it nearby, and make sure a phone app or another program is not holding the device connection.
Before calling toy_connect, the agent must ask for the model and pass it to the tool, together with the brand when known. When the user does not know, macOS first runs toy_scan_raw_ble directly through CoreBluetooth. A discovered advertisement name is hardware evidence and may be passed to toy_connect; raw BLE ids are never controllable device ids. If raw discovery is unavailable or inconclusive, the agent passes unknown and the system tries the Intiface fallback. The tool never asks the user to select an underlying protocol.
For a brand or model that is not already documented, the agent follows the same path: pass the reported text to toy_connect, then call toy_scan. It must not guess a protocol or write arbitrary BLE characteristics. Discovery returns only devices covered by an upstream Intiface definition or a compatibility mapping that has been verified against hardware. An empty scan means the device remains unsupported or unavailable, not that the agent should probe it destructively.
For local Bluetooth, serial, and USB devices, the system first tries an existing Intiface server. If 127.0.0.1:12345 refuses the connection, the plugin runs:
intiface-engine --websocket-port 12345 --use-bluetooth-le --use-serial --use-hid
The plugin first looks for Intiface Engine on PATH. If it is not installed, it downloads a pinned build from the official Buttplug GitHub Release, verifies its SHA-256 digest, caches it in the user cache directory, and starts it. Set intifaceAutoDownload: false to disable downloads or intifaceExecutable to use another path. On disconnect or unload, the plugin stops only the process it started; it does not stop an Intiface server that was already running.
When the plugin starts Intiface itself, it writes its verified compatibility mappings to a private temporary user-device-config file and removes that file on shutdown. An Intiface server that was already running keeps its own configuration; stop that server first if a built-in compatibility mapping is needed.
Automatic downloads currently support macOS ARM64, Linux x64/ARM64, and Windows x64. On other platforms, use intifaceExecutable to point to an installed engine. The first scan on macOS may request Bluetooth permission; allow the terminal or application running DSH to access Bluetooth.
The bundled defaults use:
- id: dsh-toy
config:
buttplugProtocolVersion: 4
intifaceExecutable: intiface-engine
intifaceAutoDownload: true
rawBleScanDurationMs: 10000
defaultDurationSeconds: 30
maxDurationSeconds: 300
maxIntensityPercent: 100
allowHold: false
Set buttplugProtocolVersion: 3 for an older Intiface server. The system exposes percentage-compatible scalar features advertised by the connected device.
Store the token from a supported sharing link in an environment variable:
MONSTERPARTY_TOKEN=<TOKEN>
Then override the plugin row in the profile's cordis.patch.yml:
- id: dsh-toy
config:
monsterPartySessionToken: !!js process.env.MONSTERPARTY_TOKEN
defaultDurationSeconds: 30
maxDurationSeconds: 300
maxIntensityPercent: 100
allowHold: false
Sharing tokens are commonly single-use and expire after disconnection. Generate a new link before reconnecting.
| Tool | Purpose |
|---|---|
toy_scan_raw_ble |
On macOS, discover connectable raw BLE advertisements without Intiface or device writes |
toy_connect |
Connect from the reported model; use unknown when it is not known |
toy_scan |
Discover available devices |
toy_list |
List device ids and controllable features |
toy_control |
Send a bounded scalar command |
toy_stop |
Stop one device or all devices |
toy_disconnect |
Stop output and close the connection |
Known model: toy_connect → toy_scan → toy_list → toy_control → toy_stop → toy_disconnect.
Unknown model on macOS: toy_scan_raw_ble → use an advertised name as evidence → toy_connect → toy_scan. If raw discovery is unavailable or inconclusive, continue with toy_connect(model: "unknown").
spawn intiface-engine ENOENT: update to a release with automatic download support, ensure intifaceAutoDownload: true, and confirm GitHub is reachable.xcode-select --install, or use the Intiface fallback.AKN_DS_SUCKEGG mapping documented by Chemtrails. Vendor-side protocol changes may require an update.RoomFun, model identifier RF_CANNON_PT3, firmware 4.3, and one vibration output. Other RoomFun models are not assumed compatible.toy_list after reconnection.pnpm install
pnpm run check
Thanks to Chemtrails and Buttplug for their protocol research, documentation, and open-source work.
BSD-3-Clause. See LICENSE.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。