DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Ssh — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

@jmcc-guo/dsh-ssh

Ssh

面向 DeepSeek Harness 的 SSH 终端面板和 AI 连接管理器:由模型驱动的 SSH 连接(连接/执行/列表/状态/断开)、自动保存的连接记录、保持连接 + 自动重连、执行互斥锁、凭据安全认证,以及 XShell 风格的 m

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:jmcc-guo/dsh-ssh#8d9c7d6659752cc3b1e6446e26e2d8756cf82d83
README兼容性版本

兼容性与来源证明

Ssh 以 @jmcc-guo/dsh-ssh 发布,当前版本为 0.5.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/21

版本

0.5.0stable
2026/9/10
0.4.0stable
2026/8/31
0.3.1stable
2026/8/19
查看其余 8 个版本收起版本
0.3.0stable
2026/8/15
0.2.0stable
2026/8/15
0.1.5stable
2026/8/15
0.1.4stable
2026/8/15
0.1.3stable
2026/8/15
0.1.2stable
2026/8/15
0.1.1stable
2026/8/15
0.1.0stable
2026/8/15

相关插件

正在加载相关插件…

最新版
0.5.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 5
周下载
66
最近提交
2026/9/10
查看源码 ↗项目主页 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 developer-tools 分类下经过校验的插件。

Client Ui Git Graph@linxin666/dsh-client-ui-git-graph外部 dsh Web GUI 插件:空会话 Git 分支选择器和 Git 图,包含实际的主机端 Git 操作与防护,作为 dsh 配置文件包Doctor@linxin666/dsh-doctorDSH 配置档案的事务性救援模式,配备受监督的启动器、隔离的恢复容器、确定性修复、健康监控以及本地 Web 恢复控制台Ssh@linxin666/dsh-sshdsh Web GUI 的远程 SSH 操作:主机配置存储(~/.dsh/dsh-ssh.json,可从 ~/.ssh/config 导入)、支持跳板主机的持久化 ssh2 连接池、exec / PTY Web 终端 / SFTP 传输 / 本地端口转发隧道 / 集群执行DSCODE@toddzheng024/dscode-bundle完整的 DeepSeek 编码代理,支持持久化 shell、Ultra 协作和自动权限审查。

README

@jmcc-guo/dsh-ssh

English · 简体中文

AI-managed SSH connections with a live multi-tab terminal panel for DeepSeek Harness.

SSH terminal panel + AI connection manager for DeepSeek Harness (DSH).

The AI agent can autonomously create, address, and tear down SSH connections right from the conversation (ssh_connect / ssh_exec / ssh_list / ssh_status / ssh_disconnect / ssh_exec_read / ssh_exec_kill / ssh_delete), while a XShell/Uniterm-style multi-tab terminal panel in the Web GUI shows every command — model and human — in real time on the same screen.

