dsh-remote 0.8.40 → 0.8.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/web-attach.js CHANGED
@@ -301,12 +301,24 @@ export class WebAttach {
301
301
  // Both failure shapes carry the same diagnostics: the process either died
302
302
  // (its output is the whole story) or is still booting after the deadline.
303
303
  if (launchFailed(out)) {
304
+ // The remote process is already gone — nothing to clean up.
304
305
  throw new Error('web-attach: the remote DSH exited during startup.'
305
306
  + explainLaunchFailure(tail || out)
306
307
  + ` ${tail || 'no output'}`)
307
308
  }
308
309
  const parsed = parseWebStart(out)
309
310
  if (!parsed) {
311
+ // A timed-out launch may STILL be booting: the deadline expiring is not
312
+ // evidence the process died. Kill it before throwing, or every retry
313
+ // leaks another remote server (measured: three leftover `dsh --port 0`
314
+ // processes after three failed attaches). A PID of 0 means the launcher
315
+ // could not report one — nothing to target.
316
+ if (this.remotePid > 0) {
317
+ try {
318
+ await exec(buildStopCommand(this.remotePid, logPath), { timeoutMs: 20000 })
319
+ this.remotePid = 0
320
+ } catch { /* the process may already be gone; a leftover is worse than a failed kill attempt only if it repeats, and the next attach replaces this session */ }
321
+ }
310
322
  throw new Error(
311
323
  `web-attach: the remote DSH did not report a startup token within ${waitSeconds}s.`
312
324
  + ` Check that \`${command}\` exists on the remote and can boot a web profile.`
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-remote",
3
- "version": "0.8.40",
4
- "description": "Remote-work assistant for DeepSeek Harness: connect SSH (password/key/agent/keyboard-interactive/proxy jump), pick a remote workspace, operate on it with 25 rw_* tools (incl. rw_edit/rw_stat/rw_mkdir/rw_remove/rw_move/rw_forward), conflict-aware mirror sync, one-click backup/restore of every sidebar workspace, remote dsh deploy, port forwarding, optional side-bar remote file editing, audit log, keychain passwords.",
3
+ "version": "0.8.41",
4
+ "description": "Remote-work assistant for DeepSeek Harness: connect SSH (password/key/agent/keyboard-interactive/proxy jump), pick a remote workspace, operate on it with 22 rw_* tools (incl. rw_edit/rw_stat/rw_mkdir/rw_remove/rw_move/rw_forward), conflict-aware mirror sync, one-click remote dsh deploy + web UI attach, port forwarding, optional side-bar remote file editing, audit log, keychain passwords.",
5
5
  "license": "MIT",
6
6
  "author": "flymysql <flyphp@outlook.com>",
7
7
  "readme": "README.md",