Hmbown/CodeWhale · error

dsh is offline: {reason}

Error message

dsh is offline: {reason}

What it means

`ensure_launchable_dsh` reports `Offline` when a `dsh` binary exists but could not report a version — the detection probe (`dsh --version` / `--help` via the process runner) failed to spawn or returned nothing usable. `{reason}` carries the underlying spawn/parse error. dsh is present but not executable in practice, so the CLI refuses to plan or launch against it.

Source

Thrown at crates/tui/src/integrations/cli.rs:514

                "  (receipt history is kept at {}; $DSH_HOME is never touched)",
                paths.receipt.display()
            );
            confirm(yes, "Remove the DSH integration files?")?;
            let removed = dsh::remove(&paths)?;
            println!("removed {} file(s)", removed.len());
            Ok(())
        }
    }
}

fn ensure_launchable_dsh(report: &DshStatusReport) -> Result<()> {
    match &report.state {
        DshIntegrationState::NotInstalled => {
            anyhow::bail!(
                "dsh is not on PATH; install the official DeepSeek Harness first (npm i -g @deepseek-ai/dsh)"
            )
        }
        DshIntegrationState::Offline { reason } => anyhow::bail!("dsh is offline: {reason}"),
        DshIntegrationState::Incompatible { reason, .. } => {
            anyhow::bail!("installed dsh is incompatible with this integration: {reason}")
        }
        _ => Ok(()),
    }
}

View on GitHub (pinned to 8880682c63)

Solutions

  1. Run `dsh --version` manually in the same shell — its failure output is the real problem
  2. If the shim is stale, reinstall dsh: `npm i -g @deepseek-ai/dsh` (preferably after fixing the Node install)
  3. Ensure the `node` that dsh's shim references is present and first on PATH
  4. After dsh --version works, re-run the dsh subcommand; state should move to detected/connected
Defensive patterns

Strategy: validation

Validate before calling

let detection = detect_now();
if matches!(detection.compatibility, dsh::DshCompatibility::Incompatible) {
    eprintln!("dsh is present but unusable; check `dsh --version` output");
    return Ok(());
}

Type guard

fn dsh_online(report: &DshStatusReport) -> bool {
    !matches!(report.state, DshIntegrationState::Offline { .. })
}

Prevention

When it happens

Trigger: connect/update/launch/install-bundle when the dsh shim exists on PATH but is broken: a node shim pointing at a removed Node install, an exec-format mismatch, a truncated script, or `dsh --version` crashing. `{reason}` distinguishes spawn failure from unusful output.

Common situations: Upgrading or removing Node while leaving global npm shims behind; installing dsh with a different Node version manager and switching versions; corrupted global npm package; Windows .cmd shims with a broken node association; disk-full truncating the shim script.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/df84658440768f50. Report an issue: GitHub.