Skip to content

Releases

v0.13.2

Choose a tag to compare

@jinxlux jinxlux released this 03 Oct 01:59

xiao-ui-theme-ts v0.13.2

修复一个多背景轮播下的声音 bug:静音之后,轮播切到下一段视频时声音又回来了。

修复:轮播中静音 / 音量设置会被切换覆盖

现象:背景轮播(2 项以上、都是视频)时点徽章里的喇叭静音 —— 当前这段确实静了,但切到下一段时声音又自己响了,再静音、下一次切换又响。反向同样坏:中途打开声音,之后切换进来的每一段反而是静音的。

原因:轮播切换时创建下一段视频用的是「启动这一轮轮播时」的配置快照,而不是你此刻的选择。静音 / 改音量不会改变轮播的列表与间隔,所以轮播不会重建,只有已经存在的那两个视频被更新;轮到下一段时才新建的视频,仍按旧快照「要声音」创建,于是又出声了。

修复:轮播的所有延迟动作(切换定时器、视频加载完成、播放结束)现在一律读取最新配置,声音与音量始终以你当前的选择为准。

  • 静音就是静音:切换到任何一段都不会再出声。
  • 打开声音也不会漏:之后每一段切换进来都有声,音量同样按当前滑杆。
  • 音量滑杆与喇叭的表现与 0.13.0 / 0.13.1 一致,只是不再被轮播切换覆盖。

兼容性

  • 无破坏性变更:没有新增或改动配置字段,主题文件、HTTP 路由、DSH 版本要求全部未变(仍是 v0.1.5-alpha.1 及更新)。
  • 本次未改 Host 半:更新包后刷新页面即可生效,不必重启 DSH。
  • 既有行为照旧保留:页面加载后若还没有任何交互,视频仍先静音播放,首次点击 / 按键后才恢复声音(浏览器自动播放策略,不是 bug)。

xiao-ui-theme-ts v0.13.2 (English)

Fixes a sound bug with rotating backgrounds: after muting, the sound came back on the next clip.

Fixed: mute / volume was overridden on every rotation switch

Symptom: with a rotating background (2+ items, all videos), clicking the speaker to mute silenced the current clip — but the sound returned on the next one, and muting again only lasted until the following switch. The reverse was broken too: turning sound on left every newly switched-in clip silent.

Cause: the next video created during rotation used the config snapshot captured when that rotation round started, not your current choice. Muting (or changing volume) does not change the list or the interval, so the rotation was not rebuilt — only the two existing videos were updated, while the video created later still followed the old snapshot ("sound on") and played audibly again.

Fix: every deferred action in the rotation (switch timer, video ready, playback ended) now reads the latest config, so sound and volume always follow your current setting.

  • Muted means muted: no clip will start playing sound again.
  • Unmuted stays unmuted: every clip that comes up is audible, at the current slider volume.
  • The speaker button and the volume slider behave exactly as in 0.13.0 / 0.13.1 — they just can't be overridden by a rotation switch any more.

Compatibility

  • No breaking changes: no config fields added or changed; theme files, HTTP routes and the DSH requirement are untouched (v0.1.5-alpha.1 or newer).
  • The host half is unchanged: update the package and refresh the page — no DSH restart needed.
  • Existing behaviour is preserved: with no interaction after page load a video still starts muted and unmutes after the first click / key press (browser autoplay policy, not a bug).

v0.13.1

Choose a tag to compare

@jinxlux jinxlux released this 01 Oct 03:35

xiao-ui-theme-ts v0.13.1

小版本更新:设置页里写死的「魈主题」不再固定,改为跟随你选择的主题。

变更:设置页标题与总开关跟随当前主题

以前设置页里这几处文字是写死的「魈主题」,现在全部按当前主题名生成(以主题名「白厄」为例):

位置 之前 现在
左侧设置项名称 魈主题 白厄主题 / 白厄 Theme
页面内标题 魈主题 白厄主题 / 白厄 Theme
主题总开关 启用魈主题 启用白厄主题 / Enable 白厄 Theme
  • 三处共用同一个来源:切换 / 重命名 / 删除主题后立即一起变,无需刷新页面。
  • 后缀(中文「主题」/ 英文「 Theme」)与总开关前缀(「启用」/「Enable 」)随 DSH 界面语言变化;主题名本身原样使用,不做翻译。
  • 仍是内置默认主题「魈」、或主题名尚未取到时,回落原文案「魈主题 / Xiao Theme」「启用魈主题 / Enable Xiao Theme」,不会拼出半中半英的「魈 Theme」。
  • 顺带修正:「角色空间(娱乐)」里那句「「启用魈主题」总开关已关闭…」不再引用写死的开关名,改为通用措辞「主题总开关已关闭:…」,避免开关改名后引文对不上。

兼容性

  • 无破坏性变更:只改客户端文案的生成方式,配置字段、主题文件格式、HTTP 路由、DSH 版本要求全部未动(仍是 v0.1.5-alpha.1 及更新;v0.1.5-alpha.1 之前请留在 0.11.x)。
  • 本次未改 Host 半:更新包后刷新页面即可生效,不必重启 DSH。

xiao-ui-theme-ts v0.13.1 (English)

Small release: the hard-coded "Xiao Theme" in settings is gone — it now follows the theme you selected.

Changed: settings titles and the master switch follow the active theme

All three spots now derive from the active theme name (example theme name "白厄"):

