Skip to content

Commit 2d428a6

Browse files
Merge pull request #28 from starsstreaming/feat/dsh-web-console
feat: DSH 侧栏网页控制台
2 parents 7bcc264 + 974eb85 commit 2d428a6

12 files changed

Lines changed: 896 additions & 64 deletions

File tree

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
beautiCode 是一个本地背景工具,**主要面向 DeepSeek Harness和Codex**
3030

31-
它不包含、不安装、也不启动 DSH。请先自行安装 DeepSeek Harness 并运行 `dsh web`,再启动 beautiCode,选中 DeepSeek Harness 或 Codex,就可以把电脑里的
31+
它不包含、不安装、也不启动 DSH。请先自行安装 DeepSeek Harness 并运行 `dsh web`。插件装好后,DSH 侧栏「设置」上方会出现「背景」,不必再开托盘。Codex Desktop 仍走 beautiCode 托盘。可以把电脑里的
3232

3333
* 图片
3434
* 动态壁纸
@@ -120,7 +120,7 @@ Ctrl + Shift + Space
120120
深夜电台
121121
```
122122

123-
保存后,可以直接从托盘菜单切换
123+
保存后,可以从 DSH 侧栏「背景」或托盘菜单切换
124124

125125
对于视频主题,beautiCode 还会记录播放进度。
126126

@@ -152,7 +152,7 @@ Ctrl + Shift + Space
152152
想直接使用 beautiCode,可以下载 [Windows 安装包](https://github.com/starsstreaming/beautiCode/releases/latest)
153153
安装包自带 Node.js,不需要另外安装 Node.js、npm 或 pnpm。
154154
Codex Desktop 路径与原来一样:启动后选 **Codex Desktop**,托盘会按需拉起 Codex。
155-
DeepSeek Harness 由你自己运行:把插件装进 DSH profile,再启动 `dsh web`,然后在选择框里选 **DeepSeek Harness**。beautiCode 绝不替你启动 DSH。页面打开后可以用 `/bg``/bg-theme``/bg-clear`,或直接跟 AI 说把本机图片/视频设成背景。
155+
DeepSeek Harness 由你自己运行:把插件装进 DSH profile,再启动 `dsh web`。beautiCode 绝不替你启动 DSH。页面打开后,用侧栏「背景」从文件夹选图片或 MP4;也可以用 `/bg``/bg-theme``/bg-clear`,或直接跟 AI 说把本机图片/视频设成背景。下次打开 DSH 会恢复上次的背景
156156

157157
<p align="center">
158158
<img width="320" alt="Windows 安装包" src="https://github.com/user-attachments/assets/8c16eeb9-94d0-4f19-a816-b32fba8a110c" />
@@ -182,7 +182,9 @@ dsh web
182182
npx @deepseek-ai/dsh web
183183
```
184184

185-
再启动 beautiCode:选 **Codex Desktop** 仍由托盘拉起 Codex;选 **DeepSeek Harness** 则连接你已经启动的 DSH 网页。
185+
打开 DSH 网页后,侧栏「设置」上方有「背景」:可从文件夹选图片或 MP4、清除、开关声音、切换已保存主题。网页控制台没有摸鱼。外观浅色/深色仍用 DSH 自己的设置。下次启动会恢复上次背景。
186+
187+
Codex Desktop 仍要开 beautiCode 托盘。选 **DeepSeek Harness** 时托盘只连接你已经启动的 DSH 网页,不会替你启动 DSH。
186188

187189
若自动写入失败,才需要手动安装插件。把路径换成实际安装目录(默认是 `%LOCALAPPDATA%\Programs\beautiCode`):
188190

@@ -216,7 +218,8 @@ npm install
216218
# 若要手动安装(dsh plugin add 需要 pnpm):
217219
# npx @deepseek-ai/dsh plugin --profile web add file:%CD%/integrations/deepseek-harness
218220
npx @deepseek-ai/dsh web
219-
npm run tray
221+
# DSH 侧栏「背景」即可换图换视频。托盘只在要用 Codex 或摸鱼热键时再开:
222+
# npm run tray
220223
```
221224

222225
或打开宿主选择器:

docs/deepseek-harness.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ beautiCode 通过 DeepSeek Harness 的 Cordis 插件接口接入(`@beauticode/
55
## 已实现能力
66

