@cowwo/dsh-lookout 0.2.0 → 0.5.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/README.md CHANGED
@@ -12,11 +12,29 @@
12
12
 
13
13
  ### 1. 换图标与角标
14
14
 
15
- 在设置页上传 SVG / PNG / ICO 作为标签页图标,立即生效并持久保存;自动适配安卓 / iOS / 平板的 PWA 图标。未读会话显示**红点**、正在进行的会话显示**黄点**,工作区数字、会话行、左上角、标签页图标都会显示;点数字可打开清单,点条目可定位到侧栏对应会话。还可以把未读数投到系统应用图标角标上(Windows 任务栏 / macOS Dock,需要授予通知权限)。
15
+ 在设置页上传 SVG / PNG / ICO 作为标签页图标,上传后立刻写入并持久保存;自动适配安卓 / iOS / 平板的 PWA 图标。未读会话显示**红点**、正在进行的会话显示**黄点**,工作区数字、会话行、左上角、标签页图标都会显示;点数字可打开清单,点条目可定位到侧栏对应会话。还可以把未读数投到系统应用图标角标上(Windows 任务栏 / macOS Dock,需要授予通知权限)。
16
16
 
17
17
  ### 2. 邮件通知
18
18
 
19
- 会话**跑完 / 出错 / 卡住 / 等你审批**时发一封邮件。正文写清是哪个会话,并附一条可点击直达该会话的链接。SMTP 配置、收件人等都在设置页填写。短时间内的多次事件会按队列合并发送,避免轰炸邮箱。
19
+ 会话**跑完 / 出错 / 卡住 / 等你审批**时发一封邮件。正文写清是哪个会话:事件、会话标题、工作区、时间、用时、轮次、会话 ID。SMTP 配置与收件人在设置页填写。
20
+
21
+ **改完要点保存**:邮件通知这一页是显式保存——改字段只是改草稿,点右上角「保存」才写进配置,点「放弃改动」退回上次保存的值。有没存的改动时状态行写着「有 N 项改动未保存」;保存成功后变成「已保存 · N 秒前」;保存失败会保留草稿并写明原因,可以直接重试;如果是别处先改过配置(revision 冲突),页面会自动重读最新一份、你的草稿原样留着,再点一次保存即可。
22
+
23
+ **保存只写配置与授权码**。「发送测试邮件」和「恢复全部默认」不归保存按钮管:前者随时能点、用当前**已经保存**的配置真发一封,按钮旁会写明这一点——草稿里没保存的改动不参与;后者点下去就清空本插件的全部覆盖并立即生效。
24
+
25
+ **发信人就是 SMTP 账号本身**(邮件抬头用固定默认名):插件不保存多份发件身份,不能另挑一个发件人,也不能代发别的地址。
26
+
27
+ **邮件里不含链接**:纯文本版和 HTML 版都没有任何可点的链接,也不带会话地址。想回到那个会话,只能在 DSH 侧栏里自己找——正文里那行会话 ID 就是用来对照的。
28
+
29
+ 发送行为(已经固化在代码里,不需要也不提供调参):
30
+
31
+ - **能触发的事件共 8 类**:完成、出错、卡住、等审批、主动停止、系统中断、命中长度上限、子代理;每类一个开关,默认只开前四类(子代理默认关)。
32
+ - **重复事件只发一封**:同一会话、同一回合、同一种结局只投递一次;重放、重订阅、刷新都不会再发。
33
+ - **同一会话的新回合会顶掉上一封待发邮件**:上一封还在等发时这个会话又动了,就取消旧的那封、只留最新结论——一个会话在同一时刻只有一封待发的信。(回合结束后先等约 1.5 秒,确认没有新回合才发。)
34
+ - **太短的活儿不打扰**:完成事件要求这段任务至少跑了 2 秒。
35
+ - **队列只负责三件事**:串行发送、限流(每分钟最多 10 封)、失败退避重试(间隔 1s / 5s / 15s,最多 3 次)。它不做「把多次事件合并成一封」,也不会跨会话攒信。
36
+
37
+ 发信失败怎么查:插件不再保留任何投递记录,失败会在 DSH 日志里留一行 warn(含邮件标签与错误原文;重试过程中另有「第 N/3 次」的记录);想立刻确认配置能不能发,点设置页顶部判决条上的「发送测试邮件」,它当场返回成败和原始报错。它发的是**已保存**的那套配置;页面上还有没保存的改动时,判决条会直接提示「未保存的改动不参与判定」,先把改动存了再测才是你在草稿里看到的那个结果。
20
38
 
21
39
  ### 3. 显示当前会话 ID
22
40
 
@@ -46,7 +64,12 @@
46
64
 
47
65
  - 图标上传与 PWA / 角标开关
