dsh-notify-me 1.1.0 → 1.1.2
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 +28 -7
- package/README.en.md +16 -3
- package/README.md +24 -10
- package/lib/client.js +25 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to **dsh-notify-me** are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.1.2] — 2026-09-08
|
|
6
|
+
|
|
7
|
+
### 变更
|
|
8
|
+
- **README 新增「为什么需要它」**(中英双语):把定位写清楚——不开完整访问要付「等待」成本,开了要付「不可逆风险」成本;插件把「监督」与「守在屏幕前」解耦,**让你敢不开完整访问**,并注明它不降低 full access 本身的权限风险(它不是沙箱)。
|
|
9
|
+
- README 预览图改用绝对地址:`docs/` 不在发布文件集内,相对路径在 npm 页面会裂;简体版补齐 bundle 体积 badge,与英文版对齐。
|
|
10
|
+
- 中文正文标点统一:半角 `;` → `;`,直引号 `"…"` → `「…」`。
|
|
11
|
+
- 仓库新增 `.gitignore`(`node_modules/`、`.npm-cache/`、`*.tgz`)。
|
|
12
|
+
|
|
13
|
+
### 修复
|
|
14
|
+
- `window.__dshNotifyMe.version` 与包版本脱节(停在 `0.2.0`),现随 `package.json` 同步为 `1.1.2`。
|
|
15
|
+
- `CHANGELOG` 1.0.0 条目中的字面量 `\n`(页面上会渲染成 "\n")改为真实换行;1.0.1 条目英文措辞自相矛盾处修正;版本链接修正为真实存在的目标(1.0.0 / 1.0.1 没有对应 git tag,原链接 404)。
|
|
16
|
+
|
|
17
|
+
## [1.1.1] — 2026-09-08
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- **测试按钮不再被「页面打开时也提醒」开关吞掉**:页面可见且「回复完成」保持默认(仅后台提醒)时,点「测试「回复完成」」现在会正常弹出提醒——测试路径改为绕过可见性规则(只受主开关与浏览器通知权限影响),并补上对应的回归用例。
|
|
21
|
+
- 「需要你」测试提醒的标签页标记约 6 秒后自动消失,不再留下一个看起来像「真有待办」的常驻标记。
|
|
22
|
+
|
|
5
23
|
## [1.1.0] — 2026-09-08
|
|
6
24
|
|
|
7
25
|
### Added
|
|
@@ -14,23 +32,26 @@ All notable changes to **dsh-notify-me** are documented here.
|
|
|
14
32
|
- `lib/client.js` 重写:提醒核心保持零第三方依赖与自包含;新增语言解析/多语言文案表与可选 Settings 页面(依赖 `slots`/`locale`/`react`,注册前做能力守卫)。
|
|
15
33
|
- 冒烟测试扩展:覆盖主开关、`language` 中英切换后的通知文案与标题标记、`resetConfig` 恢复新增默认项。
|
|
16
34
|
|
|
17
|
-
##
|
|
35
|
+
## 1.0.1 — 2026-09-08
|
|
18
36
|
|
|
19
37
|
### Changed
|
|
20
|
-
- README is now
|
|
38
|
+
- README is now a **Simplified-Chinese-primary** homepage (`README.md`) with a parallel English version (`README.en.md`) and this changelog, mirroring the ecosystem's documentation conventions.
|
|
21
39
|
- `package.json`: added `publishConfig.access: public`, `repository`/`homepage`/`bugs` links, and added `README.en.md` + `CHANGELOG.md` to the published `files` set.
|
|
22
40
|
|
|
23
|
-
##
|
|
41
|
+
## 1.0.0 — 2026-09-08
|
|
24
42
|
|
|
25
43
|
### Added
|
|
26
44
|
- First release. Browser-layer desktop reminder plugin for the DeepSeek Harness web UI.
|
|
27
45
|
- 🔔 **Needs-your-input alerts**: fires on new pending interactions — sandbox `approval`, `plan-review`, and `question` (`ask_user_question`) — with toast + sound + `🔔 需要你 ·` tab-title marker (alerts even while the page is visible).
|
|
28
46
|
- ✅ **Reply-finished alerts**: detects the selected session's `running: true → false` edge (and background sessions' completion) — toast + sound, by default only while the page is hidden/backgrounded.
|
|
29
47
|
- Clicking a toast focuses the DSH window.
|
|
30
|
-
- Zero-UI, zero-server-logic: pure client-side bundle subscribing to the `sessions` service; preferences in `localStorage`; auditable, self-contained code (`<20 KB`).
|
|
31
|
-
- Offline smoke test (`smoke/smoke-test.cjs`) covering the alert state machine
|
|
48
|
+
- Zero-UI, zero-server-logic: pure client-side bundle subscribing to the `sessions` service; preferences in `localStorage`; auditable, self-contained code (`<20 KB` at 1.0.0).
|
|
49
|
+
- Offline smoke test (`smoke/smoke-test.cjs`) covering the alert state machine.
|
|
50
|
+
- Screenshot + `screenshots.json` for the plugin-market page; UI preview shown in the README.
|
|
32
51
|
|
|
33
52
|
<!-- versions -->
|
|
53
|
+
> 1.0.0 与 1.0.1 早于本仓库的 GitHub 标签历史(tag 从 `v1.1.0` 起,且 npm 上只有 1.0.0 / 1.1.0 / 1.1.1),故不附链接。
|
|
54
|
+
|
|
55
|
+
[1.1.2]: https://github.com/chromoany/dsh-notify-me/compare/v1.1.1...v1.1.2
|
|
56
|
+
[1.1.1]: https://github.com/chromoany/dsh-notify-me/compare/v1.1.0...v1.1.1
|
|
34
57
|
[1.1.0]: https://github.com/chromoany/dsh-notify-me/releases/tag/v1.1.0
|
|
35
|
-
[1.0.1]: https://github.com/chromoany/dsh-notify-me/compare/v1.0.0...v1.0.1
|
|
36
|
-
[1.0.0]: https://github.com/chromoany/dsh-notify-me/releases/tag/v1.0.0
|
package/README.en.md
CHANGED
|
@@ -14,13 +14,26 @@
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## Why you need it
|
|
18
|
+
|
|
19
|
+
Both of DSH's permission modes cost you something:
|
|
20
|
+
|
|
21
|
+
| Mode | What it costs you | Cost type |
|
|
22
|
+
| --- | --- | --- |
|
|
23
|
+
| No full access (`workspace-write` + ask) | **Waiting** — the agent stops on an approval; if you aren't watching the page, you're just burning wall-clock time | Time, growing with the number of sessions |
|
|
24
|
+
| Full access | **Irreversible risk** — you give up the ability to intercept before anything happens | Risk, independent of whether you watch |
|
|
25
|
+
|
|
26
|
+
dsh-notify-me decouples **supervision** from **sitting in front of the screen**: it pulls you back with a system notification only when a decision is genuinely needed (approval / plan review / question) or a reply finishes — **so you can afford to keep full access off** instead of trading away interception for speed. It does not lower the risk of full access itself (it is not a sandbox); it just drives the waiting cost of ask-mode down to roughly zero.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
17
30
|
> 🔎 Looking for it? Search `dsh-notify-me`, **message alerts**, **notification**, **desktop notification**, **reminder**, **approval alert** or **可操作提醒 / 消息提醒 / 桌面通知 / 需要你操作** (npm keywords include both English and Chinese terms).
|
|
18
31
|
|
|
19
32
|
## UI Preview
|
|
20
33
|
|
|
21
34
|
| Windows system notification |
|
|
22
35
|
| --- |
|
|
23
|
-
|  |
|
|
36
|
+
|  |
|
|
24
37
|
|
|
25
38
|
[Changelog](CHANGELOG.md)
|
|
26
39
|
|
|
@@ -39,7 +52,7 @@ Open **Settings → Notify me** (refresh the page once after installing):
|
|
|
39
52
|
- **System notifications / Sound / Volume** — toast toggle, WebAudio beep toggle and a volume slider;
|
|
40
53
|
- **"Needs you" alerts while the page is open** (default on) and **"Reply finished" alerts while the page is open** (default off);
|
|
41
54
|
- **Notification language** — follow the interface / 简体中文 / English: controls the language of the alert text and the `🔔 …` title marker;
|
|
42
|
-
- **Test buttons** — send one "needs you" or "reply finished" test alert with the current settings.
|
|
55
|
+
- **Test buttons** — send one "needs you" or "reply finished" test alert with the current settings (**not** limited by the "while the page is open" toggles; the "needs you" test's title marker clears itself after ~6s).
|
|
43
56
|
|
|
44
57
|
> Notification permission is required: click once on the page → **Allow** (or address-bar lock → Site settings → Notifications → Allow → reload).
|
|
45
58
|
|
|
@@ -99,7 +112,7 @@ The browser half subscribes to the client `sessions` service — the same source
|
|
|
99
112
|
- the **selected session's** `ConversationSnapshot`: a `running: true → false` edge means a reply finished; a new entry in `pending[]` of kind `approval` / `plan-review` / `question` means the agent is waiting on you (payload text is shown in the alert when available);
|
|
100
113
|
- **every other listed session's** summary: a new `pendingInteraction`, or the `completed` edge (finished while not selected), alerts you about background work.
|
|
101
114
|
|
|
102
|
-
The reminder core stays dependency-free and self-contained: notification copy resolves at alert time from the chosen language (follow-interface / Simplified Chinese / English). The Settings page is an **optional** React surface — it only registers into Settings when the web profile provides the `slots` / `locale` services and react
|
|
115
|
+
The reminder core stays dependency-free and self-contained: notification copy resolves at alert time from the chosen language (follow-interface / Simplified Chinese / English). The Settings page is an **optional** React surface — it only registers into Settings when the web profile provides the `slots` / `locale` services and `react`; without them the plugin degrades gracefully to alerts-only (no Settings page).
|
|
103
116
|
|
|
104
117
|
## Known limitations
|
|
105
118
|
|
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
[](https://www.npmjs.com/package/dsh-notify-me)
|
|
7
7
|

|
|
8
8
|

|
|
9
|
+

|
|
9
10
|
|
|
10
11
|
---
|
|
11
12
|
|
|
@@ -13,13 +14,26 @@
|
|
|
13
14
|
|
|
14
15
|
---
|
|
15
16
|
|
|
17
|
+
## 为什么需要它
|
|
18
|
+
|
|
19
|
+
DSH 的两种权限模式各有代价:
|
|
20
|
+
|
|
21
|
+
| 模式 | 你付出的代价 | 代价形态 |
|
|
22
|
+
| --- | --- | --- |
|
|
23
|
+
| 不开完整访问(`workspace-write` + ask) | **等待**——agent 卡在审批上,不盯着页面就是干等 | 时间成本,随会话数增长 |
|
|
24
|
+
| 开完整访问(full access) | **不可逆风险**——放弃的是事前拦截能力 | 风险成本,与你盯不盯无关 |
|
|
25
|
+
|
|
26
|
+
dsh-notify-me 把「监督」和「守在屏幕前」解耦:只在真的出现决策点(审批 / 方案确认 / 提问)或回复跑完时,才用系统通知把你叫回来——**让你敢不开完整访问**,不必靠放弃拦截能力来换效率。它不降低 full access 本身的权限风险(它不是沙箱),只是把 ask 模式的等待成本压到接近零。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
16
30
|
> 🔎 想找这个插件?可以搜:`dsh-notify-me`、**消息提醒**、**可操作提醒**、**桌面通知**、**需要你操作**、**回复完成提醒**、**后台完成提醒**(npm 关键词已含以上中英文词)。
|
|
17
31
|
|
|
18
32
|
## 效果预览
|
|
19
33
|
|
|
20
34
|
| Windows 系统通知效果 |
|
|
21
35
|
| --- |
|
|
22
|
-
|  |
|
|
36
|
+
|  |
|
|
23
37
|
|
|
24
38
|
[更新日志](CHANGELOG.md)
|
|
25
39
|
|
|
@@ -36,19 +50,19 @@
|
|
|
36
50
|
|
|
37
51
|
- **启用提醒** 主开关:关闭后不再弹系统通知、不播放提示音、也不改标签页标题;
|
|
38
52
|
- **系统通知 / 提示音 / 音量**:Toast、WebAudio 提示音与音量滑块;
|
|
39
|
-
- **页面打开时也提醒「需要你」**(默认开)与
|
|
53
|
+
- **页面打开时也提醒「需要你」**(默认开)与 **页面打开时也提醒「回复完成」**(默认关);
|
|
40
54
|
- **通知语言**:跟随界面 / 简体中文 / English——决定通知文字与 `🔔 …` 标题标记使用的语言;
|
|
41
|
-
-
|
|
55
|
+
- **测试按钮**:用当前设置立即发一条「需要你」或「回复完成」测试提醒(**不受**上面「页面打开时也提醒」开关限制;「需要你」测试的标题标记约 6 秒后自动消失)。
|
|
42
56
|
|
|
43
57
|
> 需要浏览器通知权限:页面上点一下 → 允许;或地址栏锁 → 站点设置 → 通知 → 允许 → 刷新。
|
|
44
58
|
|
|
45
59
|
## 提醒方式
|
|
46
60
|
|
|
47
61
|
- **系统通知**:Windows 通知中心 Toast(点击可把 DSH 窗口切回前台)
|
|
48
|
-
- **提示音**:WebAudio
|
|
62
|
+
- **提示音**:WebAudio 合成音(「需要你」与「完成」使用不同音型)
|
|
49
63
|
- **标签页标题标记**:有待处理事项时,标题前出现 `🔔 需要你 · …` / `🔔 Action needed · …`
|
|
50
64
|
|
|
51
|
-
本插件是**浏览器层**实现:DSH
|
|
65
|
+
本插件是**浏览器层**实现:DSH 页面需保持打开(最小化/后台即可——那正是它监听的「离开」状态)。
|
|
52
66
|
|
|
53
67
|
## 安装
|
|
54
68
|
|
|
@@ -62,11 +76,11 @@ dsh plugin --profile web add dsh-notify-me
|
|
|
62
76
|
**验证** — F12 控制台执行:
|
|
63
77
|
|
|
64
78
|
```js
|
|
65
|
-
window.__dshNotifyMe.test("done") //
|
|
66
|
-
window.__dshNotifyMe.test("attention") //
|
|
79
|
+
window.__dshNotifyMe.test("done") // 「完成」示例
|
|
80
|
+
window.__dshNotifyMe.test("attention") // 「需要你」示例
|
|
67
81
|
```
|
|
68
82
|
|
|
69
|
-
没反应?九成是:通知权限被拒绝(在页面上点一下 →
|
|
83
|
+
没反应?九成是:通知权限被拒绝(在页面上点一下 → 选「允许」;或地址栏锁 → 站点设置 → 通知 → 允许 → 刷新)、装完没重启 DSH、系统设置里浏览器通知被关。
|
|
70
84
|
|
|
71
85
|
## 控制台高级配置
|
|
72
86
|
|
|
@@ -77,8 +91,8 @@ window.__dshNotifyMe.config // 查看
|
|
|
77
91
|
window.__dshNotifyMe.setConfig({
|
|
78
92
|
enabled: true, // false = 关闭所有提醒(主开关)
|
|
79
93
|
language: "auto", // 'auto' 跟随界面 | 'zh' 简体中文 | 'en' English
|
|
80
|
-
attentionHiddenOnly: false, // true =
|
|
81
|
-
doneHiddenOnly: true, // false =
|
|
94
|
+
attentionHiddenOnly: false, // true = 页面可见时「需要你」不提醒
|
|
95
|
+
doneHiddenOnly: true, // false = 页面可见时「完成」也提醒
|
|
82
96
|
toast: true, // 系统通知开关
|
|
83
97
|
sound: true, // 提示音开关
|
|
84
98
|
volume: 0.5, // 音量 0~1
|
package/lib/client.js
CHANGED
|
@@ -295,6 +295,22 @@ window.__ModuleLoader__.load({
|
|
|
295
295
|
if (snippet) body = body + "\n" + snippet;
|
|
296
296
|
fire("done", d.doneTitle, body);
|
|
297
297
|
}
|
|
298
|
+
// Test alerts deliberately ignore the visibility rules (attentionHiddenOnly
|
|
299
|
+
// / doneHiddenOnly): the whole point of a test button is to prove the
|
|
300
|
+
// channel works while you are looking at the page. Only the master switch
|
|
301
|
+
// (and browser notification permission) can stop them. The attention test
|
|
302
|
+
// also drops its title marker again shortly after, so a test never leaves a
|
|
303
|
+
// standing "waiting on you" mark in the tab.
|
|
304
|
+
var TEST_MARK_RELEASE_MS = 6000;
|
|
305
|
+
function testAlert(kind) {
|
|
306
|
+
var d = texts();
|
|
307
|
+
if (kind === "attention") {
|
|
308
|
+
deliver("attention", "DSH · " + d.kind.question, d.testAttention);
|
|
309
|
+
setTimeout(function () { releaseTitleMark(); }, TEST_MARK_RELEASE_MS);
|
|
310
|
+
} else {
|
|
311
|
+
deliver("done", d.doneTitle, d.testDone);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
298
314
|
|
|
299
315
|
// ───────────────────────── state machine ─────────────────────────
|
|
300
316
|
// prevById: per-session-id baseline of what we have already reported.
|
|
@@ -473,7 +489,8 @@ window.__ModuleLoader__.load({
|
|
|
473
489
|
|
|
474
490
|
// ──────────────────────── global control API ─────────────────────
|
|
475
491
|
var api = {
|
|
476
|
-
|
|
492
|
+
// keep in sync with package.json "version" on every release
|
|
493
|
+
version: "1.1.2",
|
|
477
494
|
get config() { return readConfig(); },
|
|
478
495
|
setConfig: function (patch) { return setConfigLocal(patch); },
|
|
479
496
|
resetConfig: function () {
|
|
@@ -482,12 +499,11 @@ window.__ModuleLoader__.load({
|
|
|
482
499
|
return config;
|
|
483
500
|
},
|
|
484
501
|
// manual test; run it after clicking anywhere so permission can be granted.
|
|
502
|
+
// Test alerts fire regardless of the page-open visibility rules.
|
|
485
503
|
test: function (kind) {
|
|
486
504
|
kind = kind === "attention" ? "attention" : "done";
|
|
487
505
|
unlockOnce();
|
|
488
|
-
|
|
489
|
-
if (kind === "attention") fireAttention("question", "", d.testAttention);
|
|
490
|
-
else fireDone("", d.testDone);
|
|
506
|
+
testAlert(kind);
|
|
491
507
|
return "sent " + kind + " (lang=" + effectiveLang() + ", permission=" + ("Notification" in window ? Notification.permission : "n/a") + ")";
|
|
492
508
|
}
|
|
493
509
|
};
|
|
@@ -519,7 +535,7 @@ window.__ModuleLoader__.load({
|
|
|
519
535
|
langAutoNote: "(跟随界面)",
|
|
520
536
|
current: "界面当前语言",
|
|
521
537
|
testTitle: "快速测试",
|
|
522
|
-
testHint: "
|
|
538
|
+
testHint: "用当前设置各发一条测试提醒(不受上面「页面打开时也提醒」开关限制)。",
|
|
523
539
|
testAttention: "测试「需要你」",
|
|
524
540
|
testDone: "测试「回复完成」",
|
|
525
541
|
reset: "恢复默认设置",
|
|
@@ -550,7 +566,7 @@ window.__ModuleLoader__.load({
|
|
|
550
566
|
langAutoNote: " (follows the interface)",
|
|
551
567
|
current: "Current interface language",
|
|
552
568
|
testTitle: "Quick test",
|
|
553
|
-
testHint: "Send one test alert with the current settings.",
|
|
569
|
+
testHint: "Send one test alert with the current settings (not limited by the \"while the page is open\" toggles above).",
|
|
554
570
|
testAttention: "Test \"needs you\"",
|
|
555
571
|
testDone: "Test \"reply finished\"",
|
|
556
572
|
reset: "Restore defaults",
|
|
@@ -636,8 +652,9 @@ window.__ModuleLoader__.load({
|
|
|
636
652
|
function runTest(kind) {
|
|
637
653
|
if (!config.enabled) { setFeedback(t("offHint")); return; }
|
|
638
654
|
unlockOnce();
|
|
639
|
-
|
|
640
|
-
|
|
655
|
+
// Bypasses the visibility rules on purpose: a test must fire while the
|
|
656
|
+
// page is open, otherwise the button proves nothing.
|
|
657
|
+
testAlert(kind);
|
|
641
658
|
var langName = effectiveLang() === "en" ? t("langEn") : t("langZh");
|
|
642
659
|
setFeedback(t("sent") + langName);
|
|
643
660
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-notify-me",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "DSH 桌面消息提醒插件:模型需要你操作(审批/方案确认/提问的可操作提醒)或回复在后台完成时,系统通知+提示音+标签页标题提醒你;可在设置页开关并切换通知语言。Desktop notification & message alerts for DeepSeek Harness web — toasts, sounds and a tab-title marker when the agent needs your input (approval / plan review / question) or a reply finishes in the background; toggleable from Settings with zh/en notification language.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|