77
- 图片背景、MP4 视频背景与清除。首页(`data-phase="hero"`)壁纸保持原亮度;进入会话(`active` / `settling`)后才压暗。
8+
- 网页控制台:插件装好后,DSH 侧栏「设置」上方出现「背景」。可从系统文件夹选择图片或 MP4、清除、开关声音、切换已保存主题。不需要托盘。网页控制台没有摸鱼。
89
- 对话工具与斜杠命令:在 DSH 里说「把某个本机 MP4 设成背景」,或输入 `/bg``/bg-theme``/bg-clear`。插件自己完成导入,不需要托盘。若托盘已经在跑,则复用托盘,避免两套写入打架。
910
- 视频默认静音;可请求开启声音。若浏览器自动播放策略阻止开启声音,会继续静音播放并返回 `blocked: true`
1011
- 视频播放位置随已保存主题记录;切换主题、重新应用与页面恢复时从最近位置继续。
11-
- 摸鱼模式:隐藏 DSH 的 `#root`,背景舞台继续显示和播放;`Ctrl+Shift+Space` 可退出。
12-
- 深色、浅色、跟随系统三种背景色调
12+
- 摸鱼模式:隐藏 DSH 的 `#root`,背景舞台继续显示和播放;`Ctrl+Shift+Space` 可退出(托盘全局热键)。网页控制台不提供摸鱼
13+
- 外观浅色 / 深色跟随 DSH 自己的设置,插件不再改写 DSH 主题 DOM
1314
- 图片/视频主题的保存、切换和删除。
14-
- 页面刷新或稍后打开时,会恢复当前背景与模式。找不到 `#root` 时应用失败并回滚,不会静默画坏页。
15+
- 页面刷新或稍后打开时,会恢复当前背景。找不到 `#root` 时应用失败并回滚,不会静默画坏页。
1516

1617
同一个 beautiCode 数据目录一次只能运行一个宿主会话,避免 Codex 与 DSH 同时写入造成状态损坏。
1718

@@ -48,9 +49,13 @@ npx @deepseek-ai/dsh plugin --profile web add file:%LOCALAPPDATA%\Programs\beaut
4849
4950
也可以参考 [`integrations/deepseek-harness/cordis.patch.example.yml`](../integrations/deepseek-harness/cordis.patch.example.yml)。
5051

52+
## 网页控制台
53+
54+
插件注入 `console.js`,把「背景」插在侧栏「设置」同一格里(`display: contents`,不另铺底色)。点开后的面板挂在 `document.body` 上,用实色,避免吃半透明壁纸 token。同源 `POST /__beauticode/ui/*` 转到已有的 `createBeauticodeActions()`。页面连上 SSE 后会 `reapply` 上次背景。DSH 会话列表底部的 fade 在有壁纸时关掉,避免叠出一条暗影。
55+
5156
## 控制端
5257

53-
启动 beautiCode,在选择框里选 DeepSeek Harness(或直接 `start-tray.ps1 -TargetHost dsh`)。托盘只连接你正在运行的 DSH 网页:
58+
托盘可选。启动 beautiCode,在选择框里选 DeepSeek Harness(或直接 `start-tray.ps1 -TargetHost dsh`)。托盘只连接你正在运行的 DSH 网页:
5459