Spot Before Now
Settings entry Xiao Theme 白厄 Theme /「白厄主题」
In-page heading Xiao Theme 白厄 Theme /「白厄主题」
Theme master switch Enable Xiao theme Enable 白厄 Theme /「启用白厄主题」
  • All three share one source: switching, renaming or deleting a theme updates them together, with no page refresh.
  • The suffix (「主题」/ " Theme") and the switch prefix (「启用」/ "Enable ") follow the DSH UI language; theme names are used verbatim and never translated.
  • The built-in default theme "魈" (and the moment before the name is loaded) still shows "Xiao Theme" /「魈主题」and "Enable Xiao Theme" /「启用魈主题」.
  • Also fixed: the roleplay status line no longer quotes the hard-coded switch name ("the theme master switch is off…"), so it stays correct when the switch is renamed.

Compatibility

  • No breaking changes: client-side wording only — config fields, theme file format, HTTP routes and the DSH requirement are untouched (v0.1.5-alpha.1 or newer; stay on 0.11.x for anything older).
  • The host half is unchanged: update the package and refresh the page — no DSH restart needed.

v0.13.0

Choose a tag to compare

@jinxlux jinxlux released this 01 Oct 03:03

xiao-ui-theme-ts v0.13.0

主题(青玉配色 + 吉祥物 + 魈式语气 + 磨砂背景)的 TypeScript / pnpm 构建版。
本版本是纯客户端改动:新增音量控制,并让设置页标题以当前主题命名。

新增:吉祥物徽章里的音量控制

视频背景终于可以调音量了 —— 喇叭按钮旁边多了一根音量滑杆,就在吉祥物徽章行内,不额外占用任何屏幕位置。

  • 即时可听:拖动滑杆时直接把音量写进 <video>,拖到哪儿听到哪儿;松手 / 失焦 / 回车才保存,不会每动一格就写一次配置。
  • 顺带取消静音:拖到有声位置会自动打开声音;拖到 0% 视为静音,也不会再去请求浏览器必然拒绝的「有声自动播放」。
  • 同一根滑杆,两个入口:设置页「磨砂背景」组新增的「视频背景音量」与徽章里的滑杆写的是同一个字段,两边永远同步(范围 0–100%,默认 100%)。
  • 只在需要时出现:静态图 / GIF 背景不显示(不占位);徽章收起成 💨 圆钮时也不显示,展开即见。
  • 注意:受浏览器自动播放策略限制,页面加载后仍需先与页面交互一次才会真正出声 —— 这是预期行为,不是 bug。

变更:设置页标题以当前主题命名

  • 设置页的分区标题不再固定叫「魈主题」,而是跟随你选择的主题。
  • 后缀(中文「主题」/ 英文「 Theme」)随 DSH 界面语言变化;主题名本身原样使用,不做翻译。
  • 默认内置主题「魈」以及主题名尚未取到时,仍显示「魈主题 / Xiao Theme」,不会拼出「魈 Theme」这种半中半英。
  • 切换 / 重命名 / 删除主题后标题立即跟随,无需刷新页面。

兼容性

  • 无破坏性变更:新增字段 backgroundVideoVolume 默认 1(原始音量),旧配置、旧主题导出、旧设置页都按原样工作,升级后行为与之前完全一致。
  • DSH 版本要求与 0.12.0 相同:v0.1.5-alpha.1 及更新(推荐 0.1.5-rc.3 / 0.1.7-rc.2);v0.1.5-alpha.1 之前请留在主题 0.11.x。

xiao-ui-theme-ts v0.13.0 (English)

A pure client-side release: volume control for video backgrounds, and a settings title named after the selected theme.

New: volume control in the mascot badge

Video backgrounds are now adjustable — a volume slider sits right next to the speaker button inside the mascot badge, taking up no extra screen space.

  • Hear it while you drag: dragging writes straight to <video>.volume (no config write per step); release / blur / Enter commits.
  • Unmutes on the way up: dragging to an audible level turns sound on; 0% is treated as muted, so it never requests the audible autoplay the browser would reject.
  • One slider, two places: the new "Background video volume" slider in settings writes the same field (0–100%, default 100%) and stays in sync with the badge.
  • Only when relevant: hidden for static / GIF backgrounds, and while the badge is collapsed to the 💨 button.
  • Note: browser autoplay policy still needs one interaction after page load before sound can play — expected, not a bug.

Changed: settings title follows the active theme

  • The settings section is no longer hard-coded to "Xiao Theme"; it now reads from the theme you selected.
  • The suffix follows the DSH UI language; the theme name itself is used verbatim and never translated.
  • The built-in default theme "魈" (and the moment before the name is loaded) still shows "魈主题 / Xiao Theme".
  • Switching, renaming or deleting a theme updates the title immediately — no page refresh.

Compatibility

  • No breaking changes: the new backgroundVideoVolume field defaults to 1 (original volume); old configs, exported themes and older settings pages keep working exactly as before.
  • Same DSH requirement as 0.12.0: v0.1.5-alpha.1 or newer (verified on 0.1.5-rc.3 / 0.1.7-rc.2); on anything older, stay on theme 0.11.x.

v0.12.0

Choose a tag to compare

@jinxlux jinxlux released this 27 Sep 05:24
c0e8c63

xiao-ui-theme-ts v0.12.0

兼容分界线:DSH v0.1.5-alpha.1 —— 也就是「DSH 开始自带官方右侧栏(@deepseek-ai/dsh-client-ui-sidebar-right)」的那一版。本次起,兼容性只看 DSH 版本。

你的 DSH 版本 建议使用的主题版本
v0.1.5-alpha.1 及更新(自带官方右栏) 本版本 0.12.0 及之后版本(优先推荐)
v0.1.5-alpha.1 之前(还没有官方右栏) 上一版 0.11.x

⚠️ 不按上表选也不会崩溃(插件照常加载、DSH 照常启动),但可能出现界面 bug —— 例如侧边栏 / 右栏的底色与透明度不对(偏平、偏不透、左右不一致,或整块透出背景)。
better-sidebar 为可选:0.19.x 或不装;旧版 ≤ 0.18(自绘右栏)不再适配。


