Skip to content

dsh-at-terminal-ssh

Verified

@at-series/dsh-at-terminal-ssh · v0.3.0 · MIT

Keep an AT Terminal SSH shell alive across tool calls — the opt-in composition bundle for @at-series/dsh-at-terminal.

Install

dsh plugin add @at-series/dsh-at-terminal-ssh

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

@at-series/dsh-at-terminal-ssh

The optional composition bundle for @at-series/dsh-at-terminal. It adds nothing to the panel and contains no code of its own: it composes three rows so the model can keep one SSH shell alive across tool calls.

npm install --save-exact @at-series/dsh-at-terminal-ssh

Normally you do not install this by hand — AT Terminal's own settings page has a switch for it, and that switch installs exactly this package.


What it gives you

Six tools, over SSH, on a shell that survives between calls:

Tool What it does
terminal_open({ type: 'ssh', name: '<server>' }) start a session on a configured AT Terminal server
terminal_send write to it
terminal_read read what came back (incremental, with a line range)
terminal_signal always errors — ssh2 has no pty signal channel; the message names the two workarounds
terminal_close end it
terminal_list what is running

The point is state: terminal_send { text: 'cd /tmp' } followed by a later terminal_send { text: 'pwd' } answers /tmp. A one-shot remote command cannot do that — each call is a new connection with a new working directory.

Why it is a separate package

Two of the three rows it mounts belong to the Harness, not to us (@deepseek-ai/dsh-terminal, @deepseek-ai/dsh-tool-terminal). A dsh plugin runs from link:/node_modules and cannot import a package that lives inside the app's app.asar; only a composition layer can name those rows, because it is the loader — running inside the app — that resolves them.

Splitting it out also buys two things that would be lost inside the main package:

  • Opt-in. Installing the panel does not silently add six tools to the model's tool table. Tools cost prompt tokens on every request, and a user who never wants a persistent shell should not pay for one.
  • Atomic. The three rows are one isolated group (isolate.terminals), so enabling or disabling it moves them together. Toggling them row by row would let a user enable the tools without the backend, and the resulting error is noise, not information.

What it needs

  • @at-series/dsh-at-terminal ^0.3.0 (declared as a peer; it exports the SSH backend this bundle references by subpath, so the backend lives in one place instead of being copied here)
  • A DeepSeek Harness desktop build that composes @deepseek-ai/dsh-terminal — every 0.2.x does
  • A configured server with Allow background connections enabled, if you want the agent's one-shot tools to reach it too. The persistent shell does not need that flag; the one-shot command and SFTP tools do.

Enabling and disabling

The package being installed is not the same as it being active. A profile only loads the bundles listed in dsh.profile.bundles, and the installer adds a newly installed bundle there automatically. To turn it off without uninstalling, use the switch on AT Terminal's settings page (or the host's own plugin list) — that writes the selection and reloads the composition.

Check it is running: Settings → Plugins → @at-series/dsh-at-terminal-ssh should report 3 components running (registry → backend → tools). Fewer than three means one of the rows did not mount; the loader's log names which.

What it is not

  • Not a terminal multiplexer: the session belongs to the agent that opened it, and it ends with that session's lifetime.
  • Not a replacement for at_terminal_run_remote_command. That tool runs one command and returns its output; this one keeps a shell. Use the command tool for anything that finishes, and this one when the point is the state between steps.

License

MIT