5560
```powershell
5661
powershell -NoProfile -ExecutionPolicy Bypass -File apps\tray\start-tray.ps1 -TargetHost dsh -DshUrl http://127.0.0.1:3080

integrations/deepseek-harness/README.zh-CN.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# DeepSeek Harness 桥接插件
22

3-
该 Cordis 插件向 DSH Web 注入 beautiCode 浏览器客户端,并提供本机鉴权接口。支持图片、MP4、播放位置、静音、摸鱼模式、深浅色调以及清除背景
3+
该 Cordis 插件向 DSH Web 注入 beautiCode 浏览器客户端,并提供本机鉴权接口。支持图片、MP4、播放位置、静音、摸鱼模式以及清除背景
44

5-
插件会注册对话工具(`beauticode_*`)和斜杠命令(`/bg``/bg-theme``/bg-clear`),把本机文件导入为背景。不需要托盘;托盘若已在跑则复用它
5+
装好插件并运行 `dsh web` 后,侧栏「设置」上方会出现「背景」:可从文件夹选图片或 MP4、清除、开关声音、切换已保存主题。网页控制台没有摸鱼;浅色/深色跟 DSH 自己的外观走。下次打开会恢复上次背景
66

7-
beautiCode **不启动** DeepSeek Harness。请先自己运行 `dsh web`,再打开 beautiCode 选择 DeepSeek Harness。
7+
插件也会注册对话工具(`beauticode_*`)和斜杠命令(`/bg``/bg-theme``/bg-clear`)。不需要托盘;托盘若已在跑则复用它。
8+
9+
beautiCode **不启动** DeepSeek Harness。请先自己运行 `dsh web`
810

911
安装包和托盘会把插件写入你的 DSH profile,不需要 pnpm。源码环境也可以手动(`dsh plugin add` 需要 pnpm):
1012

@@ -20,6 +22,6 @@ npx @deepseek-ai/dsh web
2022
1. 修改 `cordis.patch.example.yml` 中的 `file:///.../index.mjs`
2123
2. 确保 DSH 和 beautiCode 使用相同的 `BEAUTICODE_DATA_ROOT`
2224
3. 自己运行 `dsh web`(或带 `--patch`)。
23-
4. 打开页面后输入 `/bg <本机绝对路径>`,或直接跟 AI 说把某个视频/图片设为背景。
25+
4. 打开页面后用侧栏「背景」,或输入 `/bg <本机绝对路径>`,或直接跟 AI 说把某个视频/图片设为背景。
2426

2527
安全边界:DSH Web 必须绑定本机回环地址;控制端点需要随机令牌;媒体 URL 仅允许带令牌的回环 HTTP 地址;浏览器回执只接受同源请求。

integrations/deepseek-harness/client.js

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
const clientId =
88
globalThis.crypto?.randomUUID?.() ||
99
`bc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
10-
const desiredModes = { fish: false, muted: true, tone: "dark" };
10+
const desiredModes = { fish: false, muted: true, tone: "auto" };
1111
let activePayload = null;
1212
let playbackBlocked = false;
1313
const systemDarkMedia = globalThis.matchMedia?.("(prefers-color-scheme: dark)") ?? null;
@@ -59,31 +59,30 @@ html[data-bc-fish="true"] #beauticode-bg-stage::after{background:transparent!imp
5959
#beauticode-bg-stage img{z-index:0}
6060
#beauticode-bg-stage video{z-index:1}
6161
html[data-bc-active="true"] #root{position:relative;z-index:1;background:transparent!important}
62+
html[data-bc-active="true"] [class*="_fade"]{display:none!important}
6263
html[data-bc-fish="true"] #root{opacity:0!important;visibility:hidden!important;pointer-events:none!important}
6364
`;
6465
document.head.append(style);
6566

66-
function resolvedTone() {
67-
if (desiredModes.tone !== "auto") return desiredModes.tone;
67+
function dshAppearance() {
68+
const body = document.body;
69+
if (body?.hasAttribute("data-ds-dark-theme")) return "dark";
70+
const scheme = document.documentElement.style.colorScheme;
71+
if (scheme === "dark" || scheme === "light") return scheme;
6872
return systemDarkMedia?.matches ? "dark" : "light";
6973
}
7074

75+
function resolvedTone() {
76+
return dshAppearance();
77+
}
78+
7179
function isDshThemeSynced(tone = resolvedTone()) {
72-
const body = document.body;
73-
if (!body) return false;
74-
return (
75-
body.hasAttribute("data-ds-dark-theme") === (tone === "dark") &&
76-
document.documentElement.style.colorScheme === tone
77-
);
80+
return document.documentElement.dataset.bcResolvedTone === tone;
7881
}
7982

8083
function syncDshTheme() {
8184
const tone = resolvedTone();
82-
const root = document.documentElement;
83-
const body = document.body;
84-
root.dataset.bcResolvedTone = tone;
85-
if (root.style.colorScheme !== tone) root.style.colorScheme = tone;
86-
if (body) body.toggleAttribute("data-ds-dark-theme", tone === "dark");
85+
document.documentElement.dataset.bcResolvedTone = tone;
8786
return isDshThemeSynced(tone);
8887
}
8988

0 commit comments

Comments
 (0)