🐛 修复

  • 旧版 DSH 右栏整块全透明(web 0.1.5-rc.3 实测复现)。
    两代右栏面板「谁画底」正好相反:≤ 0.1.6 由面板外框自绘、面板内部没有任何背景;≥ 0.1.7 外框不画、改由内部表面着色。本版本以 data-sidebar-right-session 标记区分:旧版让外框吃右栏档色,新版维持原模型 —— 两代各涂一层、不叠色,桌面版行为不变。
  • 「角色空间(娱乐)」在 DSH 0.1.7 上不出现预设。
    0.1.7 删除了「扫描 ~/.dsh/.agent-presets/ 目录」的机制,改为插件通过 agentPresets 服务声明,所以只写文件的旧做法在桌面版上预设永远不会进入选择器(设置页还会误报「已安装」)。现在两条路线并存:
    • ≥ 0.1.7:服务注册(改角色文本 / 切「允许网络检索」即时重新注册,关掉即释放);
    • ≤ 0.1.6:仍写目录文件(行为与之前一致)。

✨ 新增

  • 徽章内的声音快捷开关:背景是视频(MP4 / WebM / MOV / M4V)时,吉祥物徽章里会多出一个 🔊 / 🔇 按钮(关闭按钮左侧),点一下即可静音 / 取消静音。它与设置页的「视频背景声音」是同一个开关,两边双向即时同步;静态图与 GIF 背景不显示该按钮(它们没有声音)。

🔧 变更

  • 兼容策略改写:分界线从「0.1.7」改为「是否自带官方右栏(v0.1.5-alpha.1 起)」,兼容表只按 DSH 版本分档。四份 README(中 / 英 / 日 / 韩)与 package.json 的 dshCompat 已同步。

✅ 验证

  • 实机:web 0.1.5-rc.3、桌面 0.1.7-rc.2。
  • 静态核对:逐个解开 npm 上已发布的 11 个 dsh-client-ui-sidebar-right 与 6 个 dsh-client-ui-layout 包,确认没有一个版本落在分界线的错误一侧。
  • 单测 23 个(Host 14 + Client 9)全通过;pnpm run check(dsh 插件契约)通过。
  • 配置格式未变,升级不需要迁移。

📦 安装 / 升级

# npm
dsh plugin --profile web add xiao-ui-theme-ts

# 或 GitHub Release 的 tarball
dsh plugin --profile web add https://github.com/jinxlux/xiao-theme-dsh-ui-plugin/releases/latest/download/xiao-ui-theme-ts.tgz

升级后:web 硬刷新页面;桌面版重启一次(Host 半随进程加载)。之前已经开着「角色空间」的用户,预设会在启动时自动注册,无需重新开关(点一次「应用 / 更新预设」同样可以)。


xiao-ui-theme-ts v0.12.0

Compatibility boundary: DSH v0.1.5-alpha.1 — the release where DSH started shipping the official right panel (@deepseek-ai/dsh-client-ui-sidebar-right). From now on, compatibility is keyed on the DSH version only.

Your DSH version Theme version to use
v0.1.5-alpha.1 or newer (ships the official right panel) this release 0.12.0 or later (preferred)
before v0.1.5-alpha.1 (no official right panel yet) the previous release 0.11.x

⚠️ Picking against the table will not crash (the plugin still loads and DSH still starts), but UI bugs may appear — e.g. the sidebar / right panel background or transparency can be wrong (too flat, not transparent enough, mismatched between the two sides, or showing the background through entirely).
better-sidebar is optional: 0.19.x or none. Legacy ≤ 0.18 (self-drawn right panel) is not adapted to any more.


🐛 Fixed

  • Right panel painted fully transparent on older DSH (reproduced on web 0.1.5-rc.3).
    The two generations disagree on who paints the panel: on ≤ 0.1.6 the panel frame paints its own background and nothing inside does; on ≥ 0.1.7 the frame paints nothing and the inner surfaces do. The theme now tells them apart by the data-sidebar-right-session marker: the legacy frame gets the right-panel tint, the newer one keeps the existing model — exactly one layer per generation, no stacking, desktop behaviour unchanged.
  • The roleplay space never appeared as an agent preset on DSH 0.1.7.
    0.1.7 removed the "scan ~/.dsh/.agent-presets/" mechanism; presets are now declared by plugins through the agentPresets service, so the file-only route could never reach the picker (and the settings page falsely reported "installed"). Both routes now coexist:
    • ≥ 0.1.7: service registration (re-registered instantly when the role text or "Allow web lookup" changes; released when switched off);
    • ≤ 0.1.6: still writes the directory files (unchanged behaviour).

✨ Added

  • Sound toggle inside the mascot badge: with a video background (MP4 / WebM / MOV / M4V) the badge gains a 🔊 / 🔇 button (just left of the close button) for one-click mute/unmute. It is the same switch as "Background video audio" on the settings page, synced both ways instantly. Static images and GIFs never show it (they carry no audio).

🔧 Changed

  • Compatibility policy rewritten: the dividing line moved from "0.1.7" to "does it ship the official right panel (v0.1.5-alpha.1 and newer)", and the table is keyed on the DSH version only. All four READMEs (EN / ZH / JA / KO) and package.json's dshCompat are in sync.

✅ Verification

  • Live: web 0.1.5-rc.3 and desktop 0.1.7-rc.2.
  • Static audit: all 11 published dsh-client-ui-sidebar-right builds and 6 dsh-client-ui-layout builds were unpacked to confirm every version falls on the correct side of the boundary.
  • 23 unit tests pass (Host 14 + Client 9); pnpm run check (dsh plugin contract) passes.
  • The config format is unchanged — no migration needed.

