dsh-multi-chat 0.6.4 → 0.6.5
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 +12 -6
- package/README.zh.md +12 -6
- package/bin/dsh-multi-chat.mjs +9 -25
- package/package.json +3 -1
- package/plugin/dsh-client-ui-multi-wall/cordis.patch.yml +7 -0
- package/plugin/dsh-client-ui-multi-wall/package.json +5 -1
- package/scripts/install-plugin.ps1 +11 -24
- package/scripts/start-multi.ps1 +4 -3
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ npx dsh-multi-chat start --ports 3080,3081,3082
|
|
|
56
56
|
- **No official logic is touched**: the plugin only registers two **additive list slots** (`conversation.view` ring entry, `sidebar.footer.action` sidebar shortcut) and five read-only JSON routes (`/multi/api/ports`, `/multi/api/status`, `/multi/api/stop`, `/multi/api/create`, `/multi/api/link`). No existing slot is replaced, no line is rewritten, and no core session/agent/tool logic is touched.
|
|
57
57
|
- **The UI is the official UI**: the wall is a view in the official view ring rendered inside the chat panel (not a popup). Theme, type scale, icons, and controls all use the official `--dsw-*` tokens and official primitives (Button/Input/Menu/StateDot).
|
|
58
58
|
- **Recursion guard**: the wall never embeds its own port; embedded pages carry a `?multi-wall=embed` flag and register no wall UI, preventing infinite "wall-in-wall" recursion.
|
|
59
|
-
- **Minimal footprint**: one client plugin package
|
|
59
|
+
- **Minimal footprint**: one declarative client plugin package — it ships its own `dsh.bundle.patch` + `cordis.patch.yml`, so DSH mounts it as a bundle layer automatically.
|
|
60
60
|
|
|
61
61
|
## Directory layout
|
|
62
62
|
|
|
@@ -64,9 +64,9 @@ npx dsh-multi-chat start --ports 3080,3081,3082
|
|
|
64
64
|
plugin/dsh-client-ui-multi-wall/ # spec-compliant client plugin package (node half + browser half)
|
|
65
65
|
lib/ # built artifacts (lib/index.js + lib/client.js + types)
|
|
66
66
|
src/ # source (mirrors the official monorepo packages/client/ui-multi-wall)
|
|
67
|
-
patches/multi-wall.yml #
|
|
67
|
+
patches/multi-wall.yml # optional `--patch` overlay (usually not needed; the plugin auto-mounts via dsh.bundle)
|
|
68
68
|
scripts/
|
|
69
|
-
install-plugin.ps1 # pack + install into profile
|
|
69
|
+
install-plugin.ps1 # pack + install into profile (DSH auto-mounts the bundle) + prompt restart
|
|
70
70
|
start-multi.ps1 / stop-multi.ps1 # start/stop multiple dsh web instances (-Remote can carry an authenticated gateway)
|
|
71
71
|
gateway.mjs # token-authenticated / optional-TLS reverse-proxy gateway (phone/remote access)
|
|
72
72
|
gateway-hidden.vbs # no-window launcher: starts gateway.mjs hidden (no console flash)
|
|
@@ -78,7 +78,8 @@ harness-src/ # official deepseek-harness source (dev/build
|
|
|
78
78
|
## Install & enable (Windows)
|
|
79
79
|
|
|
80
80
|
```powershell
|
|
81
|
-
# 1) Pack and install into the web profile
|
|
81
|
+
# 1) Pack and install into the web profile. The plugin declares dsh.bundle.patch,
|
|
82
|
+
# so DSH auto-mounts its bundle layer — no manual patch edit.
|
|
82
83
|
.\scripts\install-plugin.ps1
|
|
83
84
|
|
|
84
85
|
# 2) Restart dsh web and open any instance
|
|
@@ -90,8 +91,13 @@ Or manual:
|
|
|
90
91
|
|
|
91
92
|
```bash
|
|
92
93
|
cd plugin/dsh-client-ui-multi-wall && npm pack # produce a tarball
|
|
93
|
-
dsh plugin --profile web add <tarball> #
|
|
94
|
-
|
|
94
|
+
dsh plugin --profile web add <tarball> # DSH adds the package to the bundle layer stack automatically
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Uninstall (one command, nothing manual to clean up):
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
dsh plugin --profile web remove @deepseek-ai/dsh-client-ui-multi-wall
|
|
95
101
|
```
|
|
96
102
|
|
|
97
103
|
## Usage
|
package/README.zh.md
CHANGED
|
@@ -56,7 +56,7 @@ npx dsh-multi-chat start --ports 3080,3081,3082
|
|
|
56
56
|
- **不改动任何官方逻辑**:插件只注册两个**增量列表槽位**(`conversation.view` 视图环条目、`sidebar.footer.action` 侧边栏快捷入口)和五个只读 JSON 路由(`/multi/api/ports`、`/multi/api/status`、`/multi/api/stop`、`/multi/api/create`、`/multi/api/link`)。不替换任何既有槽位、不改写任何行、不触碰会话/代理/工具等核心逻辑。
|
|
57
57
|
- **界面就是官方界面**:墙是官方视图环的一个视图,渲染在对话主面板内(不是弹层),主题、字号、图标、控件全部走官方 `--dsw-*` token 与官方 primitives(Button/Input/Menu/StateDot)。
|
|
58
58
|
- **递归防护**:墙永远不嵌入自身端口;被嵌入页面带 `?multi-wall=embed` 标记,不注册任何墙界面,杜绝「墙中墙」无限递归。
|
|
59
|
-
-
|
|
59
|
+
- **最小改动**:一个声明式 client 插件包 —— 包内自带 `dsh.bundle.patch` + `cordis.patch.yml`,DSH 启动时自动作为 bundle 层挂载,无需手改任何文件。
|
|
60
60
|
|
|
61
61
|
## 目录结构
|
|
62
62
|
|
|
@@ -64,9 +64,9 @@ npx dsh-multi-chat start --ports 3080,3081,3082
|
|
|
64
64
|
plugin/dsh-client-ui-multi-wall/ # 官方规范 client 插件包(node half + browser half)
|
|
65
65
|
lib/ # 已构建产物(lib/index.js + lib/client.js + 类型)
|
|
66
66
|
src/ # 源码(与官方 monorepo packages/client/ui-multi-wall 一致)
|
|
67
|
-
patches/multi-wall.yml #
|
|
67
|
+
patches/multi-wall.yml # 可选 `--patch` overlay(通常不需要;插件经 dsh.bundle 自动挂载)
|
|
68
68
|
scripts/
|
|
69
|
-
install-plugin.ps1 # 打包 + 装进 profile
|
|
69
|
+
install-plugin.ps1 # 打包 + 装进 profile(DSH 自动挂载 bundle 层)+ 提示重启
|
|
70
70
|
start-multi.ps1 / stop-multi.ps1 # 启停多个 dsh web 实例(-Remote 可带认证网关)
|
|
71
71
|
gateway.mjs # 带令牌认证 / 可选 TLS 的反向代理网关(手机/远程访问)
|
|
72
72
|
gateway-hidden.vbs # 无窗口启动器:用隐藏窗口方式启动 gateway.mjs(不弹控制台)
|
|
@@ -78,7 +78,8 @@ harness-src/ # 官方 deepseek-harness 源码(开发/构
|
|
|
78
78
|
## 安装与启用(Windows)
|
|
79
79
|
|
|
80
80
|
```powershell
|
|
81
|
-
# 1) 打包并装进 web profile
|
|
81
|
+
# 1) 打包并装进 web profile。插件声明了 dsh.bundle.patch,
|
|
82
|
+
# DSH 会自动挂载其 bundle 层 —— 无需手改 patch。
|
|
82
83
|
.\scripts\install-plugin.ps1
|
|
83
84
|
|
|
84
85
|
# 2) 重启 dsh web,打开任意实例
|
|
@@ -90,8 +91,13 @@ dsh web --port 3084
|
|
|
90
91
|
|
|
91
92
|
```bash
|
|
92
93
|
cd plugin/dsh-client-ui-multi-wall && npm pack # 得到 tarball
|
|
93
|
-
dsh plugin --profile web add <tarball> #
|
|
94
|
-
|
|
94
|
+
dsh plugin --profile web add <tarball> # DSH 自动把包加入 bundle 层栈
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
卸载(一条命令,无需手动清理任何文件):
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
dsh plugin --profile web remove @deepseek-ai/dsh-client-ui-multi-wall
|
|
95
101
|
```
|
|
96
102
|
|
|
97
103
|
## 使用
|
package/bin/dsh-multi-chat.mjs
CHANGED
|
@@ -123,10 +123,11 @@ const INSTALL_HELP = `dsh-multi-chat install — install the multi-window wall p
|
|
|
123
123
|
Usage:
|
|
124
124
|
dsh-multi-chat install [--profile web]
|
|
125
125
|
|
|
126
|
-
Packs plugin/dsh-client-ui-multi-wall
|
|
127
|
-
with \`dsh plugin --profile <p> add
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
Packs plugin/dsh-client-ui-multi-wall and installs the tarball into the profile
|
|
127
|
+
with \`dsh plugin --profile <p> add\`. The plugin declares \`dsh.bundle.patch\`
|
|
128
|
+
(pointing at its own cordis.patch.yml), so DSH mounts it automatically as a
|
|
129
|
+
bundle layer — no manual profile patch is needed. Restart dsh web afterwards.
|
|
130
|
+
Uninstall with: dsh plugin --profile <p> remove @deepseek-ai/dsh-client-ui-multi-wall
|
|
130
131
|
`
|
|
131
132
|
|
|
132
133
|
async function cmdInstall(args) {
|
|
@@ -151,30 +152,13 @@ async function cmdInstall(args) {
|
|
|
151
152
|
const tarball = join(stableDir, tarballName)
|
|
152
153
|
if (!existsSync(tarball)) throw new Error('npm pack produced no tarball')
|
|
153
154
|
|
|
154
|
-
// 2) install into the profile.
|
|
155
|
+
// 2) install into the profile. DSH reconciles `dsh.profile.bundles` from the
|
|
156
|
+
// installed dependency set: because this package declares `dsh.bundle.patch`,
|
|
157
|
+
// `dsh plugin add` leaves it in the bundle layer stack and its own
|
|
158
|
+
// cordis.patch.yml is mounted automatically — no manual profile patch edits.
|
|
155
159
|
process.stdout.write(`installing ${tarballName} into profile '${profile}'…\n`)
|
|
156
160
|
run('dsh', ['plugin', '--profile', profile, 'add', tarball])
|
|
157
161
|
|
|
158
|
-
// 3) append the enable patch row (idempotent).
|
|
159
|
-
const patchPath = join(dshHome(), 'profiles', profile, 'cordis.patch.yml')
|
|
160
|
-
const insert = [
|
|
161
|
-
'',
|
|
162
|
-
'# Multi-window wall (dsh-multi-chat): enable the official client',
|
|
163
|
-
'# plugin that renders the wall inside the DSH web GUI.',
|
|
164
|
-
'- insert:',
|
|
165
|
-
' - id: ui-multi-wall',
|
|
166
|
-
" name: '@deepseek-ai/dsh-client-ui-multi-wall'",
|
|
167
|
-
'',
|
|
168
|
-
].join('\n')
|
|
169
|
-
let content = ''
|
|
170
|
-
if (existsSync(patchPath)) content = readFileSync(patchPath, 'utf8')
|
|
171
|
-
if (!content.includes('ui-multi-wall')) {
|
|
172
|
-
writeFileSync(patchPath, content.trimEnd() + '\n' + insert, 'utf8')
|
|
173
|
-
process.stdout.write(`patched ${patchPath}\n`)
|
|
174
|
-
} else {
|
|
175
|
-
process.stdout.write(`profile patch already enables ui-multi-wall (${patchPath})\n`)
|
|
176
|
-
}
|
|
177
|
-
|
|
178
162
|
process.stdout.write('\nDone. Restart dsh web to load the wall:\n')
|
|
179
163
|
process.stdout.write(' dsh web --port <n>\n')
|
|
180
164
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-multi-chat",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"description": "DSH 多对话:在官方 DeepSeek Harness Web 界面里以多窗口网格并排运行、监控多个对话实例,一屏盯住所有 Agent 的实时进度;内置带口令认证的局域网网关,手机/平板也能看。npx dsh-multi-chat install|start|stop|gateway",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -70,6 +70,8 @@
|
|
|
70
70
|
"README.zh.md",
|
|
71
71
|
"plugin/dsh-client-ui-multi-wall/package.json",
|
|
72
72
|
"plugin/dsh-client-ui-multi-wall/README.md",
|
|
73
|
+
"plugin/dsh-client-ui-multi-wall/README.zh.md",
|
|
74
|
+
"plugin/dsh-client-ui-multi-wall/cordis.patch.yml",
|
|
73
75
|
"plugin/dsh-client-ui-multi-wall/lib/index.js",
|
|
74
76
|
"plugin/dsh-client-ui-multi-wall/lib/invariant.js",
|
|
75
77
|
"plugin/dsh-client-ui-multi-wall/lib/client.js",
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# dsh-client-ui-multi-wall bundle patch — append the multi-window wall loader
|
|
2
|
+
# entry to the profile's root entry list. As a `dsh.bundle` layer this patch is
|
|
3
|
+
# applied automatically by DSH when the package is installed into a profile
|
|
4
|
+
# (`dsh plugin --profile web add <pkg>`); no manual profile patch is required.
|
|
5
|
+
- insert:
|
|
6
|
+
- id: ui-multi-wall
|
|
7
|
+
name: '@deepseek-ai/dsh-client-ui-multi-wall'
|
|
@@ -30,6 +30,9 @@
|
|
|
30
30
|
"./package.json": "./package.json"
|
|
31
31
|
},
|
|
32
32
|
"dsh": {
|
|
33
|
+
"bundle": {
|
|
34
|
+
"patch": "./cordis.patch.yml"
|
|
35
|
+
},
|
|
33
36
|
"client": {
|
|
34
37
|
"inject": [
|
|
35
38
|
"@deepseek-ai/dsh-client-runtime",
|
|
@@ -79,6 +82,7 @@
|
|
|
79
82
|
"lib/index.js",
|
|
80
83
|
"lib/invariant.js",
|
|
81
84
|
"lib/client.js",
|
|
82
|
-
"lib/types/**/*.d.ts"
|
|
85
|
+
"lib/types/**/*.d.ts",
|
|
86
|
+
"cordis.patch.yml"
|
|
83
87
|
]
|
|
84
88
|
}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
#requires -Version 5.1
|
|
2
2
|
<#
|
|
3
3
|
.SYNOPSIS
|
|
4
|
-
把多窗口墙插件装进 DSH web profile
|
|
4
|
+
把多窗口墙插件装进 DSH web profile 并启用(官方声明式 bundle 形态)。
|
|
5
5
|
|
|
6
6
|
.DESCRIPTION
|
|
7
7
|
1) 将 plugin/dsh-client-ui-multi-wall 打包为 tarball;
|
|
8
8
|
2) 用 `dsh plugin --profile web add` 装进 profile;
|
|
9
|
-
3)
|
|
10
|
-
|
|
9
|
+
3) DSH 自动调和 dsh.profile.bundles:插件包声明了 dsh.bundle.patch
|
|
10
|
+
(指向包内自带 cordis.patch.yml),DSH 启动时自动挂载该 bundle 层,
|
|
11
|
+
无需手动编辑 profile 的 cordis.patch.yml;
|
|
11
12
|
4) 提示重启 `dsh web` 生效(打开 http://127.0.0.1:<port> 后,
|
|
12
13
|
侧边栏底部会出现「多窗口墙」按钮)。
|
|
13
14
|
|
|
15
|
+
卸载(一条命令,无需手动删 patch 或文件):
|
|
16
|
+
dsh plugin --profile <Profile> remove @deepseek-ai/dsh-client-ui-multi-wall
|
|
17
|
+
|
|
14
18
|
.PARAMETER Profile
|
|
15
19
|
profile 名,默认 web。
|
|
16
20
|
|
|
@@ -24,10 +28,8 @@ param(
|
|
|
24
28
|
$ErrorActionPreference = "Stop"
|
|
25
29
|
$root = Split-Path -Parent $PSScriptRoot
|
|
26
30
|
$pluginDir = Join-Path $root "plugin\dsh-client-ui-multi-wall"
|
|
27
|
-
$patchFile = Join-Path $root "patches\multi-wall.yml"
|
|
28
31
|
|
|
29
32
|
if (-not (Test-Path $pluginDir)) { throw "未找到插件目录:$pluginDir" }
|
|
30
|
-
if (-not (Test-Path $patchFile)) { throw "未找到 patch 文件:$patchFile" }
|
|
31
33
|
|
|
32
34
|
# 1) pack tarball
|
|
33
35
|
$tarball = Join-Path $root "dsh-client-ui-multi-wall.tgz"
|
|
@@ -37,29 +39,14 @@ Pop-Location
|
|
|
37
39
|
if (-not (Test-Path $tarball)) { throw "npm pack 失败,未生成 $tarball" }
|
|
38
40
|
Write-Host "已打包:$tarball"
|
|
39
41
|
|
|
40
|
-
# 2) install into profile
|
|
42
|
+
# 2) install into profile — DSH 依据插件的 dsh.bundle 声明自动把包加入
|
|
43
|
+
# dsh.profile.bundles 层栈并挂载其自带 cordis.patch.yml,无需手改 patch。
|
|
41
44
|
Write-Host "安装到 profile '$Profile'(等价于 pnpm add <tarball>)…"
|
|
42
45
|
dsh plugin --profile $Profile add $tarball
|
|
43
46
|
if ($LASTEXITCODE -ne 0) { throw "dsh plugin add 失败(exit $LASTEXITCODE)" }
|
|
44
47
|
|
|
45
|
-
# 3) append the insert row to the profile patch (idempotent)
|
|
46
|
-
$home = $env:DSH_HOME
|
|
47
|
-
if ([string]::IsNullOrEmpty($home)) { $home = Join-Path $env:USERPROFILE ".dsh" }
|
|
48
|
-
$profilePatch = Join-Path $home "profiles\$Profile\cordis.patch.yml"
|
|
49
|
-
if (-not (Test-Path $profilePatch)) { throw "未找到 profile patch:$profilePatch" }
|
|
50
|
-
$content = Get-Content $profilePatch -Raw
|
|
51
|
-
if ($content -notmatch "ui-multi-wall") {
|
|
52
|
-
$insert = Get-Content $patchFile -Raw
|
|
53
|
-
# 把 patch 文件的 insert 块合并进 profile patch(去掉头部注释,保留 YAML 列表语义)
|
|
54
|
-
$insertBlock = ($insert -split "`n" | Where-Object { $_ -notmatch "^\s*#" -and $_.Trim() -ne "" }) -join "`n"
|
|
55
|
-
$newContent = $content.TrimEnd() + "`n" + $insertBlock + "`n"
|
|
56
|
-
Set-Content -Path $profilePatch -Value $newContent -Encoding UTF8
|
|
57
|
-
Write-Host "已追加到 $profilePatch"
|
|
58
|
-
} else {
|
|
59
|
-
Write-Host "profile patch 已包含 ui-multi-wall,跳过追加。"
|
|
60
|
-
}
|
|
61
|
-
|
|
62
48
|
Write-Host ""
|
|
63
49
|
Write-Host "完成。重启 dsh web 生效:"
|
|
64
50
|
Write-Host " dsh web --port <n>"
|
|
65
51
|
Write-Host "打开后侧边栏底部应出现「多窗口墙」按钮。"
|
|
52
|
+
Write-Host "卸载:dsh plugin --profile $Profile remove @deepseek-ai/dsh-client-ui-multi-wall"
|
package/scripts/start-multi.ps1
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
#requires -Version 5.1
|
|
2
2
|
<#
|
|
3
3
|
.SYNOPSIS
|
|
4
4
|
启动多个 DSH web 实例(多窗口墙直接内嵌在官方界面里,无需独立服务器)。
|
|
@@ -19,8 +19,9 @@
|
|
|
19
19
|
默认 "3080,3081,3082,3083"。
|
|
20
20
|
|
|
21
21
|
.PARAMETER Patch
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
备用启用方式:传给 `dsh web --patch` 的 patch 文件。插件现已声明
|
|
23
|
+
dsh.bundle.patch(bundle 层自动挂载),通常无需传此参数;仅当你希望
|
|
24
|
+
以 overlay 方式临时启用时才使用。
|
|
24
25
|
|
|
25
26
|
.PARAMETER Remote
|
|
26
27
|
为每个实例启动一个带令牌认证的网关(0.0.0.0),用于手机/远程访问。
|