dsh-update-status 0.1.8 → 0.1.10
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 +22 -0
- package/README.md +17 -6
- package/README.zh.md +17 -6
- package/lib/client.js +41 -68
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +75 -3
- package/lib/index.js +343 -28
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.1.10 — 2026-09-26
|
|
6
|
+
|
|
7
|
+
Verified DeepSeek Harness: `0.1.7-rc.2` (the latest release candidate, and what npm's `next` dist-tag publishes), also `0.1.7-rc.1` and `0.1.7-alpha.2`. The verified list is unchanged from `0.1.8`. Full bilingual release notes: [`docs/releases/v0.1.10.md`](docs/releases/v0.1.10.md).
|
|
8
|
+
|
|
9
|
+
- **A collapsed sidebar no longer carries an entry.** DSH renders `sidebar.footer.action` as one row directly above Settings, and the collapsed rail's content box is only 36px wide (the 56px column minus its 10px inline padding) — room for the single official action. A second registrant makes that shared, centred row overflow, and on a phone it did: a neighbouring plugin's entry was pushed off the screen's left edge and this plugin's status dot landed on the rail's border. The rail is also the *default* state on any viewport under 1024px (DSH's `SIDEBAR_AUTO_COLLAPSE`), so a phone showed it permanently. The `sidebar.footer.action` registration, its `FooterAction` component, its `.dus-footer-*` rules and the `footer.status` string are gone: the brand-row chip is the only entry, and the `sidebarEnabled` preference still hides it.
|
|
10
|
+
- **The detail panel's trigger origin went with it.** `PanelStore` carried a `brand` / `rail` origin so the desktop card could sit beside either trigger; with one trigger left it is a plain open/closed toggle, `.dus-panel` owns the desktop `left` that `[data-origin=brand]` used to supply, and the narrow-view bottom sheet is bound to `.dus-panel` itself rather than `[data-origin]`.
|
|
11
|
+
- **Locked by tests (118 passing).** The entry spec asserts `sidebar.footer.action` is *not* registered, and the stylesheet spec asserts no `.dus-footer` rule remains plus that the narrow-view media query still matches the bare panel — a selector left on `[data-origin]` would silently drop the phone's bottom sheet.
|
|
12
|
+
- **Unchanged**: the Host half, the status read, the RPC routes, the brand-row chip, the three dot states, the detail panel, the LAN (non-loopback) fallback and the three preference fields. No migration is needed.
|
|
13
|
+
|
|
14
|
+
## 0.1.9 — 2026-09-26
|
|
15
|
+
|
|
16
|
+
Verified DeepSeek Harness: `0.1.7-rc.2` (the latest release candidate, and what npm's `next` dist-tag publishes), also `0.1.7-rc.1` and `0.1.7-alpha.2`. Full bilingual release notes: [`docs/releases/v0.1.9.md`](docs/releases/v0.1.9.md).
|
|
17
|
+
|
|
18
|
+
A load-failure fix: on some machines the plugin disappeared entirely after upgrading DSH and then the plugin, with nothing in the panel to explain it. No migration is needed, and the verified DSH list is unchanged.
|
|
19
|
+
|
|
20
|
+
- **`@deepseek-ai/schemastery` is resolved explicitly instead of imported by bare specifier.** The host half used to `import z from '@deepseek-ai/schemastery'`, which Node resolves *from the importing file*, so any copy left inside the plugin's install directory won over the copy DSH ships. That is not theoretical: an unmanaged dev `node_modules` (copied in by a local-directory install, which pnpm never removes) pinned `3.18.2`, which has no `volatile()`, and `lib/index.js` threw `TypeError: …volatile is not a function` while it was being imported — the whole host half was gone before any plugin code ran. `src/host/schemastery.ts` now resolves the peer itself, platform copies first (the running DSH installation, then the profile peer farm at `$DSH_HOME/profiles/node_modules`, then the profile tree), and only then falls back to Node's walk. The first candidate that actually exposes `volatile()` wins, and the capability is verified rather than assumed.
|
|
21
|
+
- **A missing `volatile()` degrades the form instead of killing the plugin.** When only a stale copy is reachable the plugin still loads: `Config` is built with ordinary fields, the Host logs the resolution, and the panel shows a new `stale-schemastery` warning (severity `notice`, so the chip never repaints) naming the version, the resolved path and the exact directory to remove. Only a total miss — no schemastery anywhere, which means the plugin is not running inside a working DSH installation — still throws, and it names every candidate it tried.
|
|
22
|
+
- **The regression is locked three ways.** `tests/host/schemastery.spec.ts` drives the resolver with injected candidates (platform copy beats a shadowing copy; a stale-only environment loads and reports; unresolvable candidates are skipped; the default order is platform-first, plugin-local last) and adds a source guard that fails if any file under `src/` takes a *value* import of the peer again. `tests/guards/shadowed-peer.mjs` (wired into `pnpm run verify`, CI and both release workflows, after the build) loads the **built** entry with a fake `3.18.2` planted beside it, asserting it still loads and that, with a platform copy present, the platform copy wins.
|
|
23
|
+
- **Already-broken installs still need one manual step.** A machine already running `0.1.6`–`0.1.8` with an unmanaged leftover copy cannot load any newer version either — the failure happens before plugin code runs. Remove the leftover copy and restart DSH first; from this version on, upgrading is the whole fix.
|
|
24
|
+
- **Tests: 116 passing** (up from 98) across 15 files.
|
|
25
|
+
- **Unchanged**: the status read, the RPC channel, the client rendering path, the sidebar chip, the detail panel, the LAN fallback and the profile-patch preference model. The three preferences are still the only volatile fields.
|
|
26
|
+
|
|
5
27
|
## 0.1.8 — 2026-09-25
|
|
6
28
|
|
|
7
29
|
Verified DeepSeek Harness: `0.1.7-rc.2` (the latest release candidate, and what npm's `next` dist-tag publishes), also `0.1.7-rc.1` and `0.1.7-alpha.2`. Full bilingual release notes: [`docs/releases/v0.1.8.md`](docs/releases/v0.1.8.md).
|
package/README.md
CHANGED
|
@@ -34,11 +34,11 @@ It shadows only the expanded sidebar brand name with `DeepSeek` plus a compact v
|
|
|
34
34
|
|
|
35
35
|
## Features
|
|
36
36
|
|
|
37
|
-
- **Visible version status** — shows the running DSH version in the expanded sidebar and a
|
|
37
|
+
- **Visible version status** — shows the running DSH version in the expanded sidebar. Nothing is rendered while the sidebar is collapsed: DSH's `sidebar.footer.action` row is a single 36px cell above Settings, and a second registrant overflows it (it pushed a neighbouring plugin's entry off the screen edge), so the brand-row chip is the only entry.
|
|
38
38
|
- **Quiet update signal** — a pending update never repaints the version chip. Only an amber dot with a soft halo next to the version breathes (scale + glow; the animation is disabled under `prefers-reduced-motion`), so a new release reads as one small light instead of a recoloured brand row.
|
|
39
39
|
- **Three dot states, one glance** — with nothing to do the dot beside the version is a plain **green circle** (the theme's success colour, not the text colour, so a dark shell no longer paints a dot that reads as "off"). While a check is running it is the neutral grey pulse; a pending update is the amber halo. Only the update state animates or glows, and only a failed status read repaints the chip, in red.
|
|
40
40
|
- **Neutral chip surface** — the chip is a grey second-level surface in both themes (`#f1f3f5` light / `#353638` dark) with the theme's normal label colour, so the dark shell gets a dark grey chip with white text rather than a white pill that hides the amber halo.
|
|
41
|
-
- **Light, dark, or system — followed automatically** — every colour the plugin renders is a DSH semantic token, so the chip, the dot, its halo
|
|
41
|
+
- **Light, dark, or system — followed automatically** — every colour the plugin renders is a DSH semantic token, so the chip, the dot, its halo and the panel all resolve through whatever appearance DSH is using. Set DSH to light, to dark, or to system and the plugin switches with the shell: no plugin-side theme setting, no media query to keep in sync. Hover lifts the chip in both directions (darkened in light mode, lightened in dark mode) by mixing the theme's label colour into the surface.
|
|
42
42
|
- **Stable and preview discovery** — reads npm dist-tags `latest`, `next`, and `alpha` in one registry request; `latest` is the default.
|
|
43
43
|
- **Useful choices only** — de-duplicates rows by version, keeps `latest` and the channel you follow, and never hides the channel that matches the release you are running.
|
|
44
44
|
- **In-panel channel selection** — select a meaningful stable, candidate, or preview release directly in the panel; the preference is stored by the DSH Host.
|
|
@@ -148,13 +148,15 @@ If you want DSH's stock policy instead (a non-loopback page never persists setti
|
|
|
148
148
|
|
|
149
149
|
## Compatibility
|
|
150
150
|
|
|
151
|
-
Current release: plugin **`0.1.
|
|
151
|
+
Current release: plugin **`0.1.10`** is verified against DeepSeek Harness **`0.1.7-rc.2`** (the latest release candidate), **`0.1.7-rc.1`** and **`0.1.7-alpha.2`**.
|
|
152
152
|
|
|
153
153
|
### Which plugin version goes with which DeepSeek Harness version
|
|
154
154
|
|
|
155
155
|
| Plugin | Verified DeepSeek Harness | On npm | What that version is |
|
|
156
156
|
| --- | --- | --- | --- |
|
|
157
|
-
| **`0.1.
|
|
157
|
+
| **`0.1.10`** | `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | `latest` | Drops the collapsed-rail entry: DSH's `sidebar.footer.action` row is only 36px wide inside the rail, so a second registrant pushed a neighbouring plugin's entry off the screen and this plugin's button onto the rail's border; the entry is now only the chip in the expanded brand row |
|
|
158
|
+
| `0.1.9` | `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Resolves `@deepseek-ai/schemastery` explicitly so a stale copy left in the install directory can no longer shadow the copy DSH ships and take the host half down; a missing `volatile()` now degrades the settings form with a `stale-schemastery` notice instead of throwing |
|
|
159
|
+
| `0.1.8` | `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Version-matrix release: adds the running `0.1.7-rc.2` to the verified list after auditing the rc.1 → rc.2 interface delta; zero code change |
|
|
158
160
|
| `0.1.7` | `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Runtime warnings become language-neutral codes rendered by the client, so the English UI is fully English; dev toolchain bumped |
|
|
159
161
|
| `0.1.6` | `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Adapts to DSH 0.1.7: the preferences ARE the plugin entry's volatile `Config` (a form namespace is the Loader entry id), the official client channel is `ctx.configForms`, and `@deepseek-ai/schemastery` is a peer |
|
|
160
162
|
| `0.1.5` | `0.1.6-alpha.2`, `0.1.6-alpha.1`, `0.1.5-rc.1` | published | One dot carries every state (green up to date, grey checking, amber breathing update), neutral grey chip surface in both themes, and advisory notices no longer repaint the chip |
|
|
@@ -164,12 +166,14 @@ Current release: plugin **`0.1.8`** is verified against DeepSeek Harness **`0.1.
|
|
|
164
166
|
| `0.1.1` | `0.1.5-rc.1` | published | The previous npm `latest`; the plugin is inert on LAN/non-loopback pages |
|
|
165
167
|
| `0.1.0` | `0.1.2-rc.1` | published | First release |
|
|
166
168
|
|
|
167
|
-
- **`0.1.6` through `0.1.
|
|
169
|
+
- **`0.1.6` through `0.1.10` support the DSH `0.1.7` line only.** DSH `0.1.7` removed the runtime `ctx.settings.register(...)` API and the `ctx.settingsScope` client service this plugin was built on, so those are the only releases whose preferences work there. On an older DSH — including `0.1.6-alpha.2` — stay on plugin **`0.1.5`**.
|
|
168
170
|
- **Verified DeepSeek Harness** is the exact DSH release that plugin build was tested against. The list has one source of truth in two places — `VERIFIED_DSH_VERSIONS` in [`src/shared/types.ts`](src/shared/types.ts) and `dsh.compatibility.dshReleases` in [`package.json`](package.json) — and a test keeps them identical. A release that is not on the list is not declared compatible: verify it manually first, and if it turns out incompatible, disable or uninstall the plugin rather than patching DSH core. A release that is merely *not listed yet* is reported as **unverified**: that is an advisory in the panel only, and it never repaints the chip — an operator who upgrades DSH ahead of this plugin keeps a normal chip.
|
|
169
171
|
- **On npm** is what `dsh plugin --profile web add dsh-update-status@latest` actually installs. A version that exists in this repository but not on npm is a development state, not a release.
|
|
170
172
|
- Match them explicitly when it matters:
|
|
171
173
|
|
|
172
174
|
```sh
|
|
175
|
+
dsh plugin --profile web add dsh-update-status@0.1.10 # DSH 0.1.7-rc.2, 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
176
|
+
dsh plugin --profile web add dsh-update-status@0.1.9 # DSH 0.1.7-rc.2, 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
173
177
|
dsh plugin --profile web add dsh-update-status@0.1.8 # DSH 0.1.7-rc.2, 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
174
178
|
dsh plugin --profile web add dsh-update-status@0.1.7 # DSH 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
175
179
|
dsh plugin --profile web add dsh-update-status@0.1.6 # DSH 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
@@ -181,7 +185,7 @@ Current release: plugin **`0.1.8`** is verified against DeepSeek Harness **`0.1.
|
|
|
181
185
|
- Two declarations make the `0.1.7` line load at all, and a test keeps them honest:
|
|
182
186
|
- `dsh.engines.dsh` and `peerDependencies['@deepseek-ai/dsh-settings']` both declare `>=0.1.7-alpha.2 <0.2.0`, which admits all three verified releases. The lower bound names the alpha on purpose — under node-semver's default prerelease rule a range like `>=0.1.6-0 <0.2.0` does **not** admit `0.1.7-alpha.2`. DSH `0.1.7-rc.2` also refuses an incompatible bundle at profile load, so a range that excluded the running release would silently drop the plugin.
|
|
183
187
|
- `@deepseek-ai/schemastery` is a **peer**, not a plain dependency: DSH 0.1.7 resolves only a linked plugin's peer dependencies from the running installation, so a `link:` install of this directory would otherwise fail to import the Host half.
|
|
184
|
-
- Per-release notes — what changed, who is affected, what to do — are hand-written in Chinese and English and become the GitHub Release body: [`v0.1.8`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.8.md) · [`v0.1.7`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.7.md) · [`v0.1.6`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.6.md) · [`v0.1.5`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.5.md) · [`v0.1.4`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.4.md) · [`v0.1.3`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.3.md) (covers the never-published `0.1.2`).
|
|
188
|
+
- Per-release notes — what changed, who is affected, what to do — are hand-written in Chinese and English and become the GitHub Release body: [`v0.1.10`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.10.md) · [`v0.1.9`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.9.md) · [`v0.1.8`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.8.md) · [`v0.1.7`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.7.md) · [`v0.1.6`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.6.md) · [`v0.1.5`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.5.md) · [`v0.1.4`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.4.md) · [`v0.1.3`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.3.md) (covers the never-published `0.1.2`).
|
|
185
189
|
|
|
186
190
|
## Configuration
|
|
187
191
|
|
|
@@ -223,6 +227,13 @@ The Host caches one registry response, 360 minutes by default, and only a normal
|
|
|
223
227
|
**Nothing reaches the npm registry.**
|
|
224
228
|
The plugin reports the failure and still shows the locally detected running version. Registry access is HTTPS-only to `registry.npmjs.org`; a proxy or offline host produces that warning rather than a wrong version.
|
|
225
229
|
|
|
230
|
+
**The plugin disappeared after an upgrade, and the host log says `volatile is not a function`.**
|
|
231
|
+
Up to `0.1.5` this plugin declared `@deepseek-ai/schemastery` as a regular dependency. From `0.1.6` it is a **peer that DSH provides**, and the `volatile()` DSH adds to it is what turns the three preferences into this entry's settings form. If a copy of that package is left inside the plugin's own install directory — a dev `node_modules` copied in by a local-directory install, which pnpm never removes — Node used to resolve that stale copy, and the missing method threw while the host half was being imported, so the plugin disappeared before it could report anything at all. Newer builds resolve the platform copy explicitly and load either way, and when only a stale copy is reachable the panel shows a `stale-schemastery` notice naming the directory. Remove the leftover copy and restart DSH:
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
rm -rf ~/.dsh/profiles/<profile>/node_modules/dsh-update-status/node_modules
|
|
235
|
+
```
|
|
236
|
+
|
|
226
237
|
## Security boundary
|
|
227
238
|
|
|
228
239
|
- Registry access is limited to HTTPS `registry.npmjs.org`; redirects are rejected.
|
package/README.zh.md
CHANGED
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
|
|
35
35
|
## 功能
|
|
36
36
|
|
|
37
|
-
- **侧栏版本状态**:展开侧栏显示当前 DSH
|
|
37
|
+
- **侧栏版本状态**:展开侧栏显示当前 DSH 版本。收起侧栏时不渲染任何入口——DSH 的 `sidebar.footer.action` 是「设置」上方的一格 36px 位置,第二个注册者会把这一行撑破(实测把相邻插件的入口顶出了屏幕左缘),所以品牌行芯片是唯一入口。
|
|
38
38
|
- **安静的更新提示**:有新版本时**不改变版本 Badge 的背景**,只在版本号旁保留一个带小光晕的橙色圆点做放大缩小的呼吸动画(`prefers-reduced-motion` 下停用动画),让新版本表现为一盏小灯,而不是整条品牌行换色。
|
|
39
39
|
- **一眼三态**:没有可做的事时,版本号旁是**纯绿色小圆圈**(取主题 success 色,不再跟随文字色——暗色外壳下不会再出现一个看起来像「熄灭」的深色点);检查中是中性灰呼吸点;有新版本才是橙色光晕呼吸点。只有更新态会动、会发光,也只有状态读取失败才会把 Badge 重绘成红色。
|
|
40
40
|
- **中性版本底框**:Badge 在明暗两套主题下都用灰色二级面(浅色 `#f1f3f5` / 深色 `#353638`)配主题常规文字色,所以暗色下是「深灰底 + 白字」,不再是会把橙色光晕吃掉的白框;只有状态读取失败时才会重绘成红色。
|
|
41
|
-
- **浅色 / 深色 / 跟随系统,自动适配**:插件渲染的每个颜色都是 DSH 语义令牌,Badge
|
|
41
|
+
- **浅色 / 深色 / 跟随系统,自动适配**:插件渲染的每个颜色都是 DSH 语义令牌,Badge、圆点、光晕与面板都按 DSH 当前外观解析。DSH 设为浅色、深色或跟随系统,插件就跟着切换——插件侧没有自己的主题开关,也没有需要同步的媒体查询。hover 在两个方向上都是「抬起」:浅色下压深、深色下提亮(把主题文字色按比例混进底色实现)。
|
|
42
42
|
- **稳定版与预览版发现**:一次 registry 请求读取 npm dist-tags `latest`、`next`、`alpha`,默认选择 `latest`。
|
|
43
43
|
- **只展示有意义的选择**:按版本号去重;`latest` 与你当前跟随的通道始终保留,并且**不会隐藏与你正在运行的版本相符的那条通道**。
|
|
44
44
|
- **弹窗内直接选择通道**:可直接选择有价值的稳定版、候选版或预览版;偏好由 DSH Host 持久化。
|
|
@@ -148,13 +148,15 @@ DSH 对来源不是 loopback(`localhost` / `127.0.0.1`)的页面会关闭 Ho
|
|
|
148
148
|
|
|
149
149
|
## 兼容性
|
|
150
150
|
|
|
151
|
-
当前发布:插件 **`0.1.
|
|
151
|
+
当前发布:插件 **`0.1.10`** 已针对 DeepSeek Harness **`0.1.7-rc.2`**(最新候选版本)、**`0.1.7-rc.1`** 与 **`0.1.7-alpha.2`** 验证。
|
|
152
152
|
|
|
153
153
|
### 插件版本与 DeepSeek Harness 版本的对应关系
|
|
154
154
|
|
|
155
155
|
| 插件版本 | 已验证的 DeepSeek Harness | npm 发布状态 | 该版本是什么 |
|
|
156
156
|
| --- | --- | --- | --- |
|
|
157
|
-
| **`0.1.
|
|
157
|
+
| **`0.1.10`** | `0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | `latest` | 取消收起轨道的兜底入口:官方 `sidebar.footer.action` 那一行在轨道里只有 36px,第二个注册者会把相邻插件的入口挤出屏幕、把自己的按钮顶到边框上;入口改为只在展开侧栏的品牌行 |
|
|
158
|
+
| `0.1.9` | `0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 显式解析 `@deepseek-ai/schemastery`,安装目录里残留的旧副本不再能遮蔽 DSH 自带的那份、把宿主半整个带走;缺少 `volatile()` 时改为降级设置表单并给出 `stale-schemastery` 提示,而不是抛错 |
|
|
159
|
+
| `0.1.8` | `0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 版本矩阵发布:核对 rc.1 → rc.2 接口差异后,把正在运行的 `0.1.7-rc.2` 加入已验证清单;代码零改动 |
|
|
158
160
|
| `0.1.7` | `0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 运行期告警改为语言中立的代码、由客户端按界面语言渲染,英文界面不再混入中文;dev 工具链升级 |
|
|
159
161
|
| `0.1.6` | `0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 适配 DSH 0.1.7:偏好设置就是插件条目的 volatile `Config`(设置表单命名空间 = loader 条目 id),官方客户端通道改为 `ctx.configForms`,`@deepseek-ai/schemastery` 改为 peer |
|
|
160
162
|
| `0.1.5` | `0.1.6-alpha.2`、`0.1.6-alpha.1`、`0.1.5-rc.1` | 已发布 | 一颗圆点承载全部状态(绿=已是最新、灰=检查中、橙=有新版本)、两套主题都用中性灰底框、提示性告警不再重绘芯片 |
|
|
@@ -164,12 +166,14 @@ DSH 对来源不是 loopback(`localhost` / `127.0.0.1`)的页面会关闭 Ho
|
|
|
164
166
|
| `0.1.1` | `0.1.5-rc.1` | 已发布 | 此前 npm 上的 `latest`;局域网/非回环页面下插件整体不可用 |
|
|
165
167
|
| `0.1.0` | `0.1.2-rc.1` | 已发布 | 首个版本 |
|
|
166
168
|
|
|
167
|
-
- **`0.1.6` 至 `0.1.
|
|
169
|
+
- **`0.1.6` 至 `0.1.10` 只支持 DSH `0.1.7` 线。** DSH `0.1.7` 移除了本插件赖以工作的运行时 `ctx.settings.register(...)` API 与 `ctx.settingsScope` 客户端服务,因此该版本线上只有它们的偏好设置能工作;仍在更早的 DSH(含 `0.1.6-alpha.2`)上时,请继续使用插件 **`0.1.5`**。
|
|
168
170
|
- **已验证的 DeepSeek Harness** 是该插件构建实际测试过的确切 DSH 版本。这份清单只有两个存放处——[`src/shared/types.ts`](src/shared/types.ts) 的 `VERIFIED_DSH_VERSIONS` 与 [`package.json`](package.json) 的 `dsh.compatibility.dshReleases`——并有测试保证两者一致。未列出的 DSH 版本不会被宣称为兼容:请先人工验证;确认不兼容时请禁用或卸载插件,不要修改 DSH 核心。若只是**尚未列入**,插件会标为「尚未验证兼容」:这是**只出现在面板里**的提示,绝不会重绘芯片——DSH 升级快于插件时,芯片依然保持正常外观。
|
|
169
171
|
- **npm 发布状态** 是 `dsh plugin --profile web add dsh-update-status@latest` 实际会装到的版本。只存在于本仓库、尚未发布到 npm 的版本属于开发状态,不是发布版本。
|
|
170
172
|
- 需要精确对应时显式指定版本:
|
|
171
173
|
|
|
172
174
|
```sh
|
|
175
|
+
dsh plugin --profile web add dsh-update-status@0.1.10 # DSH 0.1.7-rc.2、0.1.7-rc.1 或 0.1.7-alpha.2
|
|
176
|
+
dsh plugin --profile web add dsh-update-status@0.1.9 # DSH 0.1.7-rc.2、0.1.7-rc.1 或 0.1.7-alpha.2
|
|
173
177
|
dsh plugin --profile web add dsh-update-status@0.1.8 # DSH 0.1.7-rc.2、0.1.7-rc.1 或 0.1.7-alpha.2
|
|
174
178
|
dsh plugin --profile web add dsh-update-status@0.1.7 # DSH 0.1.7-rc.1 或 0.1.7-alpha.2
|
|
175
179
|
dsh plugin --profile web add dsh-update-status@0.1.6 # DSH 0.1.7-rc.1 或 0.1.7-alpha.2
|
|
@@ -181,7 +185,7 @@ DSH 对来源不是 loopback(`localhost` / `127.0.0.1`)的页面会关闭 Ho
|
|
|
181
185
|
- 有两处声明让 `0.1.7` 线能正常加载,并由测试守住:
|
|
182
186
|
- `dsh.engines.dsh` 与 `peerDependencies['@deepseek-ai/dsh-settings']` 都声明 `>=0.1.7-alpha.2 <0.2.0`,三个已验证版本都在范围内。下界特意写成这个 alpha:按 node-semver 默认的预发布规则,`>=0.1.6-0 <0.2.0` 这样的范围**并不接纳** `0.1.7-alpha.2`。另外 DSH `0.1.7-rc.2` 会在 profile 加载时拒绝不兼容的 bundle,范围若排除正在运行的版本,插件会被静默丢弃。
|
|
183
187
|
- `@deepseek-ai/schemastery` 是 **peer**,不是普通依赖:DSH 0.1.7 只从运行安装解析 link 插件的 peer 依赖,否则 `link:` 安装会连 Host 半边都 import 失败。
|
|
184
|
-
- 每个版本的中英文详细说明(改了什么、影响谁、需要做什么)手写后直接作为 GitHub Release 正文:[`v0.1.8`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.8.md) · [`v0.1.7`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.7.md) · [`v0.1.6`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.6.md) · [`v0.1.5`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.5.md) · [`v0.1.4`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.4.md) · [`v0.1.3`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.3.md)(含从未发布的 `0.1.2`)。
|
|
188
|
+
- 每个版本的中英文详细说明(改了什么、影响谁、需要做什么)手写后直接作为 GitHub Release 正文:[`v0.1.10`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.10.md) · [`v0.1.9`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.9.md) · [`v0.1.8`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.8.md) · [`v0.1.7`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.7.md) · [`v0.1.6`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.6.md) · [`v0.1.5`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.5.md) · [`v0.1.4`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.4.md) · [`v0.1.3`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.3.md)(含从未发布的 `0.1.2`)。
|
|
185
189
|
|
|
186
190
|
## 配置
|
|
187
191
|
|
|
@@ -223,6 +227,13 @@ Host 会缓存一次 registry 响应,默认 360 分钟,且只有普通读取
|
|
|
223
227
|
**完全连不上 npm registry。**
|
|
224
228
|
插件会报告失败,并仍然显示本地检测到的运行版本。registry 访问只允许 HTTPS 的 `registry.npmjs.org`;代理或离线环境会给出这条警告,而不是编造一个版本号。
|
|
225
229
|
|
|
230
|
+
**升级之后插件整个消失了,宿主日志里是 `volatile is not a function`。**
|
|
231
|
+
`0.1.5` 及更早版本把 `@deepseek-ai/schemastery` 声明为普通依赖;从 `0.1.6` 起它是**由 DSH 提供的 peer**,而 DSH 给它加的 `volatile()` 正是把三个偏好变成这个条目设置表单的机制。如果该包的一份旧副本被留在插件自己的安装目录里(用本地目录安装时被一起拷进来的 dev `node_modules`,pnpm 永远不会清理),Node 就会解析到那份旧副本,缺失的方法在宿主半 import 阶段直接抛错,插件在来得及报告任何信息之前就消失了。新版本改为显式解析平台那份,两种情况都能加载;只找得到旧副本时,面板会给出 `stale-schemastery` 提示并指出该删除哪个目录。删除残留目录后重启 DSH:
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
rm -rf ~/.dsh/profiles/<profile>/node_modules/dsh-update-status/node_modules
|
|
235
|
+
```
|
|
236
|
+
|
|
226
237
|
## 安全边界
|
|
227
238
|
|
|
228
239
|
- registry 访问只允许 HTTPS `registry.npmjs.org`,并拒绝重定向。
|
package/lib/client.js
CHANGED
|
@@ -129,10 +129,6 @@ window.__ModuleLoader__.load({
|
|
|
129
129
|
zh: "检查遇到问题",
|
|
130
130
|
en: "Check encountered a problem"
|
|
131
131
|
},
|
|
132
|
-
"footer.status": {
|
|
133
|
-
zh: "打开 DSH 版本状态",
|
|
134
|
-
en: "Open DSH version status"
|
|
135
|
-
},
|
|
136
132
|
"panel.title": {
|
|
137
133
|
zh: "DSH 更新状态",
|
|
138
134
|
en: "DSH update status"
|
|
@@ -277,6 +273,14 @@ window.__ModuleLoader__.load({
|
|
|
277
273
|
zh: "{channel} 是预览通道,版本 {version} 尚未验证与本插件兼容。",
|
|
278
274
|
en: "{channel} is a preview channel; version {version} has not been verified as compatible with this plugin."
|
|
279
275
|
},
|
|
276
|
+
"warning.staleSchemastery": {
|
|
277
|
+
zh: "本插件解析到的 @deepseek-ai/schemastery(版本 {version})来自 {path},不是 DSH 自带的那份,偏好字段无法标记为 volatile。请删除该残留目录并重启 DSH:rm -rf {nodeModulesDir}",
|
|
278
|
+
en: "This plugin resolved @deepseek-ai/schemastery {version} from {path} instead of the copy DSH provides, so preference fields cannot be marked volatile. Remove the stale directory and restart DSH: rm -rf {nodeModulesDir}"
|
|
279
|
+
},
|
|
280
|
+
"warning.staleSchemasteryNoPath": {
|
|
281
|
+
zh: "本插件解析到的 @deepseek-ai/schemastery(版本 {version})来自 {path},不是 DSH 自带的那份,偏好字段无法标记为 volatile。请删除该处残留的 @deepseek-ai/schemastery 目录并重启 DSH。",
|
|
282
|
+
en: "This plugin resolved @deepseek-ai/schemastery {version} from {path} instead of the copy DSH provides, so preference fields cannot be marked volatile. Remove the stale @deepseek-ai/schemastery directory there and restart DSH."
|
|
283
|
+
},
|
|
280
284
|
"guidance.sourceCheckout": {
|
|
281
285
|
zh: "请更新 DSH 源码 checkout、安装依赖并重新构建;本插件无法从 GUI 原地替换。",
|
|
282
286
|
en: "Update the DSH source checkout, install its dependencies, and rebuild it; this plugin cannot replace it in place from the GUI."
|
|
@@ -330,8 +334,8 @@ window.__ModuleLoader__.load({
|
|
|
330
334
|
en: "Show the version-status entry in the sidebar"
|
|
331
335
|
},
|
|
332
336
|
"settings.sidebarHint": {
|
|
333
|
-
zh: "
|
|
334
|
-
en: "When off, the
|
|
337
|
+
zh: "关闭后不再渲染品牌行里的版本芯片。不会执行或安排升级。",
|
|
338
|
+
en: "When off, the version chip in the brand row is not rendered. No update is run or scheduled."
|
|
335
339
|
},
|
|
336
340
|
"settings.channel": {
|
|
337
341
|
zh: "关注发布通道",
|
|
@@ -383,6 +387,16 @@ window.__ModuleLoader__.load({
|
|
|
383
387
|
channel: warning.channel,
|
|
384
388
|
version: warning.version
|
|
385
389
|
}, language);
|
|
390
|
+
case "stale-schemastery": {
|
|
391
|
+
const params = {
|
|
392
|
+
version: warning.version ?? "—",
|
|
393
|
+
path: warning.path
|
|
394
|
+
};
|
|
395
|
+
return warning.nodeModulesDir === null ? t("warning.staleSchemasteryNoPath", params, language) : t("warning.staleSchemastery", {
|
|
396
|
+
...params,
|
|
397
|
+
nodeModulesDir: warning.nodeModulesDir
|
|
398
|
+
}, language);
|
|
399
|
+
}
|
|
386
400
|
}
|
|
387
401
|
}
|
|
388
402
|
/** Prefer structured warnings, but keep the Host string for mixed-version clients. */
|
|
@@ -508,7 +522,7 @@ window.__ModuleLoader__.load({
|
|
|
508
522
|
event.stopPropagation();
|
|
509
523
|
const target = event.currentTarget;
|
|
510
524
|
if (target instanceof HTMLElement) target.blur();
|
|
511
|
-
ui.panel.toggle(
|
|
525
|
+
ui.panel.toggle();
|
|
512
526
|
};
|
|
513
527
|
const onKeyDown = (event) => {
|
|
514
528
|
if (event.key !== "Enter" && event.key !== " ") return;
|
|
@@ -542,33 +556,6 @@ window.__ModuleLoader__.load({
|
|
|
542
556
|
})]
|
|
543
557
|
});
|
|
544
558
|
}
|
|
545
|
-
/** List-slot fallback: it deliberately disappears while the name badge is wide. */
|
|
546
|
-
function FooterAction({ wide, ui }) {
|
|
547
|
-
const preferences = useObservable(ui.preferences);
|
|
548
|
-
const snapshot = useObservable(ui.status);
|
|
549
|
-
if (wide === true || !preferences.sidebarEnabled) return null;
|
|
550
|
-
const state = visualState(snapshot.status, snapshot.loading, snapshot.error);
|
|
551
|
-
const label = badgeLabel(snapshot.status, snapshot.loading, snapshot.error);
|
|
552
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
553
|
-
className: "dus-footer-button",
|
|
554
|
-
type: "button",
|
|
555
|
-
"aria-label": t("footer.status"),
|
|
556
|
-
title: label,
|
|
557
|
-
onClick: () => {
|
|
558
|
-
ui.panel.toggle("rail");
|
|
559
|
-
},
|
|
560
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
561
|
-
className: "dus-footer-icon",
|
|
562
|
-
"aria-hidden": "true",
|
|
563
|
-
children: "↟"
|
|
564
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
565
|
-
className: "dus-dot dus-footer-dot",
|
|
566
|
-
"data-state": state,
|
|
567
|
-
"data-update": snapshot.status?.hasUpdate === true || void 0,
|
|
568
|
-
"data-loading": state === "loading" || void 0
|
|
569
|
-
})]
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
559
|
function statusSummary(status, loading, error) {
|
|
573
560
|
if (loading && status === null) return {
|
|
574
561
|
kind: "warning",
|
|
@@ -670,7 +657,6 @@ window.__ModuleLoader__.load({
|
|
|
670
657
|
}
|
|
671
658
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
672
659
|
className: "dus-panel",
|
|
673
|
-
"data-origin": panel.origin,
|
|
674
660
|
role: "dialog",
|
|
675
661
|
"aria-modal": "true",
|
|
676
662
|
"aria-label": t("panel.title"),
|
|
@@ -1028,6 +1014,17 @@ window.__ModuleLoader__.load({
|
|
|
1028
1014
|
channel: record.channel,
|
|
1029
1015
|
version: record.version
|
|
1030
1016
|
};
|
|
1017
|
+
if (record.code === "stale-schemastery") {
|
|
1018
|
+
const version = record.version === null ? null : stringOrNull(record.version);
|
|
1019
|
+
const nodeModulesDir = record.nodeModulesDir === null ? null : stringOrNull(record.nodeModulesDir);
|
|
1020
|
+
const path = stringOrNull(record.path);
|
|
1021
|
+
if (path !== null && (record.version === null || version !== null) && (record.nodeModulesDir === null || nodeModulesDir !== null)) return {
|
|
1022
|
+
code: record.code,
|
|
1023
|
+
version,
|
|
1024
|
+
path,
|
|
1025
|
+
nodeModulesDir
|
|
1026
|
+
};
|
|
1027
|
+
}
|
|
1031
1028
|
}
|
|
1032
1029
|
/** Reject malformed RPC output before it reaches a slot component. */
|
|
1033
1030
|
function updateStatusOf(value) {
|
|
@@ -1280,12 +1277,9 @@ window.__ModuleLoader__.load({
|
|
|
1280
1277
|
for (const listener of this.listeners) listener();
|
|
1281
1278
|
}
|
|
1282
1279
|
};
|
|
1283
|
-
/** Open state
|
|
1280
|
+
/** Open state of the detail panel, whose only trigger is the brand-row chip. */
|
|
1284
1281
|
var PanelStore = class {
|
|
1285
|
-
snapshot = {
|
|
1286
|
-
open: false,
|
|
1287
|
-
origin: "brand"
|
|
1288
|
-
};
|
|
1282
|
+
snapshot = { open: false };
|
|
1289
1283
|
listeners = /* @__PURE__ */ new Set();
|
|
1290
1284
|
getSnapshot = () => this.snapshot;
|
|
1291
1285
|
subscribe = (listener) => {
|
|
@@ -1294,21 +1288,14 @@ window.__ModuleLoader__.load({
|
|
|
1294
1288
|
this.listeners.delete(listener);
|
|
1295
1289
|
};
|
|
1296
1290
|
};
|
|
1297
|
-
toggle(
|
|
1298
|
-
|
|
1299
|
-
this.set({
|
|
1300
|
-
open,
|
|
1301
|
-
origin
|
|
1302
|
-
});
|
|
1291
|
+
toggle() {
|
|
1292
|
+
this.set({ open: !this.snapshot.open });
|
|
1303
1293
|
}
|
|
1304
1294
|
close() {
|
|
1305
|
-
this.set({
|
|
1306
|
-
...this.snapshot,
|
|
1307
|
-
open: false
|
|
1308
|
-
});
|
|
1295
|
+
this.set({ open: false });
|
|
1309
1296
|
}
|
|
1310
1297
|
set(next) {
|
|
1311
|
-
if (this.snapshot.open === next.open
|
|
1298
|
+
if (this.snapshot.open === next.open) return;
|
|
1312
1299
|
this.snapshot = next;
|
|
1313
1300
|
for (const listener of this.listeners) listener();
|
|
1314
1301
|
}
|
|
@@ -1727,7 +1714,7 @@ window.__ModuleLoader__.load({
|
|
|
1727
1714
|
resolves — light, dark, or system-follows-the-OS — with no plugin-side detection,
|
|
1728
1715
|
no media query and no per-theme branch to keep in sync. */
|
|
1729
1716
|
.dus-badge{--dus-badge-surface:var(--dsw-alias-button-floating-hover,#f1f3f5);align-items:center;background:var(--dus-badge-surface);border:0;border-radius:4px;color:var(--dsw-alias-label-primary,#0f1115);cursor:pointer;display:inline-flex;flex:none;font-family:var(--ds-font-family-code,var(--dsw-font-family-mono,ui-monospace,SFMono-Regular,Menlo,monospace));font-size:10px;font-variant-numeric:tabular-nums;font-weight:600;gap:4px;height:16px;line-height:16px;max-width:140px;outline:none;padding:0 6px;touch-action:manipulation;user-select:none;white-space:nowrap}
|
|
1730
|
-
.dus-badge:focus-visible,.dus-
|
|
1717
|
+
.dus-badge:focus-visible,.dus-action:focus-visible,.dus-close:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}
|
|
1731
1718
|
/* Hover has to read as "raised" in BOTH themes. brightness() only ever brightens, and on
|
|
1732
1719
|
the light shell it turns the grey chip pure white — the chip all but disappears. Mixing
|
|
1733
1720
|
a little of the theme's own label colour into the surface darkens it in light mode and
|
|
@@ -1764,16 +1751,10 @@ window.__ModuleLoader__.load({
|
|
|
1764
1751
|
@keyframes dus-pulse{0%,100%{opacity:.45;transform:scale(.82)}50%{opacity:1;transform:scale(1.15)}}
|
|
1765
1752
|
@keyframes dus-update-pulse{0%,100%{box-shadow:0 0 2px 0 rgba(245,158,11,.4);box-shadow:0 0 2px 0 color-mix(in srgb,var(--dus-update-color) 45%,transparent);transform:scale(.8)}50%{box-shadow:0 0 7px 2px rgba(245,158,11,.72);box-shadow:0 0 7px 2px color-mix(in srgb,var(--dus-update-color) 72%,transparent);transform:scale(1.15)}}
|
|
1766
1753
|
@media (prefers-reduced-motion:reduce){.dus-dot[data-update=true],.dus-dot[data-loading=true]{animation:none}.dus-dot[data-update=true]{box-shadow:0 0 5px 1px rgba(245,158,11,.6);box-shadow:0 0 5px 1px color-mix(in srgb,var(--dus-update-color) 62%,transparent)}}
|
|
1767
|
-
.dus-footer-button{align-items:center;background:transparent;border:0;border-radius:10px;color:var(--dsw-alias-label-secondary);cursor:pointer;display:flex;height:44px;justify-content:center;min-height:44px;min-width:44px;padding:0;position:relative;touch-action:manipulation;width:44px}
|
|
1768
|
-
.dus-footer-button:hover{background:var(--dsw-alias-button-floating-hover);color:var(--dsw-alias-label-primary)}
|
|
1769
|
-
.dus-footer-icon{font-size:18px;line-height:1}
|
|
1770
|
-
.dus-footer-dot{border:1.5px solid var(--dsw-specific-sidebar-fill);position:absolute;right:9px;top:9px}
|
|
1771
1754
|
.dus-overlay-root{background:transparent;border:0;color:inherit;height:100dvh;inset:0;margin:0;max-height:none;max-width:none;padding:0;pointer-events:none;position:fixed;width:100vw}
|
|
1772
1755
|
.dus-overlay-root::backdrop{background:transparent}
|
|
1773
1756
|
.dus-backdrop{background:transparent;inset:0;pointer-events:auto;position:absolute}
|
|
1774
|
-
.dus-panel{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:14px;box-shadow:var(--dsw-elevation-panel);box-sizing:border-box;color:var(--dsw-alias-label-primary);max-height:min(640px,calc(100dvh - 32px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));overflow:auto;padding:14px;pointer-events:auto;position:absolute;top:12px;width:min(390px,calc(100vw - 24px));z-index:1}
|
|
1775
|
-
.dus-panel[data-origin=brand]{left:min(292px,calc(100vw - 402px))}
|
|
1776
|
-
.dus-panel[data-origin=rail]{left:min(68px,calc(100vw - 402px))}
|
|
1757
|
+
.dus-panel{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:14px;box-shadow:var(--dsw-elevation-panel);box-sizing:border-box;color:var(--dsw-alias-label-primary);left:min(292px,calc(100vw - 402px));max-height:min(640px,calc(100dvh - 32px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));overflow:auto;padding:14px;pointer-events:auto;position:absolute;top:12px;width:min(390px,calc(100vw - 24px));z-index:1}
|
|
1777
1758
|
.dus-panel-head{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-bottom:12px}
|
|
1778
1759
|
.dus-panel-title{font-size:14px;font-weight:650}
|
|
1779
1760
|
.dus-close{align-items:center;background:transparent;border:0;border-radius:8px;color:inherit;cursor:pointer;display:inline-flex;font-size:20px;height:32px;justify-content:center;line-height:1;min-height:32px;min-width:32px;padding:0;touch-action:manipulation;width:32px}
|
|
@@ -1821,7 +1802,7 @@ window.__ModuleLoader__.load({
|
|
|
1821
1802
|
.dus-channel-compat[data-compatibility=verified]{color:var(--dsw-alias-state-success-primary)}
|
|
1822
1803
|
.dus-channel-compat[data-compatibility=incompatible]{color:var(--dsw-alias-state-error-primary)}
|
|
1823
1804
|
.dus-settings-hint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.45;margin:8px 0 0}
|
|
1824
|
-
@media (max-width:640px),(hover:none) and (pointer:coarse){.dus-panel
|
|
1805
|
+
@media (max-width:640px),(hover:none) and (pointer:coarse){.dus-panel{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:0;left:0;right:0;max-height:min(78dvh,calc(100dvh - env(safe-area-inset-top)));padding:16px max(16px,env(safe-area-inset-right)) max(16px,env(safe-area-inset-bottom)) max(16px,env(safe-area-inset-left));position:fixed;top:auto;width:100vw}.dus-action{min-height:40px;line-height:38px}.dus-close{height:40px;min-height:40px;min-width:40px;width:40px}}
|
|
1825
1806
|
`;
|
|
1826
1807
|
//#endregion
|
|
1827
1808
|
//#region src/client/index.ts
|
|
@@ -1934,14 +1915,6 @@ window.__ModuleLoader__.load({
|
|
|
1934
1915
|
name: "sidebar.brand.name",
|
|
1935
1916
|
priority: -10
|
|
1936
1917
|
}, () => BrandName({ ui })));
|
|
1937
|
-
ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
|
|
1938
|
-
name: "sidebar.footer.action",
|
|
1939
|
-
id: "dsh-update-status",
|
|
1940
|
-
order: 40
|
|
1941
|
-
}, (props) => FooterAction({
|
|
1942
|
-
wide: props.wide,
|
|
1943
|
-
ui
|
|
1944
|
-
})));
|
|
1945
1918
|
ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
1946
1919
|
name: "shell.overlay",
|
|
1947
1920
|
id: "dsh-update-status",
|