Repository navigation
Releases: cccodder/dsh-remote-console
Release list
v0.10.3
0.10.3
Security
- 工具按会话隔离终端(修越权):
remote_*只认调用方会话自己打开的终端——终端归属取自 spawn 时的DSH_SESSION_ID,调用方取exec.agent.id;不匹配报CONSOLE_FORBIDDEN。remote_status只列本会话的终端,审计记录新增session字段(可从pid追到会话)。信息缺失(老 DSH / 插件自测 / 手动登记终端)时退回旧行为。
Changed
- 通道选路引导:新增系统提示选路规则(只在存在已连接终端时注入,没有终端不占 prompt);
remote_run/remote_exec描述改成意图优先;误用时结果里附一行纠正(remote_run输出过大 → 建议remote_exec;remote_exec报「需要 tty/密码」→ 建议remote_run);remote_status顶部新增channel:/routing:摘要。
Added
- 单文件传输上限可配:设置页新增「单文件传输上限(MB)」(1–2048,默认 256),也可用
DSH_RC_MAX_TRANSFER_MB;保存后立即生效,越界/写错会夹取或退回默认;超限报错直接说明去哪改。没有 ControlMaster 的 PTY 通道仍为 1 MiB 硬上限。
Fixed
- 启动器自证 rc 目录:包装器与启动器模板都带
--rc-dir,终端 PTY 环境被重建时也能找到正确的插件数据目录(修复「上传只能 1 MiB、传输内容出现在窗口中」)。 - 设置页保存失败:保存前刷新配置快照;不再
dispose()configForms缓存的共享 form(插件行禁用再启用后保存必失败的根因)。保存失败的诊断串保留原因。
安装 / 升级
- 插件市场索引:
https://cccodder.github.io/dsh-remote-console/market/index.json - 升级:插件市场点更新,或卸载后重装;
~/.dsh/remote-console/里的主机列表不会丢。
DSH Remote Console 0.10.2 — host list settings, fixed save
The host-list settings page, redone: one row per host with add/remove, and the first save no longer fails with a false conflict.
Changed
- Host list is now a real list: each host is a row with a delete button; an input with "Add" (Enter works too); Save / Cancel / Reload; empty-state hint. Comment lines (
#) are kept. No more single big text field.
Fixed
- First save used to fail with "设置可能已被别处修改" — the save no longer sends a possibly stale snapshot revision; the server decides with its latest revision. A rejected attempt is retried once after 400 ms, then falls back to a single-field write.
- If it still fails, the message now carries a diagnostic string (
status/revision/writable/mode/attempts), a warning goes to the browser console, the draft is kept, and a "Reload" button is right there — so a failure can be reported with its exact cause.
Install / update
- npm:
dsh-remote-console@0.10.2 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装
DSH Remote Console 0.10.1 — host list entry fix
Host list: the settings page now actually appears, and there are tools to manage hosts even when it does not.
Fixed
- Why the settings page never showed up: client plugins can load before DSH's settings service, and the plugin decided once with
ctx.get('configForms'). When that returnedundefined, registration was skipped for the whole session. It now usesctx.inject(['configForms'], …)and registers when the service appears, so load order no longer matters.
Added
remote_host_add(spec)/remote_host_list()/remote_host_remove(spec)— manage the panel's host list with no settings page and no terminal. They read/write~/.dsh/remote-console/hosts.tsv(0600);remote_host_listlabels each host with its source (ssh-config,settings(config.hosts),hosts.tsv).- The settings page is registered in two places:
plugins.bundle.config(directly on the plugin package detail page) andplugins.row.config(the configure button on the plugin's row). Previously only the latter, which required opening the package and then a row. - The sidebar SSH panel shows a "主机:插件页配置" hint.
Changed
- README host-management section rewritten with the exact navigation path, plus the agent-tool alternative and the difference between the two storage locations (
config.hostsin the profile patch vshosts.tsv).
Tests
tests/host-tools.test.mjs: add/update/remove overhosts.tsv, source labels, invalid specs rejected, launcher appears inshells(). 128 tests total.
Install / update
- npm:
dsh-remote-console@0.10.1 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装(第三方插件没有原地更新按钮)
DSH Remote Console 0.10.0 — Windows (experimental)
Windows support (experimental): the terminal and the agent tools now work on a platform whose OpenSSH has no ControlMaster, by falling back to the PTY channel.
Added
bin/dsh-ssh.mjs— a Node wrapper for platforms without bash. Same menu,--host,--targetand--ask-targetbehaviour and the same rendezvous file as the bash wrapper, but it does not pass-M/-S(Windows OpenSSH has no ControlMaster) and the rendezvous carries an empty socket.- Windows launchers are
node dsh-ssh.mjs --host|--target <spec>using the Node that ships with DSH (process.execPath), so no separate system Node is needed.wrapSpawnTerminalrecognises these terminals from the script path in argv. - PTY fallback channel: with no socket,
remote_exec,remote_upload/remote_downloadandremote_read_file/remote_write_fileautomatically use the same PTY — commands and data pass through the user's window, transfers go as base64 chunks capped at 1 MiB, and sha256 is still verified on both sides. remote_forwardreturnsFORWARD_UNAVAILABLEon this channel: there is no authenticated reusable connection to build a tunnel on.remote_statusand every tool output now statetransport: socket|pty, so nobody has to guess which path ran.- Tool descriptions explain the fallback, so the agent does not misread merged output as a native pipe.
Changed
- README (zh/en) gained a "Windows (experimental)" section;
docs/compat.mdmoves Windows from unsupported to experimental with a per-capability breakdown;SECURITY.mdupdates its known limitations.
Tests
tests/windows.test.mjs: Node wrapper (argument parsing, menu, adding a host, rendezvous with an empty socket, no-M/-S), node launcher shape, spawnTerminal recognition, and tools really running over the PTY fallback (write/read round trip, upload/download with sha256,transport: ptyin output,FORWARD_UNAVAILABLE).tests/pty-transport.test.mjs: chunked base64 write (>2 KB), append, read back, truncation, sha256 and the size cap over a live shell. 123 tests total.
Note
There is no Windows machine on the build host. The wrapper, channel selection, fallback tools and chunked I/O are verified through equivalent paths on Linux; real conpty rendering and line-length behaviour still need a device check, which is why this is marked experimental.
Install / update
- npm:
dsh-remote-console@0.10.0 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装
DSH Remote Console 0.9.0 — host list settings
Manage the sidebar's SSH host list from DSH itself: no more hand-editing ~/.ssh/config or hosts.tsv just to add a host to the panel.
Added
- Plugin-row settings page "Hosts": Sidebar → Plugins → the
dsh-remote-consolerow → configuration. One host per line — an~/.ssh/configalias, oruser@host[:port]; lines starting with#are comments. Saving writesconfig.hostsinto that row's profile patch, and the host regenerates (or removes) the sidebar "SSH remote" launchers. - Host
Configschema via@deepseek-ai/schemastery, withhostsas avolatile()field (only volatile fields appear in DSH's settings). New peer dependency; CI, release and the weekly compat job install the matching version. bin/dsh-ssh --target <spec>: direct targets configured in the settings page skip the menu and connect straight away. Shares theuser@host[:port]parser with the one-shot launcher, including the "don't split IPv6 at the last colon" rule.- The settings page registers only when the deployment provides
ctx.configForms; without it the page is absent and the terminal keeps working.
Changed
- Launchers now have two paths: aliases use
--host, direct targets use--target. Hosts removed from the settings list are cleaned up on the next generation instead of lingering in the dropdown.
Tests
tests/settings-host.test.mjs(Config parsing incl. volatile refs, line filtering, launcher generation and cleanup) andtests/settings-client.test.mjs(registration with/withoutconfigForms, version consistency). 104 tests total.
Note
The settings page's rendering inside DSH's plugin page could not be checked in a real browser from the build machine — the registration logic is tested, the host-side plumbing is verified in an isolated profile. If the page does not appear, the terminal is unaffected; please report what you see.
Install / update
- npm:
dsh-remote-console@0.9.0 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装
DSH Remote Console 0.8.0 — audit trail
A cross-session audit trail: what the agent did on the remote host no longer disappears when the terminal closes.
Added
audit/audit.jsonl— cross-session audit trail. Records agent actions only: command text (same redaction rules as the session log), exit codes, approval outcomes (allowed / rejected / no approval service), transfer paths with byte counts and sha256, port forwards, and session start/end. No screen output and none of the text the user typed. Rotates at 8 MB, keeps 5 files, file mode 0600, directory 0700.remote_audit_read(cursor, max_bytes?, tool?)— incremental read of the trail, filterable by tool; works without a live terminal.remote_audit_export(local_path, format?)— export tojsonlorcsv(fixed columns, 0600) for archiving, hand-off or before uninstalling.DSH_RC_AUDIT=offstops writing the trail (reading and exporting existing records still works).remote_statusreports the audit path and size; the sidebar panel shows an "audit/" hint.tests/tools-sshd.test.mjs: real sshd + fake DSH services, executing the registered tool definitions end to end (remote_exec, upload/download with sha256, read/write round trip, forward start/list/stop) and asserting the audit trail is written without command output. Skips cleanly without ssh/sshd.
Changed
- The two logs are now explicitly separate:
logs/is the on-the-spot replay with screen output (deleted when the PTY ends);audit/is the trail that survives sessions and holds no screen content. - README (zh/en) tool table, data directory, security model and environment variables; SECURITY.md in both languages now state the split. Tool count 11 → 13.
Install / update
- npm:
dsh-remote-console@0.8.0 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装
DSH Remote Console 0.7.1 — npm page links
Patch release for the npm package page: the READMEs now link docs, SECURITY, CONTRIBUTING and the screenshots through absolute GitHub URLs, so nothing 404s or shows a broken image on npmjs.com. No plugin behaviour changed.
Fixed
- README (zh/en):
docs/compat.md,SECURITY.md,CONTRIBUTING.md,AGENTS.md,docs/verify-e2e.md,docs/AUDIT.mdand the two screenshots are referenced with absolute GitHub URLs (screenshots via raw.githubusercontent). Browsing inside the repository is unchanged.
Install / update
- npm:
dsh-remote-console@0.7.1 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装
DSH Remote Console 0.7.0 — file transfer & port forwarding
File transfer and port forwarding, both riding the SSH session you already logged in to. The agent can now move files and open tunnels without a second authentication and without the plugin ever seeing a password.
Added
remote_upload/remote_download: streamed over the authenticated ControlMaster socket, sha256 compared on both sides, no overwrite unlessoverwrite: true, 256 MB per file. Downloads go to a temporary file and are renamed only after the hash check, so a failed transfer cannot destroy an existing local file.remote_read_file/remote_write_file: read and write small remote text files (128 KB read default, 256 KB write cap). The content travels over stdin/exec, so it never shows up in the user's terminal; binary files are refused instead of being dumped as text.remote_forward:start/stop/listforssh -N -L 127.0.0.1:<local>:<remote_host>:<remote_port>, bound to loopback only. Tunnels are cancelled when the terminal ends,remote_closeruns, or the plugin unloads.- Approval for sensitive writes:
~/.ssh,/etc,/root,/boot, sudoers, systemd units and shell profiles go throughctx.approval; without an approval service the write fails closed. Paths containing..are rejected. - Real-sshd integration tests (
tests/sshd-harness.mjs+tests/integration-sshd.test.mjs): throwaway sshd on 127.0.0.1 covering wrapper login, master reuse, 1 MB upload/download with sha256, port forwarding, exit-code passthrough. They skip cleanly whenssh/sshdare missing. CI runs them. docs/compat.mdcompatibility matrix; README troubleshooting section (zh/en, 7 symptoms); tool table updated to 11 tools.scripts/bench.mjsSSH-channel baseline. Loopback environment (6 vCPU, OpenSSH 9.2p1): master setup ~190 ms, exec round-trip p50 ~12 ms / p95 ~13 ms, 1 MiB upload ~37 MiB/s, download ~23 MiB/s.
Changed
engines.dshtightened to>=0.2.1-rc.2 <0.3.0-0, so0.3.0-rc.*is no longer silently accepted.DSH_SSH_CONFIGnow applies to the exec, transfer and forwarding channels as well as the terminal wrapper, so a host can never resolve differently between the two.
Fixed
- Stopping a port forward under multiplexing: with
-Spointing at an existing master, thessh -N -Lclient can exit before or while the forward lives on the master (OpenSSH 9.6 even exits 1 after installing it).remote_forwarddecides success by whether the port listens and stops tunnels withssh -O cancel.
Install / update
- npm:
dsh-remote-console@0.7.0 - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- In DSH: 侧栏「插件」→ 卸载旧版 → 重新安装(第三方插件没有原地更新按钮)
DSH Remote Console 0.6.7 — docs & positioning
Documentation/metadata release: the plugin behaves exactly like 0.6.6.
Added
- README screenshots: the right-sidebar panel and the agent running commands in the user's
terminal. Real host names are redacted in both. SECURITY.md(English and Chinese): supported versions, private reporting through GitHub
Security Advisories, what the plugin promises, and known limitations.- A weekly
DSH next compatibilityworkflow: installs the DSHnextpeer packages and runs
the tests, so a DSH change that breaks the wrapped services shows up before users upgrade.
Changed
- Positioning: the README intro (both languages),
package.jsondescription and the GitHub
About text now lead with "you and your agent share the same terminal"; the SSH login detail
moved to the second sentence. - README links to
SECURITY.mdand the development/release documents.
Install / update
- npm:
dsh-remote-console(this release refreshes the npm page: new description, README screenshots and SECURITY links) - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
DSH Remote Console 0.6.6 — release-process release
Release-process release: the plugin behaves exactly like 0.6.5; everything here is about how a release is cut.
Added
- Release process: CI workflow (tests + release metadata) and a release workflow that
validates the tag againstpackage.json, publishes to npm with provenance through
Trusted Publishing, and attaches the packed.tgzto the GitHub release. CONTRIBUTING.md/CONTRIBUTING.zh.md,AGENTS.md, a pull request template, and a
real-device release checklist.scripts/check-release.mjs: one check for version / clientVERSION/ CHANGELOG section /
market index consistency.- GitHub Pages serves the market index from the repository (
market/index.json), so the
index no longer depends on a CDN's branch cache..nojekylladded.
Changed
CHANGELOG.mdfollows Keep a Changelog with anUnreleasedsection and compare links.
Install / update
- npm:
dsh-remote-console - Plugin market index: https://cccodder.github.io/dsh-remote-console/market/index.json
- This is the first version published by the new release workflow: tag/version validation, tests, npm publish with provenance (Trusted Publishing), and the packed
.tgzattached to this release.