dsh-remote 0.8.17 → 0.8.18

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/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  [![license](https://img.shields.io/github/license/flymysql/dsh-remote)](LICENSE)
9
9
  [![dsh-plugin](https://img.shields.io/badge/topic-dsh--plugin-7a3ef3)](https://github.com/topics/dsh-plugin)
10
10
 
11
- ![dsh-remote workspace picker](docs/cover.png)
11
+ ![dsh-remote — make any SSH machine a real DSH workspace](docs/cover.png)
12
12
 
13
13
  **Remote-work assistant for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH).**
14
14
 
@@ -74,10 +74,8 @@ core or require a listening Web server:
74
74
  `sidebar.right.pane.tab` seat. It reuses the existing explorer/editor and
75
75
  gives remote files their own session-scoped resource addresses, rather than
76
76
  sending remote paths to the local Files viewer.
77
- - When the core Web-server row is explicitly disabled (the official Desktop
78
- composition), the bundled `dsh-better-sidebar` row stays disabled. Web hosts
79
- retain the existing `/dsh-remote/*` routes and sidebar composition, including
80
- the standalone-sidebar deduplication guard.
77
+ - `dsh-better-sidebar` is not bundled. Web hosts may install it separately;
78
+ official Desktop uses the native right-sidebar integration instead.
81
79
 
82
80
  Validation so far covers Host startup, Desktop IPC JSON requests, read-only
83
81
  SSH connection/list/read, and opening the settings/import UI. Native file-tab
@@ -99,48 +97,29 @@ build allowlist or automatically approve dependency scripts.
99
97
  dsh plugin add dsh-remote # add the bundle
100
98
  ```
101
99
 
102
- One command installs everything: since **v0.7.2** the sidebar
103
- ([dsh-better-sidebar](https://www.npmjs.com/package/dsh-better-sidebar)) is a
104
- hard dependency and is mounted automatically — the 🌐 remote-file explorer and
105
- remote file viewer show up in the sidebar with no extra step. If you already
106
- have the sidebar installed on its own, the embedded copy backs off (no double
107
- mount) — regardless of whether the standalone bundle is listed **before or
108
- after** `dsh-remote` in `dsh.profile.bundles` (order-independent guard since
109
- 0.8.7; earlier versions crashed boot with `duplicate prefix route
110
- "/sidebar/api"` when the standalone bundle came after `dsh-remote`).
111
-
112
- > **Upgrading from ≤0.8.6 with a standalone sidebar?** You may keep the
113
- > standalone `dsh-better-sidebar` bundle (any order) — 0.8.7+ no longer
114
- > crashes. Or remove it from `bundles` and let dsh-remote mount the embedded
115
- > copy (version ^0.18.1 since 0.8.15 — earlier releases pinned 0.14.x, whose
116
- > `import { settingsNamespace } from "@deepseek-ai/dsh-settings"` broke once
117
- > dsh-settings 0.1.2-alpha.2 made that symbol private; issue #29).
118
-
119
- > **Harness requirement of the embedded sidebar (0.8.15+): `dsh ≥ 0.1.2-rc.1`.**
120
- > `dsh-better-sidebar` 0.18.x imports `SessionLogOffset` from
121
- > `@deepseek-ai/dsh-session`, which only exists from 0.1.2-rc.1 on. On an older
122
- > harness (0.1.0-rc.x) that import fails and the loader aborts the whole plugin
123
- > tree, so dsh does not start at all. Verified: 0.8.14 + sidebar 0.14.0 boots on
124
- > 0.1.0-rc.8, while 0.8.15 + sidebar 0.18.1 does not; both boot on 0.1.2-rc.1.
125
- > On an older harness either stay on **0.8.14**, or keep the host half by
126
- > disabling the embedded sidebar row in your profile's `cordis.patch.yml`
127
- > (verified working on 0.1.0-rc.8 — the `rw_*` tools keep working, the sidebar
128
- > UI is what you give up):
129
- >
130
- > ```yaml
131
- > - id: dsh-remote-sidebar
132
- > disabled: true
133
- > ```
134
- >
135
- > (and do not list a standalone `dsh-better-sidebar` bundle either).
136
-
137
- > **Requires the profile's pnpm linker to be `hoisted`** (the DSH profile
138
- > default, `nodeLinker: hoisted` in `pnpm-workspace.yaml`). The loader resolves
139
- > plugin packages from the profile root, so the sidebar must be reachable in
140
- > the top-level `node_modules`. If your `pnpm-workspace.yaml` was rewritten
141
- > without `nodeLinker: hoisted`, add it back (`nodeLinker: hoisted`) and run
142
- > `pnpm install` once — otherwise the embedded sidebar row fails with
143
- > `Cannot find package 'dsh-better-sidebar'`.
100
+ Since **v0.8.18**, `dsh-remote` installs and mounts only itself. The Web sidebar
101
+ ([dsh-better-sidebar](https://www.npmjs.com/package/dsh-better-sidebar)) is
102
+ optional and is no longer a dependency or an automatically mounted row. This
103
+ keeps the SSH tools and settings UI independent from a particular sidebar
104
+ implementation.
105
+
106
+ To add the optional Web remote-file explorer/editor, install both bundles:
107
+
108
+ ```bash
109
+ dsh plugin add dsh-remote
110
+ dsh plugin add dsh-better-sidebar
111
+ ```
112
+
113
+ When the standalone sidebar service is present, `dsh-remote` discovers it
114
+ dynamically and registers its remote explorer/editor tabs. Without it, all
115
+ `rw_*` tools, the settings UI, sync, audit log, and port forwarding continue to
116
+ work. Official Desktop uses its native right-sidebar seats and does not need
117
+ `dsh-better-sidebar`.
118
+
119
+ > **Upgrading from 0.7.2–0.8.17:** upgrading to 0.8.18 removes the embedded
120
+ > sidebar dependency and mount. Install `dsh-better-sidebar` separately only if
121
+ > you still want that Web UI. Any old profile override for
122
+ > `id: dsh-remote-sidebar` can be removed because that row no longer exists.
144
123
 
145
124
  (or `npm install dsh-remote` + add `- id: dsh-remote / name: dsh-remote` in `cordis.patch.yml`).
146
125
 
package/README.zh.md CHANGED
@@ -13,8 +13,8 @@
13
13
  `dsh-app:` 通道承载请求,鉴权仍由宿主负责,不启动 Web Server。
14
14
  - 通过 `sidebarRightTabs` 和 `sidebar.right.pane.tab` 提供原生“远程文件”入口,
15
15
  复用原来的文件树与编辑器,不把远端路径传给本地文件预览器。
16
- - 官方 Desktop 显式禁用 Web Server 时,不挂载内置 `dsh-better-sidebar`;
17
- Web 版仍保留原路由、侧栏及独立安装时的去重逻辑。
16
+ - `dsh-better-sidebar` 不再内置;Web 版可以单独安装,官方 Desktop 则使用
17
+ 原生右侧栏集成。
18
18
 
19
19
  已验证 Host 启动、IPC 请求、真实 SSH 的只读连接/目录列表/文本读取,以及设置页和
20
20
  测试 SSH 配置的导入。文件标签的完整 UI 操作、编辑/同步、多机器并行会话,以及旧 Web
@@ -28,7 +28,7 @@ Desktop 安装器还可能要求明确配置 `ssh2` / `cpu-features` 可选构
28
28
  [![license](https://img.shields.io/github/license/flymysql/dsh-remote)](LICENSE)
29
29
  [![dsh-plugin](https://img.shields.io/badge/topic-dsh--plugin-7a)](https://github.com/topics/dsh-plugin)
30
30
 
31
- ![dsh-remote 工作区选择](docs/cover.png)
31
+ ![dsh-remote —— 把任意 SSH 机器变成真正的 DSH 工作区](docs/cover.png)
32
32
 
33
33
  **为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)打造的远程工作助手。**
34
34
 
@@ -76,38 +76,25 @@ DSH 的 Web 界面刻意只监听 `127.0.0.1`(CLI 为安全拒绝 `--host 0.0.
76
76
  dsh plugin add dsh-remote # 添加 bundle
77
77
  ```
78
78
 
79
- 一条命令装齐:从 **v0.7.2** 起,侧边栏
80
- ([dsh-better-sidebar](https://www.npmjs.com/package/dsh-better-sidebar))是
81
- **硬依赖并自动挂载** —— 装完 dsh-remote 后,侧边栏里的「🌐 远程文件」目录树和
82
- 远程文件查看器即可直接用,无需额外步骤。如果你已单独安装过该侧边栏,内嵌副本
83
- 会自动退避(不会重复挂载)。
84
-
85
- > **内嵌侧边栏版本**:0.8.15 起依赖范围为 `^0.18.1`。0.8.14 及更早锁在 `^0.14.0`,
86
- > 而 0.14.0~0.17.1 仍然 `import { settingsNamespace } from "@deepseek-ai/dsh-settings"`,
87
- > 该导出自 dsh-settings 0.1.2-alpha.2 起被移除,静态导入失败会让整个插件树加载失败
88
- > (issue #29)。
89
-
90
- > **⚠ 内嵌侧边栏对 harness 的要求(0.8.15+):`dsh ≥ 0.1.2-rc.1`**。
91
- > `dsh-better-sidebar` 0.18.x 会 `import { SessionLogOffset } from "@deepseek-ai/dsh-session"`,
92
- > 该导出从 0.1.2-rc.1 才有。在更老的 harness(0.1.0-rc.x)上这个静态导入会失败,
93
- > loader 因此判定整个插件树加载失败 —— **dsh 直接起不来**。实测:`0.8.14 + 侧边栏 0.14.0`
94
- > 在 0.1.0-rc.8 上可以正常启动,`0.8.15 + 侧边栏 0.18.1` 不行;两者在 0.1.2-rc.1 上都正常。
95
- > 老 harness 上要么**留在 0.8.14**,要么在 profile 的 `cordis.patch.yml` 里关掉内嵌侧边栏行
96
- > 以保住 host 半(已在 0.1.0-rc.8 实测可启动,`rw_*` 工具照常可用,放弃的只是侧边栏 UI):
97
- >
98
- > ```yaml
99
- > - id: dsh-remote-sidebar
100
- > disabled: true
101
- > ```
102
- >
103
- > (同时不要再单独列出 `dsh-better-sidebar` bundle。)
104
-
105
- > **要求 profile 的 pnpm linker 为 `hoisted`**(DSH profile 默认,
106
- > `pnpm-workspace.yaml` 里 `nodeLinker: hoisted`)。loader 从 profile 根解析
107
- > 插件包,侧边栏必须能在顶层 `node_modules` 被解析到。如果你的
108
- > `pnpm-workspace.yaml` 被重写丢掉了 `nodeLinker: hoisted`,请补回并执行一次
109
- > `pnpm install` —— 否则内嵌侧边栏行会报
110
- > `Cannot find package 'dsh-better-sidebar'`。
79
+ 从 **v0.8.18** 起,`dsh-remote` 只安装并挂载自身。Web 侧边栏
80
+ ([dsh-better-sidebar](https://www.npmjs.com/package/dsh-better-sidebar))
81
+ 改为可选,不再是依赖,也不会被自动挂载。这样 SSH 工具和设置页不再被某个侧边栏
82
+ 实现的版本/API 变化拖垮。
83
+
84
+ 如需 Web 版远程文件浏览/编辑,请显式安装两个 bundle:
85
+
86
+ ```bash
87
+ dsh plugin add dsh-remote
88
+ dsh plugin add dsh-better-sidebar
89
+ ```
90
+
91
+ 独立侧边栏 service 存在时,`dsh-remote` 会动态发现它并注册远程文件 tab;
92
+ 不安装时,`rw_*` 工具、设置页、同步、审计日志和端口转发均照常工作。
93
+ 官方 Desktop 使用原生右侧栏,不需要安装 `dsh-better-sidebar`。
94
+
95
+ > **从 0.7.2–0.8.17 升级:** 升到 0.8.18 后,内嵌侧边栏依赖和挂载会消失。
96
+ > 只有仍需要 Web 侧边栏 UI 时才单独安装 `dsh-better-sidebar`。旧 profile 里针对
97
+ > `id: dsh-remote-sidebar` 的覆盖可以删除,因为这行已不存在。
111
98
 
112
99
  (或 `npm install dsh-remote`,再在 `cordis.patch.yml` 加 `- id: dsh-remote / name: dsh-remote`。)
113
100
 
package/cordis.patch.yml CHANGED
@@ -1,59 +1,9 @@
1
- # dsh-remote bundle patch: inserts this plugin into a profile's layer stack.
2
- # Applied when a profile lists this bundle; rows reference the package by name so
3
- # Node resolution finds the installed code.
1
+ # dsh-remote bundle patch: inserts only this plugin into a profile's layer stack.
4
2
  #
5
- # Since v0.7.2 dsh-remote ships dsh-better-sidebar as a hard dependency and
6
- # mounts it here, so `dsh plugin add dsh-remote` brings up the sidebar with
7
- # zero extra steps on Web. Official Desktop explicitly disables the Web server
8
- # row and uses the native right-sidebar seats instead. The sidebar
9
- # row uses a DEDICATED id (`dsh-remote-sidebar`)
10
- # and a guard so it backs off when another row mounts `dsh-better-sidebar`
11
- # (e.g. the user installed the sidebar bundle on its own, or an aggregate
12
- # bundle owns it) — two enabled mounts would both register /sidebar/api and
13
- # fail the whole plugin tree at boot.
14
- #
15
- # Order-independence (issue #12): the guard must NOT depend on
16
- # `ctx.loader.entries()` creation order. The loader creates entries in bundle
17
- # order and each row's disabled expression is evaluated at creation time, when
18
- # only rows created BEFORE it are visible — so with
19
- # `bundles: [..., "dsh-remote", "dsh-better-sidebar", ...]` (standalone sidebar
20
- # installed after dsh-remote, the normal `dsh plugin add` append order) both
21
- # rows saw no other sidebar mount and BOTH started, crashing boot with
22
- # `duplicate prefix route "/sidebar/api"`.
23
- #
24
- # Instead we scan the COMPOSED PATCH STACK — the include entry's
25
- # `config.patches` (every bundle layer in `dsh.profile.bundles` order, then the
26
- # profile/home/overlay layers) — for any OTHER row that mounts
27
- # `dsh-better-sidebar`. That data is fully materialized before any row guard
28
- # evaluates, so the outcome is identical no matter where the standalone bundle
29
- # sits in the bundle list. It is also pure data: it never reads another row's
30
- # `disabled` (reading another row's disabled expression would recursively
31
- # re-enter the loader — dsh-better-sidebar's own row carries one too, so the
32
- # two would ping-pong), so no recursion is possible. The old entries()-based
33
- # check is kept as a belt-and-suspenders fallback for rows not visible in the
34
- # patch stack (e.g. an entry injected at runtime by HMR or another plugin).
3
+ # dsh-better-sidebar is deliberately not mounted here and is not a dependency.
4
+ # Users who want that optional Web UI can install its bundle separately;
5
+ # lib/client.js discovers the betterSidebar service dynamically and adds the
6
+ # remote explorer/editor tabs when it is present.
35
7
  - insert:
36
8
  - id: dsh-remote
37
9
  name: 'dsh-remote'
38
- - id: dsh-remote-sidebar
39
- name: 'dsh-better-sidebar'
40
- disabled: !!js >-
41
- (function () {
42
- // Inspect the core row's explicit disabled flag, not service presence:
43
- // a Web server that simply has not started yet must still be awaited.
44
- // Do not evaluate another sidebar's disabled guard (issue #12).
45
- if ([...ctx.loader.entries()].some((e) => e.options.name === '@deepseek-ai/dsh-host-webserver' && e.options.disabled === true)) return true
46
- try {
47
- const inc = ctx.loader && ctx.loader.resolve && ctx.loader.resolve('include')
48
- const patches = inc && inc.subtree && inc.subtree.config && inc.subtree.config.patches
49
- if (Array.isArray(patches)) {
50
- for (const p of patches) {
51
- if (!p || !Array.isArray(p.insert)) continue
52
- for (const row of p.insert) {
53
- if (row && row.name === 'dsh-better-sidebar' && row.id !== 'dsh-remote-sidebar') return true
54
- }
55
- }
56
- }
57
- } catch (e) {}
58
- return [...ctx.loader.entries()].some((e) => e.options.name === 'dsh-better-sidebar' && e.options.id !== 'dsh-remote-sidebar')
59
- })()
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-remote",
3
- "version": "0.8.17",
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 21 rw_* tools (incl. rw_edit/rw_stat/rw_mkdir/rw_remove/rw_move/rw_forward), conflict-aware mirror sync, port forwarding, side-bar remote file editing, audit log, keychain passwords.",
3
+ "version": "0.8.18",
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 21 rw_* tools (incl. rw_edit/rw_stat/rw_mkdir/rw_remove/rw_move/rw_forward), conflict-aware mirror sync, 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
  "homepage": "https://github.com/flymysql/dsh-remote",
@@ -66,7 +66,6 @@
66
66
  "dependencies": {
67
67
  "ssh2": "^1.16.0",
68
68
  "@deepseek-ai/schemastery": "^3.18.1",
69
- "dsh-better-sidebar": "^0.18.1",
70
69
  "iconv-lite": "^0.6.3"
71
70
  },
72
71
  "devDependencies": {