📦 Install / upgrade

# npm
dsh plugin --profile web add xiao-ui-theme-ts

# or the GitHub release tarball
dsh plugin --profile web add https://github.com/jinxlux/xiao-theme-dsh-ui-plugin/releases/latest/download/xiao-ui-theme-ts.tgz

After upgrading: hard-refresh the web UI; restart the desktop app (the host half loads with the process). If the roleplay space was already enabled, the preset registers itself on startup — no need to toggle it again ("Apply / update preset" works too).

v0.11.0

Choose a tag to compare

@jinxlux jinxlux released this 18 Sep 15:01
a6eedb1

xiao-ui-theme-ts v0.11.0

本次更新 / This release

  • 新增:多背景轮播 —— 背景从「一张」变成「一个列表」,≥2 项自动轮播
  • 优化:主题管理列表 —— 自带滚动 + 紧凑行 + 行内「使用」按钮
  • 修复:视频背景(含轮播)启动 / 刷新后停在首帧,必须手动切换主题才开始播放

中文

新增:多背景轮播

背景从「一张」变成「一个列表」,加上第 2 项就开始轮播:

  • 添加:设置 → 魈主题 → 背景分组里的「从已上传文件添加」打开缩略图选择器,直接点要加入的图片 / 视频即可(也能在该窗口里上传新文件);列表中每一条都有独立预览。
  • 管理:上移 / 下移 / 移除,外加「切换间隔」滑杆(2–600 秒,默认 30)。
  • 切换节奏:静态图与 GIF 到点即切;视频按 max(间隔, 视频时长) —— 间隔 ≤ 时长时播完才切,间隔 > 时长时循环播到点再切。
  • 切换效果:固定约 0.7 秒交叉渐变;任意时刻最多只有 2 个背景在内存里(当前 + 即将上场)。
  • 完全向后兼容:只设 1 张时行为与旧版逐字一致 —— 无定时器、无渐变、无新图层;backgroundImagePath / backgroundDynamic 恒等于列表第 1 项。
  • 轮播是纯客户端行为:不会为了切换背景反复写配置文件。

优化:主题管理列表

主题一多就把设置页顶长的问题,这次解决:

  • 主题列表自带滚动容器(max-height: min(40vh, 280px)),块高与主题数量解耦:主题少时不出滚动条,多了就在框内滚动。
  • 行改紧凑样式:当前主题带品牌色标识与 当前 胶囊,内置主题显示 内置 胶囊(不再渲染那个禁用的「删除」按钮)。
  • 非当前主题行新增行内「使用」按钮,就近切换;顶部下拉选择器保留不变(列表很长时仍可键入跳转)。
  • 交互语义零变化:重命名(行内编辑)、导出、删除(两步确认)、导入、刷新、恢复默认全部保持原样;未新增任何 DSH 依赖,与 DSH 版本无关。

修复:视频背景启动后不播放(切一下主题才动)

  • 症状:背景(含多背景轮播)是视频、且开着「视频背景声音」时,启动 DSH 或刷新页面后视频停在首帧不动,手动切换主题之后才开始播放。
  • 原因:浏览器恒允许静音自动播放,但在你与该页面交互之前一律拦截带声自动播放。启动时插件已正确降级为静音播放,但随后一次配置同步又把 muted 置回 false —— Chromium 随即把已经在播的静音元素停住;而轮播在背景列表 / 间隔未变时不会重建 <video>,画面就此卡住。
  • 现状:播放与声音统一走一条策略函数,没有用户激活时绝不摘静音。启动后背景先静音播放,你任意点击一下或按一次键,声音自动接上,不必重新选择主题。
  • ⚠️ 注意(浏览器策略,不是插件限制):想让视频背景「第一帧就带声音」,只能在浏览器侧放行 —— 企业策略 AutoplayAllowlist 加入该来源,或用 --autoplay-policy=no-user-gesture-required 启动浏览器(仅调试用)。不需要声音的话,把设置里的「视频背景声音」关掉即可全程静音。

升级提示

  • 本次改动全部在客户端:更新后刷新页面即可,无需重启 DSH。
  • 老配置零迁移:没有 backgroundList 的旧设置会自动合成「单张」列表,行为与升级前一致。
  • 文档:四份 README 的「注意事项」都已补上这条浏览器自动播放策略说明。

English

New: multiple backgrounds (rotation)

The background is now a list instead of a single image — add a second item and it rotates:

  • Add: Settings → Xiao Theme → background block → "Add from uploads" opens a thumbnail picker; click the images / videos to add (you can upload new files from that same window). Every list item shows its own preview.
  • Manage: reorder (move up / down), remove, plus a Switch interval slider (2–600 s, default 30).
  • Switch timing: static images and GIFs switch on the interval; a video uses max(interval, video length) — when the interval is shorter than the clip it plays to the end first, when it is longer it loops until the interval.
  • Transition: a fixed ~0.7 s cross-fade; at most two backgrounds are held in memory at any moment (current + incoming).
  • Fully backward compatible: with a single background nothing changes — no timer, no fade, no extra layers; backgroundImagePath / backgroundDynamic always mirror the first list item.
  • Rotation is client-side only: it never rewrites your config file just to switch a background.

Improved: theme-management list

Fixes the settings page growing longer with every saved theme:

  • The theme list now has its own scroll container (max-height: min(40vh, 280px)), decoupling the block height from the number of themes.
  • Rows are compact: the active theme carries the brand colour plus a Current pill, and the built-in theme shows a Built-in pill instead of a disabled Delete button.
  • Non-active rows gained an inline "Use" button for switching in place; the top <select> is unchanged (still handy for jumping in long lists).
  • No behaviour change: rename (inline edit), export, delete (two-step confirm), import, refresh and reset all work exactly as before. No new DSH dependency, so it is version-agnostic.