Features

  • Model-driven connection lifecycle — the agent connects by name or by parameters, runs commands with exit codes and readable failures, lists and inspects AI-managed connections, disconnects and deletes them. The same server may hold several independent connections (each with its own name, session state and command queue).
  • Auto-save & reuse — every connection is persisted by name (globally unique). After a DSH restart, ssh_exec on a saved name automatically re-establishes the connection from its saved settings.
  • Unified AI management — there is no source distinction: every saved connection, whether created by the AI (ssh_connect) or from the Settings page, is managed by the AI agent. It appears in ssh_list and is immediately addressable by ssh_exec / ssh_status / ssh_disconnect / ssh_delete — no transfer step exists or is needed.
  • Keep-alive & reconnect — idle keep-alive per connection; automatic reconnect only for unexpected drops (network blips, server resets) with exponential backoff (bounded attempts); every explicit disconnect stays down (tab close, ssh_disconnect, Settings "Disconnect" button). A "reconnected — the shell state was reset" notice is shown after an automatic reconnect.
  • Execution mutex (every connection) — while an AI command runs on a connection, human keystrokes are dropped server-side with a visible "AI is executing…" hint (the user may only type when the AI is not executing on that terminal); a model ssh_exec against a connection whose shared terminal shell is still active waits until the shell falls quiet (no output/input for shellQuietWaitMs, default 2 s) or returns a readable "busy" result instead of interleaving output.
  • Tab semantics — closing a tab disconnects immediately (no confirmation dialog); AI ssh_disconnect keeps the tab open showing "disconnected" (one click to reconnect); a model connect that has no tab re-opens one automatically. Connecting a saved connection (tab bar "+", the Settings-page Connect button) never rejects an already-open connection: when a tab for that connection is already open, the call opens a FRESH independent session in a new tab — even when the same connection is already connected in another tab — and only connects the primary session (the one the model tools address) when no tab is open yet.
  • Live terminal panel — two surfaces, one state — the panel body can live in DSH's native right details column (the conversation shrinks instead of being covered; closing restores the original right column untouched; a slim SSH rail on the right edge reopens it) or inside dsh-better-sidebar: when that plugin is installed, the same panel body registers as a sidebar tab (dsh-ssh:terminal — visible in its + menu, with a live connection-count badge), and the AI-connect auto-open lands there (opening and expanding the sidebar). Both surfaces share the one host-managed state stream, so switching never forks the terminals. panelSurface (see settings below) chooses the surface: auto (default — sidebar when installed), sidebar (prefer sidebar), native (always the built-in column). Without dsh-better-sidebar everything falls back to the native column automatically. Each connection owns one real interactive shell (PTY): the login banner (motd / Last login), the remote prompt user@host:path$, input echo and cd updates all come from the remote shell, exactly like a native SSH client. There is no input box and no copy control — click the terminal and type; keystrokes go straight into the remote shell (arrows, Tab, Ctrl-C, paste, IME supported). A blinking block cursor shows while the terminal is focused. AI-run commands appear in the same scrollback with source tags. Multi-tab, ANSI colors, scrollback. The view stays pinned to the newest output as it arrives — even large output bursts follow to the bottom; scrolling up to read history is respected (no forced jump), but whenever the AI starts operating the connection the terminal slides back to the bottom so the AI's live output is visible.
  • Settings page — "SSH Connections" under Settings manages everything: create, edit (rename supported), delete connections and their credentials (passwords / private keys stored in the DSH credential store), and connect/disconnect. The terminal column itself contains no CRUD.
  • Credential hygiene — passwords and private keys live in the DSH credential store under generated references; the records file, logs and tool results never contain secret material; inline secrets in tool arguments are rejected with guidance; auth failures return scrubbed, readable reasons.
  • Settings — the dsh-ssh settings namespace (heartbeat, reconnect policy, timeouts, output caps, records path) can be overridden through the DSH settings system / profile patch.
  • Bilingual UI — Chinese and English copy.

Requirements

  • Node.js >= 18 (ESM)
  • pnpm (lockfile: pnpm-lock.yaml)
  • A DeepSeek Harness (DSH) installation with the web profile
  • For the test suite: a reachable SSH server (the included tests target a local WSL OpenSSH instance; see scripts/test-acceptance.mjs)

Install into a profile

# from npm (recommended)
dsh plugin --profile web add @jmcc-guo/dsh-ssh

# or directly from GitHub
dsh plugin --profile web add "github:jmcc-guo/dsh-ssh#v0.5.0"

# or from a local checkout
dsh plugin --profile web add <path-to-this-repo>

The bundle patch (cordis.patch.yml) mounts the dsh-ssh row. Override config in the profile patch with the same row id:

- id: dsh-ssh
  config:
    heartbeatIntervalMs: 20000
    reconnectMaxAttempts: 8
    outputLimitBytes: 2097152

Restart the profile process afterwards (plugin-set changes and the client bundle graph are composed at boot).

Troubleshooting

ssh2 is bundled — no build steps needed

ssh2 and its full dependency closure are shipped bundled inside the package (bundleDependencies), so installing @jmcc-guo/dsh-ssh never runs dependency build scripts: no allowBuilds edits, no ERR_PNPM_IGNORED_BUILDS. ssh2 runs on its pure-JS implementation, which is fully functional (verified against a real SSH server); the optional native crypto binding is intentionally not compiled.

Peer-dependency warnings

