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 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 + one patch line.
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 # cordis.patch.yml insert line that enables the plugin
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 + append patch + prompt restart
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, appends the patch line automatically
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> # install into the profile
94
- # Append the insert line from patches/multi-wall.yml to ~/.dsh/profiles/web/cordis.patch.yml
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
- - **最小改动**:新增一个 client 插件包 + 一个 patch 行。
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 # 启用插件的 cordis.patch.yml insert 行
67
+ patches/multi-wall.yml # 可选 `--patch` overlay(通常不需要;插件经 dsh.bundle 自动挂载)
68
68
  scripts/
69
- install-plugin.ps1 # 打包 + 装进 profile + 追加 patch + 提示重启
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,自动追加 patch 行
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> # 装进 profile
94
- # 把 patches/multi-wall.yml 的 insert 行加进 ~/.dsh/profiles/web/cordis.patch.yml
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
  ## 使用
@@ -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, installs the tarball into the profile
127
- with \`dsh plugin --profile <p> add\`, and appends the enable patch row to
128
- $DSH_HOME/profiles/<p>/cordis.patch.yml. Idempotent: the patch row is only
129
- added once. Restart dsh web afterwards.
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.4",
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
- #requires -Version 5.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) 把 patches/multi-wall.yml 的 insert 行追加到
10
- $DSH_HOME/profiles/web/cordis.patch.yml;
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"
@@ -1,4 +1,4 @@
1
- #requires -Version 5.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
- 启用多窗口墙的 patch 文件(默认 patches/multi-wall.yml);若已把 insert
23
- 写进 profile 的 cordis.patch.yml,可传 $null 跳过。
22
+ 备用启用方式:传给 `dsh web --patch` 的 patch 文件。插件现已声明
23
+ dsh.bundle.patch(bundle 层自动挂载),通常无需传此参数;仅当你希望
24
+ 以 overlay 方式临时启用时才使用。
24
25
 
25
26
  .PARAMETER Remote
26
27
  为每个实例启动一个带令牌认证的网关(0.0.0.0),用于手机/远程访问。