Fixed: video backgrounds did not play after startup (until you switched themes)

  • Symptom: with a video background (single or rotating) and video background sound enabled, the video froze on its first frame after starting DSH or refreshing the page, and only started playing after you manually switched themes.
  • Cause: browsers always allow muted autoplay but block autoplay with sound until you interact with the page. The plugin already degraded correctly to muted playback, but a later config sync set muted back to false — Chromium then stopped the already-playing muted element, and the carousel never rebuilds a <video> while the background list / interval is unchanged, so the picture stayed frozen.
  • Now: playback and sound go through one policy function that never unmutes without user activation. The background starts muted, and your first click or key press brings the sound back automatically — no need to re-pick a theme.
  • ⚠️ Note (browser policy, not a plugin limit): to get sound on the very first frame you must allow it on the browser side — add the origin to the AutoplayAllowlist enterprise policy, or launch the browser with --autoplay-policy=no-user-gesture-required (debug flag). If you don't need sound, just turn video background sound off.

Upgrade notes

  • Everything here is client-side: after updating, just refresh the page — no DSH restart needed.
  • Zero migration: configs without backgroundList are synthesised into a single-item list, so old settings behave exactly as before.
  • Docs: all four READMEs now carry this browser-autoplay note under their Notes section.

Full Changelog: v0.10.1...v0.11.0

v0.10.1

Choose a tag to compare

@jinxlux jinxlux released this 17 Sep 13:03
dd0106d

Improvements & Fixes

Performance & stability

  • In-process cache for config reads (validated by file mtime + size): the thousands of Range requests issued while a video background plays no longer re-read and re-parse the file each time; manual edits to the config file still take effect immediately.
  • Config writes are now serialized and coalesced: rapid changes (sliders, etc.) no longer race each other or land out of order; a failed write rolls back to the settings on the server and shows a one-line notice on the settings page.
  • Hardened HTTP routes: JSON bodies are capped at 4MB, a request with a body must be application/json, and cross-origin mutating requests get a 403. Same-origin use, empty-body POSTs and upload limits (avatar 20MB / background 200MB) are unchanged.

Config format

  • The persisted config now carries a schemaVersion (missing = treated as v1) plus a migration table, stamped on every write; importing a theme file produced by a newer plugin version is rejected with a clear message. Existing config files keep working.

Tests

  • Added 16 node:test unit tests (Host pure functions + client palette / localization); pnpm test builds and runs them, with no new dependencies.

UX & localization

  • The mascot badge remembers its position and collapsed state (localStorage) and is always clamped inside the viewport; with no stored state, behaviour is exactly as before.
  • The background now re-syncs when the light/dark or system colour scheme changes — no settings change needed.
  • Importing a theme no longer shows the browser's native file control (which renders the Chinese "选择文件" in an English UI); it uses a plugin button whose label follows the DSH interface language.
  • The mascot's default title / subtitle follow the interface language: Chinese "靖妖傩舞 / 别挡路", English "Bane of All Evil / Out of my way". Custom text is untouched.
  • The roleplay preset's display name is now bilingual — "角色空间(娱乐) / Roleplay (entertainment)" — so the DSH new-session preset picker matches in either UI language.

Docs

  • Corrected the README claim that the sidebar is driven by CSS only: a small JS fallback does locate the shell frame for the frosted-panel blur, and it is unrelated to the sidebar anchors. Preset-name references were synced across all four READMEs.

**### 优化与修复

性能与稳定性

  • 配置读取加进程内缓存(按文件 mtime + 大小校验):视频背景播放时的成百上千次 Range 请求不再重复读盘解析;外部手工编辑配置文件仍即时生效。
  • 配置写入改为串行 + 合并:高频改动(滑块等)不再并发写盘、乱序覆盖;写入失败会回滚为服务器上的设置,并在设置页显示一行提示。
  • HTTP 接口加固:JSON 请求体 4MB 上限、带 body 时只接受 application/json、跨源变更请求返回 403。同源使用、空体 POST、上传上限(头像 20MB / 背景 200MB)与之前完全一致。

配置格式

  • 配置文件新增 schemaVersion(缺失按 v1 处理)与迁移表,写回时盖上当前版本;导入由更新版插件生成的主题文件会被明确拒绝并提示。旧配置文件照常读取。

测试

  • 新增 node:test 单元测试 16 条(Host 纯函数 + 客户端配色 / 本地化),pnpm test 一键构建并运行,不引入任何新依赖。

体验与本地化

  • 吉祥物图标的位置与收起状态会被记住(localStorage),并始终限制在窗口内;没有本地记录时行为与之前一致。
  • 明暗 / 系统配色切换时背景同步刷新,不再需要手动改动设置。
  • 导入主题不再显示浏览器原生文件控件(它在英文界面会显示中文「选择文件」),改用插件按钮,文案跟随 DSH 界面语言。
  • 吉祥物默认标题 / 副标随界面语言:中文「靖妖傩舞 / 别挡路」,英文 “Bane of All Evil / Out of my way”;自定义文案不受影响。
  • 角色空间预设的显示名改为中英双语「角色空间(娱乐) / Roleplay (entertainment)」,DSH 新会话预选器在两种界面下都能对上。

文档

  • 修正 README 中「侧栏完全由 CSS 驱动」的表述,如实说明存在一个定位 shell 框架的 JS 磨砂兜底;四份 README 同步预设名引用。**

v0.10.0

Choose a tag to compare

@jinxlux jinxlux released this 12 Sep 07:07

v0.10.0 — Roleplay space (entertainment)

