Bundle
@huanlin/dsh-goal-auto
Per-session auto-resume toggle for long-running goal sessions: mark a session, and after the harness restarts the agent is resumed automatically and its active goal keeps running.
- Source
- FuWenLianggit
- License
- MIT
- Updated
- Updated 11 hours ago
Readme
# dsh-goal-auto
Per-session **auto-resume** toggle for long-running goal sessions in DeepSeek Harness (DSH).
## What it does
- Adds a 🔁 toggle to the session header action bar.
- Marked sessions are **resumed automatically after the harness restarts**:
the agent is reloaded, its agent preset is mounted, the goal is re-armed,
and the goal-round-driver keeps driving rounds without any manual click.
## Why resume is not enough (the three layers)
A plain `agents.resume()` after a restart leaves the session dead. Three things
must happen before a goal session runs again:
| Layer | Problem | Fix |
|---|---|---|
| Model variables | empty options -> `{{model}}`/`{{provider}}` unset, prompt assembly crashes | pass explicit `agentOptions.provider/model/maxTokens` |
| Tool set | resumed agent has **no tools** (preset not applied) | mount the agent preset in the resume `setup` |
| Goal driver | after restart `goal.activation` resets to `disarmed` | call `goals.resume()` to re-arm; driver auto-injects next round |
## Adaptive preset
The preset is read from the session header (`header.agentPreset`) and mounted
per session, falling back to the configured default when the header has none.
## Install
```
dsh plugin --profile web add file://<this repo path>
```
Or, as used here: keep the plugin in `<DSH_HOME>/plugins/dsh-goal-auto` and add
a `file:`/`link:` dependency in the profile's `package.json` + a junction under
`profiles/<name>/node_modules/@huanlin/dsh-goal-auto`.
## HTTP surface
- `GET /__goal-auto/state` -> enabled map
- `POST /__goal-auto/toggle` -> flip a session flag (+ start now if enabled)
- `POST /__goal-auto/resume-now` -> force resume of one session (diagnostics)
State lives in `<DSH_HOME>/goal-auto-state.json` (per-instance; safe to edit by
hand while the harness is stopped). Logs go to `<DSH_HOME>/goal-auto.log`.
## Layout
- `src/index.js` — cordis bundle (host): state, HTTP, boot auto-resume
- `src/client.js` — client bundle: header 🔁 toggle
- `cordis.patch.yml` — loader insert for the profile
## Watchdog requirement (IMPORTANT)
The plugin resumes sessions when the harness **starts**. It does **not** keep the
harness process alive. If `dsh web` crashes, hangs (TCP alive but HTTP dead), or
is killed, nothing inside the process can restart it — you must run a **process
watchdog** outside the harness.
Without a watchdog:
- the service dies and nobody brings it back;
- after a machine reboot nothing auto-starts;
- goal sessions only resume on the next manual start.
A reference watchdog system is included in this repository under
[`watchdog/`](watchdog/). It is the same system used by the author:
```
watchdog/
watchdog-instance.ps1 per-instance resident watchdog
health = TCP listening AND HTTP 200
sliding window catches hard hangs AND intermittent
"slow death" (5+ HTTP failures in last 10 probes)
boot grace 120s so fresh starts are never killed
start-instance.ps1 auto-init + start one instance (seeds settings,
credentials, agent presets, plugin environment)
control.ps1 unified control: start|stop|restart|status [instance]
instances.txt instance registry: name|home_dir|port
```
Design notes (all learned the hard way):
- Watchdogs are **per instance** (one process per `instances.txt` row), all
sharing one script. A single mutex per instance prevents duplicates.
- Auto-start at logon via the Windows Startup folder (a small `.vbs` per
instance calling `watchdog-instance.ps1 -Name <instance>`).
- `instances.txt` and every `.ps1` must stay **pure ASCII** — Windows
PowerShell 5.1 mis-parses UTF-8 without BOM, and the harness rejects JSON
files that carry a BOM.
- Health probes use .NET `HttpWebRequest`, not `curl.exe` (curl in 5.1
intermittently returns 000 against a healthy instance).
- Add a crash circuit breaker: if an instance dies N times within a short
window, stop relaunching and alert — otherwise a plugin bug turns the
watchdog into an infinite restart loop.
Configure `instances.txt` for your own homes/ports before use. The watchdog is
generic; the paths under `watchdog/` reference the author's layout only as an
example.
Install
dsh plugin --profile web add github:FuWenLianggit/dsh-goal-auto
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install huanlin-dsh-goal-auto from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.