@michengai/dsh-codex-ui 1.1.22 → 1.1.24
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/CHANGELOG.md +46 -0
- package/CHANGELOG.zh-CN.md +46 -0
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/lib/index.mjs +144 -18
- package/package.json +36 -36
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,52 @@
|
|
|
4
4
|
|
|
5
5
|
This changelog records recent releases of DSH Codex UI and its one-click installer. Earlier changes remain available in the [Git history](https://github.com/MichengAI/dsh-codex-ui/commits/main).
|
|
6
6
|
|
|
7
|
+
## 1.1.24 - 2026-09-30
|
|
8
|
+
|
|
9
|
+
- About-page installs on official Desktop now use the host's bundled pnpm instead of launching the dsh command inside the app archive.
|
|
10
|
+
- Host support includes DSH `0.2.0-rc.2`. The sidebar, layout, and slot contracts match `0.2.0-rc.1`; without this declaration the new Desktop disables the plugin. Development dependencies are pinned to `0.2.0-rc.2`.
|
|
11
|
+
|
|
12
|
+
## suite-installer-v1.0.30 - 2026-09-29
|
|
13
|
+
|
|
14
|
+
Install or maintain 11 first-party plugins in one step. Included plugins and versions:
|
|
15
|
+
|
|
16
|
+
- `@michengai/dsh-archive-manager@1.0.7`
|
|
17
|
+
- `@michengai/dsh-codex-ui@1.1.22`
|
|
18
|
+
- `@michengai/dsh-skills-manager@1.1.5`
|
|
19
|
+
- `@michengai/dsh-agency-agents@1.0.6`
|
|
20
|
+
- `@michengai/dsh-im-connect@0.1.57`
|
|
21
|
+
- `@michengai/dsh-automation@0.1.52`
|
|
22
|
+
- `@michengai/dsh-btw@0.1.14`
|
|
23
|
+
- `@michengai/dsh-simplify@0.1.11`
|
|
24
|
+
- `@michengai/dsh-pua@0.3.19`
|
|
25
|
+
- `@michengai/dsh-code-review@0.1.8`
|
|
26
|
+
- `@michengai/dsh-codex-pet@0.1.11`
|
|
27
|
+
|
|
28
|
+
The installer uses these exact versions for reproducible installation.
|
|
29
|
+
|
|
30
|
+
## 1.1.23 - 2026-09-29
|
|
31
|
+
|
|
32
|
+
- Installing or updating other plugins from the About page in official DeepSeek Harness Desktop no longer crashes the desktop host.
|
|
33
|
+
- Those installs are written to the current desktop profile. Restart the app once afterward so the new plugin can load.
|
|
34
|
+
|
|
35
|
+
## suite-installer-v1.0.29 - 2026-09-29
|
|
36
|
+
|
|
37
|
+
Install or maintain 11 first-party plugins in one step. Included plugins and versions:
|
|
38
|
+
|
|
39
|
+
- `@michengai/dsh-archive-manager@1.0.7`
|
|
40
|
+
- `@michengai/dsh-codex-ui@1.1.21`
|
|
41
|
+
- `@michengai/dsh-skills-manager@1.1.5`
|
|
42
|
+
- `@michengai/dsh-agency-agents@1.0.6`
|
|
43
|
+
- `@michengai/dsh-im-connect@0.1.57`
|
|
44
|
+
- `@michengai/dsh-automation@0.1.52`
|
|
45
|
+
- `@michengai/dsh-btw@0.1.14`
|
|
46
|
+
- `@michengai/dsh-simplify@0.1.11`
|
|
47
|
+
- `@michengai/dsh-pua@0.3.19`
|
|
48
|
+
- `@michengai/dsh-code-review@0.1.8`
|
|
49
|
+
- `@michengai/dsh-codex-pet@0.1.11`
|
|
50
|
+
|
|
51
|
+
The installer uses these exact versions for reproducible installation.
|
|
52
|
+
|
|
7
53
|
## 1.1.22 - 2026-09-29
|
|
8
54
|
|
|
9
55
|
- Host support now starts at DSH `0.1.2-rc.1` and lists every release candidate through `0.2.0-rc.1`: `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, and `0.2.0-rc.1`. This adds the previously missing `0.1.5-rc.3` and matches the other first-party plugins; `0.1.0-rc.8` and `0.1.1-rc.2` are no longer declared.
|
package/CHANGELOG.zh-CN.md
CHANGED
|
@@ -4,6 +4,52 @@
|
|
|
4
4
|
|
|
5
5
|
本日志记录 DSH Codex UI 及其一键安装器的最近发布;更早的变更可查看 [Git 提交历史](https://github.com/MichengAI/dsh-codex-ui/commits/main)。
|
|
6
6
|
|
|
7
|
+
## 1.1.24 - 2026-09-30
|
|
8
|
+
|
|
9
|
+
- 官方桌面端关于页安装其他插件时,改用宿主自带的 pnpm,不再去启动 asar 里的 dsh 命令。
|
|
10
|
+
- 宿主兼容范围加入 DSH `0.2.0-rc.2`。侧栏、布局和插槽合约与 `0.2.0-rc.1` 相同;不声明这个版本时,新桌面端会因兼容检查停用本插件。开发依赖钉到 `0.2.0-rc.2`。
|
|
11
|
+
|
|
12
|
+
## suite-installer-v1.0.30 - 2026-09-29
|
|
13
|
+
|
|
14
|
+
一键维护安装 11 个自研插件。包含以下插件及版本:
|
|
15
|
+
|
|
16
|
+
- `@michengai/dsh-archive-manager@1.0.7`
|
|
17
|
+
- `@michengai/dsh-codex-ui@1.1.22`
|
|
18
|
+
- `@michengai/dsh-skills-manager@1.1.5`
|
|
19
|
+
- `@michengai/dsh-agency-agents@1.0.6`
|
|
20
|
+
- `@michengai/dsh-im-connect@0.1.57`
|
|
21
|
+
- `@michengai/dsh-automation@0.1.52`
|
|
22
|
+
- `@michengai/dsh-btw@0.1.14`
|
|
23
|
+
- `@michengai/dsh-simplify@0.1.11`
|
|
24
|
+
- `@michengai/dsh-pua@0.3.19`
|
|
25
|
+
- `@michengai/dsh-code-review@0.1.8`
|
|
26
|
+
- `@michengai/dsh-codex-pet@0.1.11`
|
|
27
|
+
|
|
28
|
+
安装器使用这些精确版本执行安装,确保可复现。
|
|
29
|
+
|
|
30
|
+
## 1.1.23 - 2026-09-29
|
|
31
|
+
|
|
32
|
+
- 在官方 DeepSeek Harness 桌面端的关于页安装或更新其他插件时,不再把桌面宿主打崩。
|
|
33
|
+
- 安装会写入当前桌面 profile。装完后需要手动重启一次,新插件才会加载。
|
|
34
|
+
|
|
35
|
+
## suite-installer-v1.0.29 - 2026-09-29
|
|
36
|
+
|
|
37
|
+
一键维护安装 11 个自研插件。包含以下插件及版本:
|
|
38
|
+
|
|
39
|
+
- `@michengai/dsh-archive-manager@1.0.7`
|
|
40
|
+
- `@michengai/dsh-codex-ui@1.1.21`
|
|
41
|
+
- `@michengai/dsh-skills-manager@1.1.5`
|
|
42
|
+
- `@michengai/dsh-agency-agents@1.0.6`
|
|
43
|
+
- `@michengai/dsh-im-connect@0.1.57`
|
|
44
|
+
- `@michengai/dsh-automation@0.1.52`
|
|
45
|
+
- `@michengai/dsh-btw@0.1.14`
|
|
46
|
+
- `@michengai/dsh-simplify@0.1.11`
|
|
47
|
+
- `@michengai/dsh-pua@0.3.19`
|
|
48
|
+
- `@michengai/dsh-code-review@0.1.8`
|
|
49
|
+
- `@michengai/dsh-codex-pet@0.1.11`
|
|
50
|
+
|
|
51
|
+
安装器使用这些精确版本执行安装,确保可复现。
|
|
52
|
+
|
|
7
53
|
## 1.1.22 - 2026-09-29
|
|
8
54
|
|
|
9
55
|
- 宿主兼容范围从 DSH `0.1.2-rc.1` 起,逐个列出直到 `0.2.0-rc.1` 的全部候选版:`0.1.2-rc.1`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.5-rc.3`、`0.1.7-rc.1`、`0.1.7-rc.2` 与 `0.2.0-rc.1`。这补上了此前漏掉的 `0.1.5-rc.3`,并与其余自研插件保持一致;`0.1.0-rc.8` 与 `0.1.1-rc.2` 不再声明支持。
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Working across several projects and conversations in DSH Web? DSH Codex UI helps
|
|
|
24
24
|
|
|
25
25
|
## Host compatibility
|
|
26
26
|
|
|
27
|
-
This working tree explicitly declares DSH `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, and `0.2.0-rc.
|
|
27
|
+
This working tree explicitly declares DSH `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, and `0.2.0-rc.2`. Development dependencies are pinned to `0.2.0-rc.2`. No code references `@deepseek-ai/dsh-client-runtime`: it is not a peer, not a client inject, and no longer a development dependency now that the settings-lifecycle spec mounts the production `SlotRegistry` from the official `@deepseek-ai/dsh-client-ui-renderer/client` bundle. Isolated host checks cover `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, and `0.2.0-rc.2`.
|
|
28
28
|
|
|
29
29
|
## What you can do
|
|
30
30
|
|
package/README.zh-CN.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
## 宿主兼容性
|
|
26
26
|
|
|
27
|
-
当前工作区已显式声明支持 DSH `0.1.2-rc.1`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.5-rc.3`、`0.1.7-rc.1`、`0.1.7-rc.2` 或 `0.2.0-rc.
|
|
27
|
+
当前工作区已显式声明支持 DSH `0.1.2-rc.1`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.5-rc.3`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1` 或 `0.2.0-rc.2`。开发依赖钉在 `0.2.0-rc.2`。代码已不再引用 `@deepseek-ai/dsh-client-runtime`:它既不是 peer、也不写入客户端 inject;设置生命周期用例改用官方 `@deepseek-ai/dsh-client-ui-renderer/client` 装配包里的生产 `SlotRegistry` 后,这条开发依赖也已移除。隔离宿主检查覆盖 `0.1.2-rc.1`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.5-rc.3`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1` 或 `0.2.0-rc.2`。
|
|
28
28
|
|
|
29
29
|
## 你可以用它做什么
|
|
30
30
|
|
package/lib/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { apply as apply$1 } from "@deepseek-ai/dsh-client-ui-settings-general";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
import { lstat, mkdir, open, readFile, readdir, realpath, rename, rm, unlink, writeFile } from "node:fs/promises";
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
|
-
import { basename, dirname, isAbsolute, join, relative, resolve, sep, win32 } from "node:path";
|
|
6
|
+
import { basename, delimiter, dirname, isAbsolute, join, relative, resolve, sep, win32 } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
9
9
|
//#region src/business-api.ts
|
|
@@ -205,17 +205,90 @@ function resolveDependencyRuntime(ctx, options = {}) {
|
|
|
205
205
|
desktopPnpm
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
|
-
const
|
|
208
|
+
const launched = optionalService(ctx, "profileContext");
|
|
209
|
+
const launchedDir = typeof launched?.dir === "string" && isAbsolute(launched.dir) ? resolve(launched.dir) : void 0;
|
|
210
|
+
const launchedName = validProfileName(launched?.name) ? launched.name : void 0;
|
|
211
|
+
const hostProfileDir = isOfficialDesktopHostEntry(argv[1]) && existsSync(resolve(cwd, "package.json")) ? resolve(cwd) : void 0;
|
|
212
|
+
const profileDir = launchedDir ?? hostProfileDir ?? resolve(env.DSH_PROFILE_DIR ?? resolve(home, ".dsh", "profiles", "web"));
|
|
209
213
|
const selected = profileNameFromArgv(argv);
|
|
210
|
-
const profileName = validProfileName(selected) ? selected : validProfileName(basename(profileDir)) ? basename(profileDir) : "web";
|
|
214
|
+
const profileName = launchedName ?? (validProfileName(selected) ? selected : validProfileName(basename(profileDir)) ? basename(profileDir) : "web");
|
|
215
|
+
const cliEntry = resolveCliFromInstallAnchor(launched?.installAnchor) ?? resolveCliBesideDesktopHost(argv[1]);
|
|
211
216
|
const cliRuntimeRoot = argv[1] === void 0 ? void 0 : resolveDshRuntimeRoot(argv[1], cwd);
|
|
217
|
+
const anchorRoot = cliEntry === void 0 ? void 0 : resolveDshRuntimeRoot(cliEntry);
|
|
218
|
+
const runtimeRoots = [
|
|
219
|
+
env.DSH_RUNTIME_DIR,
|
|
220
|
+
anchorRoot,
|
|
221
|
+
cliRuntimeRoot
|
|
222
|
+
].filter((root) => root !== void 0 && root !== "");
|
|
223
|
+
const pluginEnv = stringEnvironment(launched?.packageManager?.env);
|
|
224
|
+
const packageManager = profilePackageManager(launched?.packageManager) ?? desktopPackageManagerFromArgv(argv);
|
|
212
225
|
return {
|
|
213
226
|
environmentKind: "cli",
|
|
214
227
|
profileName,
|
|
215
228
|
profileDir,
|
|
216
|
-
runtimeRoots
|
|
229
|
+
runtimeRoots,
|
|
230
|
+
...cliEntry === void 0 ? {} : { cliEntry },
|
|
231
|
+
...pluginEnv === void 0 ? {} : { pluginEnv },
|
|
232
|
+
...packageManager === void 0 ? {} : { packageManager }
|
|
217
233
|
};
|
|
218
234
|
}
|
|
235
|
+
function profilePackageManager(value) {
|
|
236
|
+
if (typeof value?.command !== "string" || value.command === "") return void 0;
|
|
237
|
+
if (!Array.isArray(value.args) || !value.args.every((item) => typeof item === "string")) return void 0;
|
|
238
|
+
const env = stringEnvironment(value.env);
|
|
239
|
+
return {
|
|
240
|
+
command: value.command,
|
|
241
|
+
args: value.args,
|
|
242
|
+
...env === void 0 ? {} : { env }
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** 官方 Desktop Host 把 pnpm 入口放在 argv[5],bin 放在 argv[6],不提供 desktopPnpm。 */
|
|
246
|
+
function desktopPackageManagerFromArgv(argv, command = process.execPath) {
|
|
247
|
+
if (!isOfficialDesktopHostEntry(argv[1])) return void 0;
|
|
248
|
+
const pnpm = argv[5];
|
|
249
|
+
if (typeof pnpm !== "string" || !isAbsolute(pnpm) || !existsSync(pnpm)) return void 0;
|
|
250
|
+
const bin = argv[6];
|
|
251
|
+
const path = typeof bin === "string" && bin !== "" ? `${bin}${delimiter}${process.env.PATH ?? ""}` : process.env.PATH;
|
|
252
|
+
return {
|
|
253
|
+
command,
|
|
254
|
+
args: ["--expose-internals", pnpm],
|
|
255
|
+
env: {
|
|
256
|
+
ELECTRON_RUN_AS_NODE: "1",
|
|
257
|
+
...typeof path === "string" && path !== "" ? { PATH: path } : {}
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function stringEnvironment(value) {
|
|
262
|
+
if (value === null || typeof value !== "object") return void 0;
|
|
263
|
+
const env = {};
|
|
264
|
+
for (const [key, item] of Object.entries(value)) if (typeof item === "string") env[key] = item;
|
|
265
|
+
return Object.keys(env).length === 0 ? void 0 : env;
|
|
266
|
+
}
|
|
267
|
+
/** 从公开 profileContext.installAnchor 读出 dsh bin,不把 Desktop Host 入口当成 CLI。 */
|
|
268
|
+
function resolveCliFromInstallAnchor(anchor) {
|
|
269
|
+
if (typeof anchor !== "string" || anchor === "" || !isAbsolute(anchor)) return void 0;
|
|
270
|
+
try {
|
|
271
|
+
const bin = JSON.parse(readFileSync(anchor, "utf8")).bin;
|
|
272
|
+
const relative = typeof bin === "string" ? bin : bin !== null && typeof bin === "object" && typeof bin.dsh === "string" ? bin.dsh : void 0;
|
|
273
|
+
if (relative === void 0 || relative === "") return void 0;
|
|
274
|
+
const entry = resolve(dirname(anchor), relative);
|
|
275
|
+
return existsSync(entry) ? entry : void 0;
|
|
276
|
+
} catch {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** 官方 Desktop Host 是 Electron 的 IPC 子进程;父进程只接受带 type 的事件。 */
|
|
281
|
+
function isOfficialDesktopHostEntry(entry = process.argv[1]) {
|
|
282
|
+
if (entry === void 0 || entry === "") return false;
|
|
283
|
+
return entry.replaceAll("\\", "/").includes("/dsh-desktop-host/");
|
|
284
|
+
}
|
|
285
|
+
/** 从公开包布局定位同一次安装里的 dsh CLI,不读取 launcher 私有 service。 */
|
|
286
|
+
function resolveCliBesideDesktopHost(entry = process.argv[1]) {
|
|
287
|
+
if (!isOfficialDesktopHostEntry(entry)) return void 0;
|
|
288
|
+
const index = entry.replaceAll("\\", "/").toLowerCase().lastIndexOf("/node_modules/@deepseek-ai/dsh-desktop-host/");
|
|
289
|
+
if (index < 0) return void 0;
|
|
290
|
+
return resolveCliFromInstallAnchor(resolve(entry.slice(0, index), "node_modules", "@deepseek-ai", "dsh", "package.json"));
|
|
291
|
+
}
|
|
219
292
|
function profileDirectory(runtime) {
|
|
220
293
|
return runtime.profileDir;
|
|
221
294
|
}
|
|
@@ -452,12 +525,27 @@ function resolveDshCliEntry(entry = process.argv[1], cwd = process.cwd()) {
|
|
|
452
525
|
}
|
|
453
526
|
function requestDesktopHotUpdate(send = process.send) {
|
|
454
527
|
if (typeof send !== "function") return false;
|
|
455
|
-
|
|
456
|
-
|
|
528
|
+
try {
|
|
529
|
+
if (send === process.send) {
|
|
530
|
+
if (process.connected !== true) return false;
|
|
531
|
+
process.send?.(APPLY_PLUGIN_UPDATES_IPC);
|
|
532
|
+
} else send(APPLY_PLUGIN_UPDATES_IPC);
|
|
533
|
+
return true;
|
|
534
|
+
} catch {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
457
537
|
}
|
|
458
|
-
/** Desktop
|
|
459
|
-
function canRequestParentReload(runtime, send = process.send) {
|
|
460
|
-
return runtime.environmentKind === "cli" && typeof send === "function";
|
|
538
|
+
/** Desktop 的包管理服务会自行安排重载;只有父进程能识别该消息的独立 Web 子进程才通知。 */
|
|
539
|
+
function canRequestParentReload(runtime, send = process.send, entry = process.argv[1]) {
|
|
540
|
+
return runtime.environmentKind === "cli" && !isOfficialDesktopHostEntry(entry) && typeof send === "function" && (send !== process.send || process.connected === true);
|
|
541
|
+
}
|
|
542
|
+
/** 响应已经发出后再通知父进程;通知失败不能变成未捕获异常。 */
|
|
543
|
+
function scheduleParentPluginReload(delayMs = 150) {
|
|
544
|
+
setTimeout(() => {
|
|
545
|
+
try {
|
|
546
|
+
requestDesktopHotUpdate();
|
|
547
|
+
} catch {}
|
|
548
|
+
}, delayMs).unref?.();
|
|
461
549
|
}
|
|
462
550
|
async function recordPendingUpdate(packageName, version, runtime) {
|
|
463
551
|
const pendingPath = resolve(profileDirectory(runtime), PROFILE_PENDING_UPDATES_FILE);
|
|
@@ -499,6 +587,28 @@ async function removePendingUpdate(packageName, runtime) {
|
|
|
499
587
|
if (error.code !== "ENOENT") throw error;
|
|
500
588
|
}
|
|
501
589
|
}
|
|
590
|
+
/** pnpm add 不会写 bundles。官方 Desktop 直接调宿主 pnpm 时,要自己把插件挂进 profile。 */
|
|
591
|
+
async function declareProfileBundle(packageName, runtime) {
|
|
592
|
+
if (isOfficialRuntimePackage(packageName)) return;
|
|
593
|
+
const manifestPath = resolve(profileDirectory(runtime), "package.json");
|
|
594
|
+
let manifest;
|
|
595
|
+
try {
|
|
596
|
+
manifest = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
597
|
+
} catch (error) {
|
|
598
|
+
if (error.code !== "ENOENT") throw error;
|
|
599
|
+
manifest = {};
|
|
600
|
+
}
|
|
601
|
+
const bundles = manifest.dsh?.profile?.bundles ?? [];
|
|
602
|
+
if (bundles.includes(packageName)) return;
|
|
603
|
+
manifest.dsh = {
|
|
604
|
+
...manifest.dsh,
|
|
605
|
+
profile: {
|
|
606
|
+
...manifest.dsh?.profile,
|
|
607
|
+
bundles: [...bundles, packageName]
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, void 0, 2)}\n`, "utf8");
|
|
611
|
+
}
|
|
502
612
|
async function recordDeclaredVersion(packageName, version, runtime) {
|
|
503
613
|
const manifestPath = resolve(profileDirectory(runtime), "package.json");
|
|
504
614
|
let manifest;
|
|
@@ -786,7 +896,23 @@ function monitorDesktopPlugin(handle, timeoutMs = PLUGIN_INSTALL_TIMEOUT_MS) {
|
|
|
786
896
|
function runDshPlugin(args, runtime = resolveDependencyRuntime(), timeoutMs = PLUGIN_INSTALL_TIMEOUT_MS) {
|
|
787
897
|
const desktopPnpm = runtime.desktopPnpm;
|
|
788
898
|
if (desktopPnpm !== void 0) return monitorDesktopPlugin(withPnpmEntry(() => desktopPnpm.runPlugin(args, runtime.profileDir)), timeoutMs);
|
|
789
|
-
const
|
|
899
|
+
const packageManager = runtime.packageManager;
|
|
900
|
+
if (packageManager !== void 0) return monitorPluginChild(spawn(packageManager.command, [...packageManager.args, ...args], {
|
|
901
|
+
cwd: runtime.profileDir,
|
|
902
|
+
env: {
|
|
903
|
+
...pluginSpawnEnv(),
|
|
904
|
+
...runtime.pluginEnv,
|
|
905
|
+
...packageManager.env
|
|
906
|
+
},
|
|
907
|
+
windowsHide: true,
|
|
908
|
+
stdio: [
|
|
909
|
+
"ignore",
|
|
910
|
+
"pipe",
|
|
911
|
+
"pipe"
|
|
912
|
+
]
|
|
913
|
+
}), timeoutMs, "desktop");
|
|
914
|
+
const entry = runtime.cliEntry ?? resolveDshCliEntry();
|
|
915
|
+
if (isOfficialDesktopHostEntry(entry)) throw new Error("无法定位 DSH CLI。请从 DSH 命令启动 Web 服务后重试。");
|
|
790
916
|
return monitorPluginChild(spawn(process.execPath, [
|
|
791
917
|
...pluginExecArgv(),
|
|
792
918
|
entry,
|
|
@@ -796,7 +922,10 @@ function runDshPlugin(args, runtime = resolveDependencyRuntime(), timeoutMs = PL
|
|
|
796
922
|
...args
|
|
797
923
|
], {
|
|
798
924
|
cwd: process.cwd(),
|
|
799
|
-
env:
|
|
925
|
+
env: {
|
|
926
|
+
...pluginSpawnEnv(),
|
|
927
|
+
...runtime.pluginEnv
|
|
928
|
+
},
|
|
800
929
|
windowsHide: true,
|
|
801
930
|
stdio: [
|
|
802
931
|
"ignore",
|
|
@@ -897,6 +1026,7 @@ async function installDependenciesLocked(ids, requestHotUpdate, runtime) {
|
|
|
897
1026
|
"--registry=https://registry.npmjs.org/"
|
|
898
1027
|
], runtime);
|
|
899
1028
|
for (const target of batch) {
|
|
1029
|
+
if (runtime.packageManager !== void 0) await declareProfileBundle(target.packageName, runtime);
|
|
900
1030
|
await waitUntilPluginMounted(target.packageName, target.version, runtime);
|
|
901
1031
|
if (!isOfficialRuntimePackage(target.packageName)) await recordDeclaredVersion(target.packageName, target.version, runtime);
|
|
902
1032
|
await removePendingUpdate(target.packageName, runtime);
|
|
@@ -2082,9 +2212,7 @@ function apply(ctx) {
|
|
|
2082
2212
|
restartRequired: updatedCount > 0,
|
|
2083
2213
|
autoReload
|
|
2084
2214
|
}));
|
|
2085
|
-
if (restartAfterResponse)
|
|
2086
|
-
requestDesktopHotUpdate();
|
|
2087
|
-
}, 150).unref?.();
|
|
2215
|
+
if (restartAfterResponse) scheduleParentPluginReload();
|
|
2088
2216
|
return;
|
|
2089
2217
|
}
|
|
2090
2218
|
const runtime = resolveDependencyRuntime(ctx);
|
|
@@ -2104,9 +2232,7 @@ function apply(ctx) {
|
|
|
2104
2232
|
restartRequired: true,
|
|
2105
2233
|
autoReload
|
|
2106
2234
|
}));
|
|
2107
|
-
if (restartAfterResponse)
|
|
2108
|
-
requestDesktopHotUpdate();
|
|
2109
|
-
}, 150).unref?.();
|
|
2235
|
+
if (restartAfterResponse) scheduleParentPluginReload();
|
|
2110
2236
|
return;
|
|
2111
2237
|
}
|
|
2112
2238
|
response.writeHead(405);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@michengai/dsh-codex-ui",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.24",
|
|
4
4
|
"description": "DSH Codex UI — 为 DeepSeek Harness Web 提供 Codex 风格侧栏、工作区会话树、全局搜索和轮次导航 · A Codex-style sidebar, workspace session tree, global search, and turn navigation for DSH Web",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -74,47 +74,47 @@
|
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"@deepseek-ai/cordis": ">=4.0.2 <5.0.0",
|
|
77
|
-
"@deepseek-ai/dsh-client-connection": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
78
|
-
"@deepseek-ai/dsh-client-locale": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
79
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
80
|
-
"@deepseek-ai/dsh-client-ui-input-trigger": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
81
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
82
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
83
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
84
|
-
"@deepseek-ai/dsh-client-ui-settings-general": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
85
|
-
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
86
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
87
|
-
"@deepseek-ai/dsh-client-ui-workspace": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
|
|
77
|
+
"@deepseek-ai/dsh-client-connection": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
78
|
+
"@deepseek-ai/dsh-client-locale": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
79
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
80
|
+
"@deepseek-ai/dsh-client-ui-input-trigger": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
81
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
82
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
83
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
84
|
+
"@deepseek-ai/dsh-client-ui-settings-general": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
85
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
86
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
87
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
88
88
|
"react": "^18.2.0",
|
|
89
89
|
"react-dom": "^18.2.0"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
92
|
"@deepseek-ai/cordis": "4.0.4",
|
|
93
|
-
"@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.
|
|
94
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.2.0-rc.
|
|
95
|
-
"@deepseek-ai/dsh-attachment": "0.2.0-rc.
|
|
96
|
-
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.
|
|
97
|
-
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.
|
|
98
|
-
"@deepseek-ai/dsh-client-store": "0.2.0-rc.
|
|
93
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-api-workspace-controller": "0.2.0-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
|
|
96
|
+
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
|
|
97
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
98
|
+
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
|
|
99
99
|
"@deepseek-ai/dsh-client-test-runtime": "0.2.0-rc.1",
|
|
100
|
-
"@deepseek-ai/dsh-client-ui-chat": "0.2.0-rc.
|
|
101
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.
|
|
102
|
-
"@deepseek-ai/dsh-client-ui-input-trigger": "0.2.0-rc.
|
|
103
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.
|
|
104
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.
|
|
105
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.
|
|
106
|
-
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.
|
|
107
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.
|
|
108
|
-
"@deepseek-ai/dsh-client-ui-settings-general": "0.2.0-rc.
|
|
109
|
-
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.0-rc.
|
|
110
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.
|
|
111
|
-
"@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.
|
|
112
|
-
"@deepseek-ai/dsh-session": "0.2.0-rc.
|
|
113
|
-
"@deepseek-ai/dsh-scope": "0.2.0-rc.
|
|
114
|
-
"@deepseek-ai/dsh-subagent": "0.2.0-rc.
|
|
115
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.
|
|
116
|
-
"@deepseek-ai/dsh-util-workspace-path": "0.2.0-rc.
|
|
117
|
-
"@deepseek-ai/dsh-workspace": "0.2.0-rc.
|
|
100
|
+
"@deepseek-ai/dsh-client-ui-chat": "0.2.0-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-client-ui-input-trigger": "0.2.0-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-client-ui-settings-general": "0.2.0-rc.2",
|
|
109
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.0-rc.2",
|
|
110
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
|
|
111
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
|
|
112
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
113
|
+
"@deepseek-ai/dsh-scope": "0.2.0-rc.2",
|
|
114
|
+
"@deepseek-ai/dsh-subagent": "0.2.0-rc.2",
|
|
115
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
116
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.0-rc.2",
|
|
117
|
+
"@deepseek-ai/dsh-workspace": "0.2.0-rc.2",
|
|
118
118
|
"diff": "^9.0.0",
|
|
119
119
|
"shiki": "^4.3.1",
|
|
120
120
|
"simple-icons": "16.31.0",
|