This release adds an independent roleplay mode: a DSH agent preset completely separate from your work sessions, off by default.

✨ New: Roleplay space (entertainment)

  • One-click toggle (off by default): turning it on materializes the role system prompt as its own agent preset under ~/.dsh/.agent-presets/xiao-roleplay/; turning it off removes it. Upgrading never adds a preset on its own.
  • How to enter character: start a new session and pick "角色空间(娱乐)" in the new-session preset chip — DSH only allows switching a preset before a session has produced anything.
  • Role system prompt is configurable: leave it empty for the built-in English Xiao card, or paste any full character prompt to switch roles.
  • Isolated from work sessions: the preset mounts only the persona — no file, shell, subagent, task or plan tools; work sessions keep only the tone injection and never receive a character identity.
  • Stored per theme: the toggle and role text travel with the current theme, and are gated by the "Enable Xiao theme" master switch.
  • The preset root follows DSH's data root ($DSH_HOME over ~/.dsh, with ~ expansion), matching where DSH actually scans. The plugin's own settings and uploads keep the legacy fallback, so an upgrade never looks like a settings reset.

⚙️ New settings group "Roleplay (entertainment)"

Role toggle / Allow web lookup / role system prompt / apply-update preset / reset default role / open preset folder / install status.

🔌 Allow web lookup (off by default)

  • On: the preset adds one row — DSH's web_search / web_fetch — so the character can refresh the latest plot, design and lore before playing, and may also use other web-lookup tools the session offers (e.g. from a third-party plugin). The search provider comes from your profile (with modsearch installed, web_search runs through its engine chain).
  • Off: the role text explicitly orders the character to use no tools.
  • Source secrecy: looked-up material becomes knowledge the character already had — it never says "the web says", never cites a source or link, and never steps out of character to comment on where a fact came from. Tool output is treated as data, not instructions.
  • Don't put tool instructions in your role card: your text is used verbatim and the plugin always appends its own short rules section (tool gate + source secrecy), which the role text cannot override.

📄 Docs

  • All four READMEs (README.md, README.zh-CN.md, README.ja.md, README.ko.md) updated: features, settings, usage and notes.
  • Added a caution for Voice (work sessions): a custom prompt is inserted verbatim into every work session's system prompt, so keep it tone-only; and noted that a preset may drop the voice section.