48
66
  - 未读规则、进行中规则的阈值
49
- - 邮件通知:SMTP 主机、端口、账号、密码、收件人,以及「发一封测试邮件」按钮
67
+ - 邮件通知(页面从上到下):
68
+ - **保存组**:右上角的状态行(「有 N 项改动未保存」/「已保存 · N 秒前」/「保存失败:…」)加上「保存」「放弃改动」,这一页唯一的写盘入口;改字段不会立刻生效
69
+ - **判决条**:顶部那条唯一的填充色横条,一句话判定**已保存的这套配置**能不能发信以及不能的原因,旁边给补配置的入口和「发送测试邮件」(随时可点,用已保存的配置;有未保存改动时读数提示「未保存的改动不参与判定」)
70
+ - **收件人**:收件人清单,格式不对就地标红
71
+ - **怎么发**:SMTP 主机 / 端口 / 加密方式 / 账号 + 授权码(不是邮箱登录密码),顶部 6 家常见邮箱预设点一下就填好
72
+ - **什么时候发给我**:8 个事件开关;「完成」下面标着固定门槛(不足 2 秒不打扰),默认关掉的 3 类收在「还有 3 种情况」折叠层里
50
73
  - 会话 ID 显示开关
51
74
  - 文件行 ⋯ 菜单开关
52
75
  - 工作区管理(标签 / 颜色 / 置顶 / 隐藏,以及「清理失效项」)
@@ -57,16 +80,19 @@
57
80
  | --- | --- |
58
81
  | 图标、未读规则 | `$DSH_HOME/custom-favicon/` |
59
82
  | 工作区偏好 | `$DSH_HOME/custom-favicon/workspace-prefs.json` |
60
- | 邮件账本(投递记录) | `$DSH_HOME/dsh-notify-p/state.json` |
61
- | 邮件配置 | `$DSH_HOME/settings.yaml` 的 `dsh-notify-p` 段 |
83
+ | 邮件配置 | 当前 profile 的 `cordis.patch.yml`(`$DSH_HOME/profiles/<profile>/`)里入口 `lookout` 的 `config`;授权码走凭据库,配置里只存引用名 |
62
84
 
63
- (`$DSH_HOME` 未设置时回退到 `~/.dsh`。)
85
+ (`$DSH_HOME` 未设置时回退到 `~/.dsh`。)邮件通知不落盘投递记录:发信成败只看日志。
86
+
87
+ 设置页按**配置指纹**认领命名空间:打开页面时读 `settings.describe()`,`value` 里同时有 `smtpHost` 与 `smtpPasswordRef` 的那一项就是本插件,认领到的 `ns` 就是 profile 的**入口 id**(本机是 `lookout`),不再写死 `dsh-notify-p`,换 profile、改入口 id 都不会失联。之所以不按 schema 认领,是因为 `describe()` 给的 schema 只是 `schema.toJSON()` 快照(只有 uid / refs),看不到字段名与类型。**已知限制**:指纹只认配置、匹配时取第一个命中,同一 profile 里并排装两份同源插件会被认成同一份,页面只对着第一条读写。旧的 `$DSH_HOME/settings.yaml` 已由 DSH 导入后改名为 `settings.yaml.imported`,只作历史证据,插件不再读它。
64
88
 
65
89
  ## 开发提示
66
90
 
67
- 包内 `lib/icon/**`、`lib/notify/**`、`lib/session/**` 是三份原插件代码的**逐字节副本**,用于保证合并前后行为一致。
91
+ 包内 `lib/icon/**`、`lib/notify/**`、`lib/session/**` 原本是三份原插件代码的**逐字节副本**,用于保证合并前后行为一致。**现在 `lib/notify/` 已经不是逐字节副本**:本次修 Settings 集成(导出 `Config`、字段标 `.volatile()`)改过 `lib/notify/config.js` 与 `lib/notify/index.js`;`lib/icon/**`、`lib/session/**` 仍是副本。
92
+
93
+ **要改功能逻辑,请改这三个目录**;根部的 `lib/index.js` 只是把三者组装起来的胶水层。
68
94
 
69
- **要改功能逻辑,请改这三个目录**;根部的 `lib/index.js` 只是把三者组装起来的胶水层。`test/fixtures/*.client.js` 同样是原插件浏览器半边的逐字节副本,只供测试做包含断言,不要改。
95
+ `test/fixtures/*.client.js` 也是原插件浏览器半边的副本,只供测试做包含断言,原则上不要改。**例外**:本次为保证合并契约同步改过 `test/fixtures/notify.client.js`;改夹具后必须同步重建 `client/client.js`,否则夹具与产物对不上,断言会假通过。
70
96
 
71
97
  ## 测试
72
98