Back to home

dfzjb

deskpet-bridge

DeskPet Bridge - a local JS agent preset for DSH (DeepSeek Harness)

Stars
1
Language
JavaScript
Created
Aug 14, 2026
Updated
Aug 14, 2026

Introduction

DeskPet Bridge

English | 中文

A local JavaScript agent preset for DSH (DeepSeek Harness) that exposes the agent's runtime status over HTTP + SSE and adds a programmable approval channel.

Overview

deskpet-bridge is a standalone agent preset (three files) that you drop into DSH's .agent-presets/ directory. It requires no modification to the DSH codebase.

What it does for DSH

1. Extends DSH's web server

Registers three new routes on DSH's built-in webServer, giving DSH a few externally-callable endpoints:

EndpointPurpose
GET /api/deskpet/v2/get-statusQuery the current agent status snapshot
GET /api/deskpet/v2/eventsServer-Sent Events realtime stream
POST /api/deskpet/v2/approveSubmit an approval decision

2. Status observability

Listens to DSH's internal agent/status event, maintains a status cache (idle / running …), and counts state changes (changes) plus agent count (agentCount) — making DSH's runtime state queryable and subscribable by external programs.

3. Programmable approval channel (core)

Acts as an answerer in DSH's approval mechanism:

  • Registers on approval/request with { prepend: true }, claiming the approval ahead of DSH's default approval panel (api-proxy).
  • Holds the approval (returns a pending Promise) and pushes the request to external clients over SSE.
  • Resolves the approval when an external client submits a decision via /approveallowed-once or rejected.
  • Times out after 120 s (or on abort signal) as cancelled, so approvals never hang forever.

4. Realtime event stream

Broadcasts DSH internal events over SSE: hello / agent-status / approval-request / approval-decided / approval-expired, with a 5-second heartbeat.

5. Graceful fallback

When no external client is connected, the approval answerer calls next(), falling back to DSH's default approval panel — so DSH's original approval flow stays intact.

Files

FilePurpose
agent.cordis.ymlComposition entry: id: deskpet-bridge + name: ./bridge.js
bridge.jsCore plugin (ESM: export name / inject / apply)
preset.ymlPreset metadata (name + description)

Installation

Copy the three files into %DSH_HOME%/.agent-presets/deskpet-bridge/, then select (or set as default) the deskpet-bridge preset for your agent session.

API Contract

Base: http://127.0.0.1:3080 · Prefix: /api/deskpet/v2/

GET /get-status

{"ok":true,"status":"idle","agentCount":4,"changes":0,"connectedClients":0,"pendingApprovals":0}

GET /events (SSE, text/event-stream)

Events: hello / agent-status / approval-request / approval-decided / approval-expired

POST /approve

{"approvalId":"appr_N","decision":"approve-once"}  → 200 {"ok":true,"outcome":"allowed-once"}
{"approvalId":"appr_N","decision":"reject"}         → 200 {"ok":true,"outcome":"rejected"}
Unknown approvalId                                  → 404 {"ok":false,"error":"unknown approvalId"}

How approval works

approval/request (waterfall)
   └─ prepend answerer claims it
        ├─ external client connected → hold + push SSE approval-request
        │      └─ POST /approve → resolve allowed-once / rejected
        └─ no client → next() → DSH default approval panel

120s timeout / abort → cancelled

License

MIT — aligned with DSH's license.