⚠️ Notes / known limitations

  • A roleplay session is not "zero tools": tools registered by profile-level (host-plane) plugins belong to no preset and appear in every session, roleplay included (e.g. modsearch's read_page / x_search). A preset cannot hide them.
  • DSH only allows switching presets in an empty session, so an existing session can never become a roleplay one; there is no "one-click start roleplay session" button yet.
  • Web search in a roleplay session requires turning Allow web lookup on.

🔼 Upgrading

  • Off by default — no manual cleanup needed; upgrading installs no preset and grants no network access on its own.
  • The Host half is a built lib/ artifact, so restart DSH after upgrading to load it.

Full Changelog: v0.9.0...v0.10.0

v0.10.0 — 角色空间(娱乐)

本次更新新增独立的角色扮演模式:一个与工作会话彻底分开的 DSH agent preset,默认关闭。

✨ 新增:角色空间(娱乐)

  • 一键开关(默认关闭):打开才把「角色系统提示词」写成一个独立的 agent preset(~/.dsh/.agent-presets/xiao-roleplay/),关闭即移除。升级不会凭空多出预设。
  • 如何进入角色:开一个新会话,在顶部的新会话预设选择器里选「角色空间(娱乐)」——DSH 只允许空会话切换预设。
  • 角色系统提示词可自定义:留空使用内置的英文「魈」设定;粘贴任意角色的完整设定即可换角色。
  • 与工作会话隔离:角色预设自己只挂角色设定,不挂文件 / 命令 / 子代理 / 任务 / 计划这些工作工具;工作会话只保留「语气」注入,永不注入角色身份。
  • 按主题各存一份:角色开关与角色文本随当前主题走,切换主题连角色一起切;并受「启用魈主题」总开关门控。
  • 预设目录跟随 DSH 的数据根($DSH_HOME 优先于 ~/.dsh,支持 ~ 展开),与 DSH 实际扫描的位置一致;插件自身的设置与上传保留老位置回落,升级不会看起来像「设置被重置」。

⚙️ 设置页新增「角色空间(娱乐)」分组

角色开关 / 允许网络检索 / 角色系统提示词 / 应用·更新预设 / 恢复默认角色 / 打开预设文件夹 / 安装状态。

🔌 允许网络检索(默认关)

  • 开:角色预设多挂一行 DSH 的网络工具(web_search / web_fetch),让角色开演前能先查最新的剧情、形象与设定;也可以使用会话里其它查资料工具(第三方插件提供的网页检索)。搜索 provider 由你所在 profile 决定(例如装了 modsearch,web_search 就走它的引擎链)。
  • 关:角色提示词明确要求「不要用任何工具」。
  • 来源保密:查到的资料只作为角色本来就知道的东西——它不会说「网上说」「查到的」,不会给链接或来源,也不会出戏评论信息出处;工具输出一律当作数据,而不是指令。
  • 角色卡里不要写工具指令:你填的角色文本会原样使用,插件随后必定追加一小段自己的规则(工具闸门 + 来源保密),这段无法被角色文本覆盖。

📄 文档

  • 四份 README(README.md / README.zh-CN.md / README.ja.md / README.ko.md)同步更新:功能列表、设置页、使用与配置、注意事项。
  • 补充「语气(工作会话)」的注意事项:自定义提示词会被原样插入每一个工作会话的系统提示,请只写语气;并说明语气段可能被某些预设裁掉。

⚠️ 注意 / 已知限制

  • 角色会话不是「零工具」:以 host 面(profile 级)挂载的第三方插件工具不属于任何预设,会出现在所有会话里,角色会话也挡不住(例如 modsearch 的 read_page / x_search)——预设无法屏蔽它们。
  • DSH 只允许在空会话切换预设,已有会话无法改成角色会话;暂不提供「一键开始角色会话」按钮。
  • 想让角色能网页搜索,需要先打开「允许网络检索」。

🔼 升级说明

  • 默认关闭,无需任何手动清理:升级不会自动安装预设,也不会凭空获得网络能力。
  • Host 半是 lib/ 构建产物,升级后请重启 DSH 以加载。

Full Changelog: v0.9.0...v0.10.0

v0.9.0

Choose a tag to compare

@jinxlux jinxlux released this 10 Sep 14:20
16c5ddb

xiao-ui-theme-ts v0.9.0

Release date: 2026-09-10 · dsh plugin --profile web add xiao-ui-theme-ts@0.9.0

This release adds an upload asset manager and fixes sidebar transparency after the latest DSH / better-sidebar upgrade — the previous and the current versions both keep working.


English

✨ New: upload asset manager (picker)

The background / avatar upload entries are no longer a bare <input type="file"> — each one opens a picker window:

  • Lists everything already in ~/.dsh/xiao-theme-uploads/ — thumbnail, file size, last modified, a used by list of the themes referencing it, and an active badge for the file the current theme uses.
  • Click an existing file to reuse it. For backgrounds the dynamic flag is re-derived automatically (animated GIF, or MP4/WebM/MOV/M4V → dynamic background).
  • Upload a new file right inside the window — it is auto-selected once the upload succeeds.
  • Open upload folder reveals the directory in your file manager (explorer / open / xdg-open) so you can add, rename or delete files yourself.
  • Nothing is deleted automatically. The uploads folder is user-managed; the picker only reads it.

New host routes:

Route Purpose
GET /xiao-theme/uploads?kind=bg|avatar list uploads (newest first) with usedBy / active
GET /xiao-theme/uploads-file?name=…&v=… thumbnail / preview of a single upload, supports Range; works even when the theme or the background is switched off
POST /xiao-theme/open-uploads open the uploads folder in the OS file manager
  • Hardening: uploads-file accepts a bare file name only — basename(name) !== name → 400, so no path traversal out of the uploads folder.
  • A very large GIF is reported as dynamic without reading the whole file; smaller ones are still scanned for the animated-GIF signature.
  • Modal layout: the file list scrolls inside the panel (max-height: 78vh), so the footer buttons stay reachable in a short window.

🩹 Fix: sidebar transparency after the DSH / better-sidebar upgrade

Symptom — after updating DSH and the third-party better-sidebar, the Sidebar opacity slider no longer affected the right sidebar.

Cause — both sides changed their DOM at once:

  • DSH removed the detailsCol column. The right column is now data-rightbar-col, and the panel itself is dsh-client-ui-sidebar-right's [data-sidebar-right-panel] (background var(--dsw-alias-bg-base), still mounted while collapsed).
  • better-sidebar 0.19 no longer draws its own right panel: every tab is registered into DSH's native right sidebar (ctx.sidebarRight, slot sidebar.right.pane.tab). Its data-dsh-panel / data-dsh-pane attributes still exist, but data-dsh-panel now only marks the bottom workbench panel.

Fix — the right sidebar is now matched through [data-sidebar-right-panel], and inside that subtree the semantic background tokens (--dsw-alias-bg-base / -layer-1 / -layer-2 / -layer-3) are overridden as well: changing the panel background alone was not enough, because better-sidebar's tab strips, cards, editor and file tree paint their own surfaces from those tokens. The previously missing --dsw-alias-bg-layer-3 token was added to the palette too.

Backward compatible — the old anchors are all kept: [class$="detailsCol"] (older DSH) and [data-dsh-panel]:not([data-dsh-bottom-panel]) / [data-dsh-pane] (older better-sidebar). The new bottom workbench panel is explicitly excluded, so it stays opaque instead of letting the conversation show through.

✅ Version compatibility (tested 2026-09-10)

Component Previous Current
DeepSeek Harness 0.1.1-rc.2 0.1.5-rc.1
better-sidebar 0.17.1 0.19.0

Sidebar opacity drives the left and the right sidebars on both pairs. Older better-sidebar releases (0.14.x / 0.16.x) use the same data-dsh-panel anchor and are expected to work, but were not tested.

📦 Upgrade

  • Nothing to migrate: settings stay in ~/.dsh/xiao-theme.json, uploads in ~/.dsh/xiao-theme-uploads/. Old backgroundOpacity / backgroundDarkOpacity values still migrate to panelOpacity.
  • Uploaded files are never deleted automatically.
  • Refresh DSH Web after updating — no restart required.
dsh plugin --profile web add xiao-ui-theme-ts@0.9.0
# or the release tarball
dsh plugin --profile web add https://github.com/jinxlux/xiao-theme-dsh-ui-plugin/releases/latest/download/xiao-ui-theme-ts.tgz

简体中文

✨ 新增:上传文件管理(选择器)

背景 / 头像的上传入口不再是裸的 <input type="file">,改为打开一个资产窗口:

  • 列出 ~/.dsh/xiao-theme-uploads/ 里已有的全部文件:缩略图、大小、最后修改时间、被哪些主题引用的 used by 列表,以及当前主题正在使用的 active 徽标。
  • 点选已有文件即可复用;背景会自动重算动态标志(动画 GIF,或 MP4/WebM/MOV/M4V → 动态背景)。
  • 可直接在窗口内上传新文件,上传成功后自动选中。
  • 打开上传文件夹会用系统文件管理器(explorer / open / xdg-open)打开该目录,增删改都由你自己来。
  • 不会自动删除任何文件:上传目录完全由用户管理,选择器只读。

底层新增三个路由:

路由 用途
GET /xiao-theme/uploads?kind=bg|avatar 列出上传资产(按时间倒序),含 usedBy / active
GET /xiao-theme/uploads-file?name=…&v=… 单个文件的缩略图 / 预览,支持 Range;主题或背景关闭时同样可用
POST /xiao-theme/open-uploads 用系统文件管理器打开上传目录
  • 安全:uploads-file 只接受纯文件名,basename(name) !== name 一律 400,杜绝路径穿越。
  • 体量很大的 GIF 不整读文件即判为动态;较小的仍会扫描动画 GIF 特征。
  • 弹窗布局:文件列表在面板内滚动(max-height: 78vh),窗口再矮也不会把底部按钮挤出面板。

🩹 修复:DSH / better-sidebar 升级后侧栏透明度失效

症状 —— 升级 DSH 与第三方 better-sidebar 后,「侧栏不透明度」对右栏不再生效。

根因 —— 两侧的 DOM 同时变了:

  • DSH 删掉了 detailsCol 列。右列现在是 data-rightbar-col,真正的面板是 dsh-client-ui-sidebar-right 的 [data-sidebar-right-panel](底色 var(--dsw-alias-bg-base),折叠时仍挂载)。
  • better-sidebar 0.19 不再自绘右侧面板:每个 tab 都注册进 DSH 原生右栏(ctx.sidebarRight,slot sidebar.right.pane.tab)。它的 data-dsh-panel / data-dsh-pane 仍在,但 data-dsh-panel 现在只标在底部工作台面板上。

修法 —— 右栏改为命中 [data-sidebar-right-panel],并在该子树内一并覆盖语义背景 token(--dsw-alias-bg-base / -layer-1 / -layer-2 / -layer-3):只改面板底色不够,better-sidebar 的 tab 条、卡片、编辑器、文件树都从这些 token 取底色。同时补上了此前缺失的 --dsw-alias-bg-layer-3。

向后兼容 —— 旧锚点全部保留:[class$="detailsCol"](老 DSH)、[data-dsh-panel]:not([data-dsh-bottom-panel]) / [data-dsh-pane](老 better-sidebar)。新版底部工作台面板被显式排除,保持不透明,不会透出对话文字。

✅ 版本兼容(2026-09-10 实测)

组件 升级前 当前
DeepSeek Harness 0.1.1-rc.2 0.1.5-rc.1
better-sidebar 0.17.1 0.19.0

两套组合下「侧栏不透明度」对左右侧栏均生效。更老的 better-sidebar(0.14.x / 0.16.x)使用同一套 data-dsh-panel 锚点,预期可用,但未实测。

📦 升级方式

  • 无需迁移:设置仍在 ~/.dsh/xiao-theme.json,上传文件仍在 ~/.dsh/xiao-theme-uploads/;旧的 backgroundOpacity / backgroundDarkOpacity 照常迁移为 panelOpacity。
  • 上传文件永不自动删除。
  • 更新后刷新 DSH Web 即可,无需重启。
dsh plugin --profile web add xiao-ui-theme-ts@0.9.0
# 或从 release tarball 安装
dsh plugin --profile web add https://github.com/jinxlux/xiao-theme-dsh-ui-plugin/releases/latest/download/xiao-ui-theme-ts.tgz

0.8.0 version

Choose a tag to compare

@jinxlux jinxlux released this 08 Sep 15:53

xiao-ui-theme-ts — v0.8.0

Customizable theme for the DeepSeek Harness Web UI. This update adds video dynamic backgrounds, a background-video sound toggle, streaming uploads with larger limits, and visible upload errors — while keeping all existing GIF / static behavior unchanged.

✨ Added

  • Video dynamic backgrounds — upload an MP4 / WebM / MOV / M4V video and it's auto-detected and played as a full-screen looping background behind the frosted UI (no separate toggle). Static images and animated GIFs keep working exactly as before.
  • Background video sound toggle — when the current background is a video, a “Background video audio” switch appears in Settings. Defaults to muted (browsers require it for autoplay); enabling it plays immediately and restores sound on your first interaction if autoplay-with-sound was blocked.
  • Upload error feedback — failed uploads now show a clear message right in the Settings page instead of silently doing nothing: unsupported file format, file too large, or a file whose format doesn't match its extension.
  • HTTP Range support on the background route (Accept-Ranges: bytes, 206 partial content), so videos stream and seek smoothly.

🚀 Improved

  • Streaming uploads — files are written to disk as they arrive instead of being buffered fully in memory, so the host stays stable under large uploads.
  • Size limits by purpose — avatars/images keep a 20 MB cap; backgrounds (including video) are raised to 200 MB.
  • Format validation — video containers are checked against their extension (e.g. a .mkv renamed to .mp4 is rejected with “format does not match its extension”); unsupported extensions are rejected up front.

🐞 Fixed

  • Fixed an ERR_HTTP_HEADERS_SENT crash on ranged background requests (double writeHead).
  • The background image/video route now streams from disk instead of buffering the whole file on every request.

🧩 Compatibility

  • Backward compatible — existing GIF / static backgrounds, saved configs, and previously uploaded files are untouched. Old configs without the new field migrate automatically (the new sound toggle defaults to off).
  • Best playback: H.264 (AVC) + AAC in .mp4, or VP8/VP9 in .webm. Some browsers can't decode HEVC (H.265) .mp4/.mov.

fix quick fix for 0.7 version as 0.7.1

Choose a tag to compare

@jinxlux jinxlux released this 06 Sep 14:21
  • fix avatar uploading issue