dsh-dario-sidecar
Manifest validHarness-owned lifecycle for the dario proxy — starts it with your harness, readiness-gates it, and stops it when the harness stops, so subscription-backed (Claude/ChatGPT) model routes just work.
dsh-dario-sidecar
Harness-owned lifecycle for dario — a DeepSeek Harness (DSH) profile plugin.
In plain terms
You probably pay for a ChatGPT or Claude subscription. That plan works in the vendor's own app — but most other tools, including the DeepSeek Harness this plugin is written for, expect an API key. An API key bills you per token, separately, on top of the subscription you already pay for.
dario closes that gap. It's a small program that runs on your machine and lets any OpenAI- or Anthropic-compatible tool use your subscription instead of an API bill.
One catch: dario only works while it's running. Normally that means opening a terminal, starting it yourself, and hoping you remember after every reboot — and when you forget, your tools fail with confusing errors.
This plugin wires dario into your harness's own startup: harness starts → dario starts. Harness stops → dario stops. Install it once, stop thinking about it. The rest of this README covers the details.
What it does
- Spawns
dario proxythrough DSH'ssubprocessseam when the plugin mounts. Default args['proxy']serve every plan dario holds credentials for; overrideargsfor a single-plan posture (see Configuration). - Readiness-gates on
GET /v1/modelsanswering 2xx before reporting ready (default 120 s budget, 500 ms polls), so a slow proxy surfaces as "starting", not as a model-route credential error. - Adopts an already-healthy listener instead of spawning a doomed duplicate. Adoption is not ownership: teardown kills only what this plugin started.
- Tears down effect-scoped: SIGTERM → grace (5 s default) → SIGKILL, tree-scoped, on unload/HMR — the proxy never outlives the harness.
- Surfaces mid-life exits in the harness log with exit code/signal.
Prerequisites
-
A working DSH deployment with a profile (e.g.
web). -
dario installed and logged in on the host the harness runs on:
npm install -g @askalf/dario dario add altman # attach a ChatGPT Plus/Pro plan (paste the redirect URL back) dario login # and/or a Claude Pro/Max planThis plugin manages the proxy process only — OAuth login is a human step it deliberately never performs.
Install
Managed route (wires dependency + bundle entry; the package's own patch supplies the loader row, so defaults apply):
dsh plugin --profile web add github:GrannyProgramming/dsh-dario-sidecar
Manual route — add the dependency to your profile's package.json:
{
"dependencies": {
"dsh-dario-sidecar": "github:GrannyProgramming/dsh-dario-sidecar"
}
}
install profile dependencies, then pick one of the two ways to mount it:
-
Bundle entry (defaults, no config): add
"dsh-dario-sidecar"todsh.profile.bundles. The package's own patch inserts the loader row. -
Manual insert (you want to override config, e.g.
args): leave it out of the bundles list and add the row to the profile'scordis.patch.ymluser patch layer instead:- insert: - id: dsh-dario-sidecar name: 'dsh-dario-sidecar' config: args: ['proxy', '--no-claude-auth'] # your override
⚠️ These two are mutually exclusive. A bundle entry and a manual insert
for the same id is a duplicate loader entry id boot failure — the loader
refuses the whole tree, not just the duplicate row.
Configuration
Everything lives in the insert row's config:
- insert:
- id: dsh-dario-sidecar
name: 'dsh-dario-sidecar'
config:
args: ['proxy', '--no-claude-auth'] # example: ChatGPT-only posture
| Field | Default | Meaning |
|---|---|---|
command | dario | Executable to spawn (absolute, or resolved on PATH at load). |
args | ['proxy'] | Arguments, no shell. ['proxy','--no-claude-auth'] never loads the Claude OAuth path — useful with a dead/stale Claude credential or a ChatGPT-only deployment. |
host / port | 127.0.0.1 / 3456 | Readiness-probe target; passed to the child as DARIO_HOST / DARIO_PORT. |
env | {} | Extra env vars merged onto the scrubbed ambient env (PATH/HOME survive). |
readyTimeoutMs | 120000 | Readiness budget before the spawn is torn down and load fails. |
pollIntervalMs | 500 | Interval between readiness polls. |
killGraceMs | 5000 | SIGTERM → SIGKILL escalation grace. |
Point a model route at it
With the sidecar up, add dario as an llm-pi-ai custom provider in
$DSH_HOME/settings.yaml:
llm-pi-ai:
providers:
dario:
displayName: Dario (subscription)
api: openai-completions
baseURL: http://127.0.0.1:3456/v1
apiKeyEnv: DARIO_API_KEY # any non-empty value; dario accepts a literal "dario"
compat:
supportsDeveloperRole: true
maxTokensField: max_completion_tokens
models:
- id: gpt-5.6-sol
name: GPT-5.6 Sol
contextWindow: 272000
maxTokens: 128000
input: [ text, image ]
reasoningEfforts: { off: none, low: low, high: high, max: max }
Verify what your account serves before declaring models:
curl -s localhost:3456/v1/models. The listing is static — a live
/v1/chat/completions round-trip is the only real auth proof.
Troubleshooting
- Load fails
not ready within …ms; stderr tail: …— dario started but never served: checkdario status, purge stale credentials (dario logout), or raisereadyTimeoutMs. resolveExecutablefailure — dario is not on the harness process's PATH. Setcommandto the absolute binary path.- Port conflict — set
portin the insert row and the matchingbaseURLin your model route. - WSL + Windows both have dario — the two installs shadow each other and
version-split (
hash -rto re-resolve). Keep exactly one on the harness host, or pincommandto the right binary. - Parallel agents — subscription tokens flag under concurrency; dario is strictly single-flight. Route parallel fan-out to per-token API providers instead.
Origin
Extracted from a working tiered-routing deployment; the design was fixed and
verified in
council_of_agents #7
(lifecycle mechanism) and
#5
(integration + verification). Shape follows DSH's own
@deepseek-ai/dsh-lsp-stdio subprocess-lifecycle pattern.
License
Comments
Loading…
Similar plugins
OpenRouter provider for DeepSeek Harness with a live model list, prices and spend tracking
★ 0
MIT
JavaScript
dsh plugin --profile web add dsh-openrouter-liveby HaydenSmith1121
OpenCode Go subscription models as a DeepSeek Harness provider: re-resolves the live gateway catalog every few minutes, auto-adapts models the built-in table has not seen, and covers streaming, tool c
★ 4
↓ 81/wk
MIT
JavaScript
Sep 28, 2026
dsh plugin --profile web add dsh-opencode-go-plusby log-li
Peak / off-peak rate badges for the model selector (every row) and the composer tool row, judged per provider by its own time zone and schedule; the live catalog is served from the host over a fenced
★ 1
↓ 705/wk
MIT
TypeScript
Sep 21, 2026
dsh plugin --profile web add dsh-peakrateby windwhiterain
Per-model outbound proxy routing for DeepSeek Harness: send only the models you name through a proxy, with a direct fallback while it is unavailable.
★ 1
↓ 17/wk
MIT
JavaScript
Sep 30, 2026
dsh plugin --profile web add dsh-model-proxyRule-based multi-provider model routing for DeepSeek Harness with pre-first-token failover, cooldown circuit-breaking, usage accounting, and a status API.
★ 0
dsh plugin --profile web add @botton/dsh-model-routerClaude-Code-style lifecycle hooks: configured shell commands run before/after model tool calls with a JSON payload on stdin; a non-zero pre-tool exit blocks the call.
★ 0
dsh plugin --profile web add dsh-plugin-hooks