pnpm peers check may report "missing peer" for the @deepseek-ai/* packages even though DSH provides them: with the hoisted profile layout, external plugins resolve host packages at runtime from the shared profiles/node_modules tree, which pnpm's static peer check does not cross. The warnings are benign — the plugin loads fine (verified at runtime).

Settings namespace (dsh-ssh)

KeyDefaultMeaning
heartbeatIntervalMs30000ssh2 keep-alive interval
keepaliveCountMax3keep-alive failures before the connection is considered dead
connectTimeoutMs15000SSH handshake / TCP connect timeout
reconnectBaseDelayMs2000first auto-reconnect delay (doubles per attempt)
reconnectMaxDelayMs60000backoff cap
reconnectMaxAttempts5max automatic reconnect attempts
execTimeoutMs120000default ssh_exec completion wait
busyWaitTimeoutMs20000default mutex wait when the connection is busy
reconnectWaitTimeoutMs30000default wait while reconnecting
shellQuietWaitMs2000shared-shell silence required before AI may run
outputLimitBytes1048576per-connection terminal buffer cap
execOutputMaxBytes200000cap on output returned to the model per command
recordsPath$DSH_HOME/storages/dsh-ssh/connections.jsonrecords file override
panelSurfaceautowhere the Web panel lives: auto = dsh-better-sidebar when installed, else the native column; sidebar = prefer dsh-better-sidebar (falls back to native when absent); native = always the built-in details column. Applied live to open panels

Model tools

  • ssh_connect — create a new connection (host/port/user + auth by credential reference or key file path) or re-establish an existing one.
  • ssh_exec — run a command on a saved connection by name; auto-reconnects when offline, waits through reconnect/busy states (with timeouts), returns output + exit code; long commands return an execId for ssh_exec_read / ssh_exec_kill.
  • ssh_exec_read — incremental output of a running (or finished) command.
  • ssh_exec_kill — terminate a running command (SIGINT through the pty).
  • ssh_list — all saved connections with live status (every connection is AI-managed).
  • ssh_status — detailed status of one saved connection.
  • ssh_disconnect — explicit disconnect (no auto-reconnect; optional delete); the panel tab stays open showing "disconnected".
  • ssh_delete — delete a saved connection record (disconnects first).

Secret rule for the model: never pass passwords or private keys inline in tool arguments (they are recorded verbatim in the session log and rejected). Use auth.passwordRef / auth.privateKeyRef (a stored credential or environment variable) or auth.privateKeyPath (a key file on the host). New secrets can be stored through the panel's connection form, which routes them into the DSH credential store.

Security notes

  • The panel channel (/ssh/ws) applies the harness browser-trust fence: loopback/trusted-host Host, same-origin Origin, cross-site fetch-metadata rejection.
  • Secrets never leave the credential store: the records file holds references only; error messages are scrubbed; logs contain no secrets.
  • Commands run through real PTYs on the remote host: ANSI output works, interactive programs work, and termination is a genuine SIGINT to the foreground process group. User keystrokes flow through the shared shell's PTY; while an AI command runs on a connection the host drops keystrokes (input mutex — the user may only type when the AI is not executing on that terminal).

Repository layout

lib/index.js            plugin entry: config schema, manager + tools + panel channel wiring
lib/manager.js          SshManager — connection lifecycle, keep-alive/reconnect, mutex, PTY shells
lib/tools.js            model tools (ssh_connect / ssh_exec / ssh_exec_read / ssh_exec_kill / ...)
lib/ws.js               panel WebSocket channel (/ssh/ws) with the browser-trust fence
lib/store.js            persisted connection records
lib/client.js           Web GUI client: multi-tab terminal panel + settings UI
cordis.patch.yml        bundle patch that mounts the dsh-ssh row
scripts/                test suites (see below)

Development / tests

scripts/ contains the acceptance suite and helpers (requires a reachable SSH server; the included tests target a WSL OpenSSH instance):

node scripts/test-acceptance.mjs   # 64-check manager-level acceptance suite
node scripts/smoke.mjs             # quick smoke test
node scripts/test-panel-ws.mjs     # panel WebSocket channel drive (test web instance on :3081)
node scripts/test-rename.mjs       # focused rename test (no SSH server needed)
node scripts/test-connect-tabs.mjs # focused connect/tab-semantics test (no SSH server needed)
node scripts/test-panel-channel.mjs # focused panel WS channel test (no SSH server, no DSH instance needed)
node scripts/test-client-surface.mjs  # dual-surface (native column / dsh-better-sidebar) logic — no server needed

Contributing

Issues and pull requests are welcome. Keep the model-facing surface (tool names, parameter semantics, result shapes) backward compatible, and make sure secrets never end up in logs, records or tool results.

License

MIT