Skip to content

Releases: cccodder/dsh-remote-console

v0.10.3

Choose a tag to compare

@cccodder cccodder released this 28 Oct 09:55
01b36e0

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

Choose a tag to compare

@cccodder cccodder released this 28 Oct 07:03
ab33f6c

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

DSH Remote Console 0.10.1 — host list entry fix

Choose a tag to compare

@cccodder cccodder released this 28 Oct 06:18
b782831

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 returned undefined, registration was skipped for the whole session. It now uses ctx.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_list labels 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) and plugins.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.hosts in the profile patch vs hosts.tsv).

Tests

  • tests/host-tools.test.mjs: add/update/remove over hosts.tsv, source labels, invalid specs rejected, launcher appears in shells(). 128 tests total.

Install / update

DSH Remote Console 0.10.0 — Windows (experimental)

Choose a tag to compare

@cccodder cccodder released this 28 Oct 04:07
1f95f80

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, --target and --ask-target behaviour 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. wrapSpawnTerminal recognises these terminals from the script path in argv.
  • PTY fallback channel: with no socket, remote_exec, remote_upload / remote_download and remote_read_file / remote_write_file automatically 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_forward returns FORWARD_UNAVAILABLE on this channel: there is no authenticated reusable connection to build a tunnel on.
  • remote_status and every tool output now state transport: 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.md moves Windows from unsupported to experimental with a per-capability breakdown; SECURITY.md updates 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: pty in 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

DSH Remote Console 0.9.0 — host list settings

Choose a tag to compare

@cccodder cccodder released this 28 Oct 03:50
3162e2e

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-console row → configuration. One host per line — an ~/.ssh/config alias, or user@host[:port]; lines starting with # are comments. Saving writes config.hosts into that row's profile patch, and the host regenerates (or removes) the sidebar "SSH remote" launchers.
  • Host Config schema via @deepseek-ai/schemastery, with hosts as a volatile() 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 the user@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) and tests/settings-client.test.mjs (registration with/without configForms, 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

DSH Remote Console 0.8.0 — audit trail

Choose a tag to compare

@cccodder cccodder released this 28 Oct 03:44
21b960f

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 to jsonl or csv (fixed columns, 0600) for archiving, hand-off or before uninstalling.
  • DSH_RC_AUDIT=off stops writing the trail (reading and exporting existing records still works). remote_status reports 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

DSH Remote Console 0.7.1 — npm page links

Choose a tag to compare

@cccodder cccodder released this 28 Oct 03:05
e871627

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.md and the two screenshots are referenced with absolute GitHub URLs (screenshots via raw.githubusercontent). Browsing inside the repository is unchanged.

Install / update

DSH Remote Console 0.7.0 — file transfer & port forwarding

Choose a tag to compare

@cccodder cccodder released this 28 Oct 03:00
737d4e3

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 unless overwrite: 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 / list for ssh -N -L 127.0.0.1:<local>:<remote_host>:<remote_port>, bound to loopback only. Tunnels are cancelled when the terminal ends, remote_close runs, or the plugin unloads.
  • Approval for sensitive writes: ~/.ssh, /etc, /root, /boot, sudoers, systemd units and shell profiles go through ctx.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 when ssh/sshd are missing. CI runs them.
  • docs/compat.md compatibility matrix; README troubleshooting section (zh/en, 7 symptoms); tool table updated to 11 tools.
  • scripts/bench.mjs SSH-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.dsh tightened to >=0.2.1-rc.2 <0.3.0-0, so 0.3.0-rc.* is no longer silently accepted.
  • DSH_SSH_CONFIG now 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 -S pointing at an existing master, the ssh -N -L client can exit before or while the forward lives on the master (OpenSSH 9.6 even exits 1 after installing it). remote_forward decides success by whether the port listens and stops tunnels with ssh -O cancel.

Install / update

DSH Remote Console 0.6.7 — docs & positioning

Choose a tag to compare

@cccodder cccodder released this 25 Oct 08:00
f25789b

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 compatibility workflow: installs the DSH next peer 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.json description 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.md and the development/release documents.

Install / update

DSH Remote Console 0.6.6 — release-process release

Choose a tag to compare

@cccodder cccodder released this 25 Oct 03:12
a9bab55

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 against package.json, publishes to npm with provenance through
    Trusted Publishing, and attaches the packed .tgz to 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 / client VERSION / 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. .nojekyll added.

Changed

  • CHANGELOG.md follows Keep a Changelog with an Unreleased section and compare links.

Install / update