dsh-always-status-bar 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bobnemimimmi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # dsh-always-status-bar
2
+
3
+ > DeepSeek Harness Web 插件:让消息原生的状态栏——`日期 | 时间`,以及
4
+ > Assistant 侧的 `用时 · 首 token · tok/s`——无需悬停即可始终显示。
5
+
6
+ [DSH](https://github.com/deepseek-ai/deepseek-harness) 原生已渲染这些信息,但默认仅在 Hover 时显示,容易被错过。本插件以一条 scoped CSS 覆盖将其常驻显示:复用原生渲染与原生位置,日期/时间格式随 DSH 自动更新,不新增任何可见 UI。
7
+
8
+ - **Always visible**:用户消息与 Assistant 消息的状态栏常驻显示,Hover 前后一致
9
+ - **Zero config**:无设置项、无开关、无存储、无后端、无网络请求,安装即生效
10
+ - **Clean uninstall**:卸载后完全恢复原生 Hover-only 行为,不残留 DOM / CSS / 配置
11
+ - **Minimal & safe**:不扫描 DOM、无 MutationObserver、无轮询;复制、点赞、点踩等按钮不受影响
12
+
13
+ 维护:[Bobnemimimmi](https://github.com/Bobnemimimmi) · 问题与反馈:[GitHub Issues](https://github.com/Bobnemimimmi/dsh-always-status-bar/issues)
14
+
15
+ ## Usage
16
+
17
+ ### 安装
18
+
19
+ ```sh
20
+ dsh plugin --profile web add dsh-always-status-bar
21
+ ```
22
+
23
+ npm 安装拿到的是发布时构建好的成品,无需任何构建授权。
24
+
25
+ 从 GitHub 安装(会运行本包的 `prepare` 自构建;pnpm ≥10 首次 `add` 会拒绝并要求授权,
26
+ 按提示把打印的 `allowBuilds` 键加入 profile 的 `pnpm-workspace.yaml` 后重跑):
27
+
28
+ ```sh
29
+ dsh plugin --profile web add github:Bobnemimimmi/dsh-always-status-bar
30
+ ```
31
+
32
+ 本地目录 / tarball 安装:
33
+
34
+ ```sh
35
+ dsh plugin --profile web add ./dsh-always-status-bar
36
+ ```
37
+
38
+ 重启 `dsh web` 即生效。
39
+
40
+ ### 卸载
41
+
42
+ ```sh
43
+ dsh plugin --profile web remove dsh-always-status-bar
44
+ ```
45
+
46
+ 重启 `dsh web` 后恢复原生 Hover-only 行为。
47
+
48
+ ## Requirements
49
+
50
+ - DeepSeek Harness(`dsh web`)—— 已在 web 客户端包 `0.1.0-rc.5` 上验证
51
+ - `dsh` CLI(或按 DSH 文档以源码方式运行 `pnpm dsh`)
52
+
53
+ DSH 迭代较快;升级后若状态栏未常驻显示,请核对 `data-time-hover-root` 锚点与
54
+ `MessageIconActions.module.css` 的隐藏机制是否仍与当前实现一致。
55
+
56
+ ## License
57
+
58
+ MIT
@@ -0,0 +1,15 @@
1
+ # dsh-always-status-bar bundle layer: exactly one plugin row.
2
+ #
3
+ # The package is dual-face:
4
+ # - The node half (package root, `lib/index.js`) is a no-op Cordis plugin that
5
+ # keeps the Loader row active. The client-modules node half only scans
6
+ # loader entries, so the row must import and activate.
7
+ # - The `dsh.client` declaration in package.json makes that scan serve the
8
+ # browser bundle at `/plugins/dsh-always-status-bar/client.js` and roster it
9
+ # in the `window.__DSH_BOOT__` graph. The browser half injects the CSS.
10
+ #
11
+ # The row id is unique to this plugin and overrides nothing from earlier
12
+ # layers (dsh-base / dsh-web-app).
13
+ - insert:
14
+ - id: dsh-always-status-bar
15
+ name: dsh-always-status-bar
package/lib/client.js ADDED
@@ -0,0 +1,30 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "dsh-always-status-bar",
3
+ factory: (require) => {
4
+ var module = { exports: {} };
5
+ var exports = module.exports;
6
+ "use strict";
7
+
8
+ // src/client/always-status-bar.css
9
+ var always_status_bar_default = '/*\n * dsh-always-status-bar override.\n *\n * DSH renders every message\'s native status line \u2014 the user side\n * (`clock="start"`, CSS module class `timeStart`) and the assistant side\n * (`clock="end"`, class `timeEnd`) \u2014 inside a `data-time-hover-root` scope.\n * That single span carries the date | time and, for assistant messages, the\n * run-time readings (\u7528\u65F6 / \u9996 token / tok/s). DSH hides the whole span with\n * `opacity: 0` inside `@media (hover: hover)`, revealing it on\n * `:hover` / `:focus-within` (ui-conversation `MessageIconActions.module.css`).\n * The span is always present in the DOM \u2014 only its opacity changes \u2014 so the\n * entire feature is this one rule: keep it at full opacity.\n *\n * - `data-time-hover-root` is the stable semantic anchor DSH\'s own tests use.\n * - The CSS-module classes are hashed at build time (`[hash]_timeStart` /\n * `[hash]_timeEnd`), but the local names are preserved, so the substring\n * attribute selectors find exactly the status span \u2014 never the action\n * buttons (copy / branch / third-party) that share the same row.\n * - `!important` keeps the override above the native normal declaration\n * regardless of stylesheet order (plugin bundles materialize concurrently,\n * so order is not under this plugin\'s control).\n * - No other property changes: font, color, date/time format, spacing,\n * alignment, and every action-button behavior stay native.\n */\n[data-time-hover-root] :is([class*="timeStart"], [class*="timeEnd"]) {\n opacity: 1 !important;\n}\n';
10
+
11
+ // src/client/index.ts
12
+ var name = "dsh-always-status-bar";
13
+ var STYLE_TAG_ID = "dsh-always-status-bar/always-status-bar.css";
14
+ function apply(ctx) {
15
+ const existing = document.querySelector(`style[data-plugin-css=${JSON.stringify(STYLE_TAG_ID)}]`);
16
+ const style = existing != null ? existing : document.createElement("style");
17
+ if (existing === null) {
18
+ style.dataset.plugin = name;
19
+ style.dataset.pluginCss = STYLE_TAG_ID;
20
+ style.textContent = always_status_bar_default;
21
+ document.head.appendChild(style);
22
+ }
23
+ ctx.effect(() => () => {
24
+ style.remove();
25
+ }, `${name}: always-visible status bar style`);
26
+ }
27
+ module.exports = { name, apply };
28
+ return module.exports;
29
+ },
30
+ });
package/lib/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // src/index.ts
2
+ var name = "dsh-always-status-bar";
3
+ function apply(_ctx) {
4
+ }
5
+ export {
6
+ apply,
7
+ name
8
+ };
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "dsh-always-status-bar",
3
+ "version": "0.1.0",
4
+ "description": "DSH Web UI plugin: keep the native per-message status line (date | time, run duration, TTFT, tokens/s) always visible without hovering",
5
+ "keywords": [
6
+ "dsh",
7
+ "dsh-plugin",
8
+ "deepseek-harness",
9
+ "web",
10
+ "ui",
11
+ "status-bar"
12
+ ],
13
+ "homepage": "https://github.com/Bobnemimimmi/dsh-always-status-bar#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/Bobnemimimmi/dsh-always-status-bar/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/Bobnemimimmi/dsh-always-status-bar.git"
20
+ },
21
+ "license": "MIT",
22
+ "author": "Bobnemimimmi <haoran020924@gmail.com>",
23
+ "type": "module",
24
+ "main": "lib/index.js",
25
+ "exports": {
26
+ ".": "./lib/index.js",
27
+ "./client": "./lib/client.js",
28
+ "./cordis.patch.yml": "./cordis.patch.yml",
29
+ "./package.json": "./package.json"
30
+ },
31
+ "files": [
32
+ "lib/index.js",
33
+ "lib/client.js",
34
+ "cordis.patch.yml"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dsh": {
40
+ "bundle": {
41
+ "patch": "./cordis.patch.yml"
42
+ },
43
+ "client": {
44
+ "platform": "web"
45
+ }
46
+ },
47
+ "scripts": {
48
+ "build": "node build.mjs",
49
+ "prepare": "node build.mjs",
50
+ "prepack": "node build.mjs",
51
+ "typecheck": "tsc -p tsconfig.json",
52
+ "test": "node build.mjs && vitest run"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.20.1",
56
+ "esbuild": "^0.25.0",
57
+ "jsdom": "^26.1.0",
58
+ "typescript": "^5.8.0",
59
+ "vitest": "^3.1.0"
60
+ }
61
+ }