dsh-bili-scroll 2.0.2 → 2.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/AGENTS.md CHANGED
@@ -42,12 +42,14 @@
42
42
 
43
43
  ## 仓库结构(改代码时看这里)
44
44
 
45
- - `index.js` —— host 半端:11 个工具 + 谷时定时器 + HTTP 接口 + 配置(`config.json` 与 DSH 原生设置页**逐字段对账**:见 `loadCfg` / `saveCfgHost`)+ 值班轮的工具白名单(`mcpWhitelist` → `BILI_MCP_TOOLS`)
45
+ - `index.js` —— host 半端:13 个工具 + 谷时定时器 + HTTP 接口 + 配置(`config.json` 与 DSH 原生设置页**逐字段对账**:见 `loadCfg` / `saveCfgHost`)+ 值班轮的工具白名单(`mcpWhitelist` → `BILI_MCP_TOOLS`)
46
46
  - `client.js` —— 浏览器半端:设置页(注册在 `settings.section`)
47
47
  - `lib/` —— 状态目录与家目录 / 极小的 MCP stdio 客户端 / 扫码登录 / **`hostdeps.mjs`(从宿主树取 `@deepseek-ai/*`,拿不到就退到自己依赖 / 本地等价实现)** / **`verify.mjs`(评论发出后复核)**
48
48
  - `prompts/duty.md` —— 一轮要做的事(判定口径 + 红线,**用户可以改**);升级规矩见 `lib/state.mjs` 的 `ensureCharter`(用户改过 ⇒ 保留他那份、新版落 `duty.md.new`)
49
49
  - `vendor/bilibili-mcp/` —— 内置的 Python MCP(MIT,AGI_Ananas)
50
50
  - `selfcheck.mjs` + `tools/` —— 本地预检:`node selfcheck.mjs`(**现在不用解析钩子了**;`tools/register.mjs` 那条还留着当备份)
51
+ · `tools/check-vision.py` —— 看图纯函数的回归检查(不联网)。动了 `_https` / `_cover_url` / `_snapshot_entries` / `_crop_tile` 就跑一次:
52
+ `<家目录>/.venv/Scripts/python.exe tools/check-vision.py`(用插件自己的 venv,里面才有 Pillow)
51
53
 
52
54
  ## 约定
53
55
 
package/CONTRIBUTORS.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # 外部贡献与致谢
2
2
 
3
3
  这个插件的一些修复,最初的判断或实现来自社区。**这里只列代码/修法被采纳、并写进提交 `Co-authored-by` 的人**
4
- (只有这几位会计入 GitHub 的贡献者名单);其余只提了问题或线索的朋友,我在各条 PR / issue 下另行道谢,不列在这里。
4
+ (整包合入的 PR 作者由 git 历史自动计入);其余只提了问题或线索的朋友,我在各条 PR / issue 下另行道谢,不列在这里。
5
5
 
6
6
  | 人 | 采纳了什么 |
7
7
  |---|---|
@@ -9,6 +9,10 @@
9
9
  | [@Rookiexg](https://github.com/Rookiexg) | headless overlay 要补 `agent-default-model`,否则账号登录的机器会 `MISSING_CREDENTIAL`(PR #50) |
10
10
  | [@383891598](https://github.com/383891598) | yt-dlp 的进度条会污染 stdout,导致"输出非空 = 成功"恒真(PR #23,部分采纳) |
11
11
 
12
+ | [@Annoias](https://github.com/Annoias) | **看画面**:bili_cover / bili_frames 两个工具(用 B站 故事板裁帧、不下视频)+ 章程「什么时候该看画面」+ 看图纯函数自检(**PR #92,已整包合入**) |
13
+ | [@Anguis-L](https://github.com/Anguis-L) | **同源检查要比端口**(只比 hostname 会让本机别的端口的页面驱动写接口)+ 栅栏入参按契约传 headers(PR #94 的思路,已在自己的实现里采纳) |
14
+ | [@LUOXI23333](https://github.com/LUOXI23333) | **值班轮最小权限 profile + 窄口 IO 工具**的整体思路(issue #96 / PR #97)——这版按这个思路独立实现,取舍写在 #96 的回复里 |
15
+
12
16
  ## 关于"为什么不整包合 PR"
13
17
 
14
18
  这个仓库的做法是**一条一条读、把修法自己在 main 上实现**,而不是整包合并 —— 这样发布节奏在自己手上、出问题好定位回滚。
package/README.md CHANGED
@@ -21,7 +21,8 @@
21
21
  ## 它做什么
22
22
 
23
23
  - 按你填的关键词(留空则用内置那几组)搜近几天的视频
24
- - **逐条读字幕原文再判断**(不看摘要);没字幕的直接跳过 —— 除非你开了「本地转写」
24
+ - **逐条读字幕原文再判断**(不看摘要);没字幕的**演示类**视频会先从 B站 自带的故事板**抽几帧看画面**;
25
+ 实在读不到内容才跳过 —— 或者你开了「本地转写」
25
26
  - 写一份 Markdown 报告到 `out/<日期>.md`:每条含「为什么值得」+「它自己的一句话」;每条的段首固定写成 `### BV号` —— 插件数今天挑了几条,数的就是这些标题行
26
27
  - 开着「自动评论」时,每轮发一条评论、**@ 你**一次(默认每轮 1 条,设置页可调到每轮最多 20 条)
27
28
  - 可以在**峰谷时段自动跑**(DeepSeek 的优惠时段),省 token
@@ -115,9 +116,18 @@ dsh plugin --profile web add github:c1overzz/dsh-bili-scroll
115
116
  - 那一轮的**工作目录 = 插件自己的家目录**(它被沙箱关着,只写得了自己那一亩三分地);
116
117
  ⭐ 你填的**工作区里的 `AGENTS.md` 由插件读进来、内联进提示词** ⇒ **它按你的设定说话**,
117
118
  而不是用一套通用人格
118
- - ⭐ **那一轮拿不到整台工具**:只给它**四个只读的**(搜视频 / 读字幕 / 读评论 / 看视频信息),
119
+ - ⭐ **那一轮拿不到整台工具**:只给它**六个只读的**(搜视频 / 读字幕 / 读评论 / 看视频信息 / 看封面 / 看画面帧),
119
120
  开了「自动评论」或「回复评论」才多给一个**发评论** —— 上传视频、发动态、私信、抓全站那些**根本不注册**,
120
121
  模型连它们的名字都看不到
122
+ - 🔒 **那一轮没有文件系统、没有命令、没有联网**(2026-10-24 起):它跑在一个**专用 profile** `bili-duty` 上 ——
123
+ 工具只留 B站 MCP + 几只"窄口"的(写日报 / 记判重表 / 查判重表 / 写归档 / 转写),
124
+ **路径全部由插件定死,不接受路径参数**。这样即便哪天视频标题、评论、弹幕里塞了奇怪的东西,
125
+ 它也**读不到**你这台电脑上的别的东西 —— 以前那个 profile 是带文件系统**读**权限的
126
+ (DSH 的沙箱只限制写、不限制读,这是真事)。
127
+ 万一专用 profile 铺不上,会**明确退回普通 headless 并在日志里说一句**,不会静默降级。
128
+ - **看封面 / 看画面帧需要宿主支持图片**:宿主得提供 `attachments`(存图)和 `llm`(查模型能不能看图)。
129
+ 缺任何一个就**退化成文字说明**(返回里 `image_attached: false` + `image_skip_reason`),
130
+ 其余功能照常 —— 所以这两个服务不在插件的 `inject` 里。
121
131
  - ⭐ **值班章程(`prompts/duty.md`)升级的规矩**:插件记着「上次铺的是哪一版」(`charter.sha256`)——
122
132
  你**没改过**就跟着插件自动升级;**改过**就保留你那份、把新版另存成 `duty.md.new`(日志里会说一句),自己合一下。
123
133
  ⚠️ **从 0.1.5 及以前升上来的第一次没有账本可比** ⇒ 保守地当成「你改过」:新版落成 `duty.md.new`;
package/client.js CHANGED
@@ -646,6 +646,13 @@ function WatchTab() {
646
646
  on: Boolean(dmWatch),
647
647
  onChange: (v) => { setDmWatch(v); patch({ dmWatch: v }, '私信双向') },
648
648
  }),
649
+ // ⭐ 2026-10-23:**不加新输入框**,只把"它认谁当主人"显示出来 —— 填错当场看得见 ✓
650
+ (st.ownerInfo && dmWatch) ? h('div', { 'data-bd-note': '' },
651
+ '它会认这个人当主人:',
652
+ (st.ownerInfo.name ? st.ownerInfo.name + ' · ' : ''),
653
+ 'uid ' + st.ownerInfo.uid,
654
+ st.ownerInfo.self ? '(就是现在登录的这个号)' : '',
655
+ ' —— 想换人,改上面那个「要 @ 谁」就行') : null,
649
656
  h(ToggleRow, {
650
657
  label: '本地转写没字幕的视频',
651
658
  note: '默认关;开了以后,没字幕的视频会在本机转写一遍(不花 API 钱)',
@@ -680,6 +687,11 @@ function WatchTab() {
680
687
  placeholder: '想让它怎么说话就写在这儿 —— 比如「叫我某某,说话简短点,别用 emoji」。也可以直接填一个文件路径(如 D:\\deepseek\\AGENTS.md,或它所在的那个目录),每次运行都会重新读那个文件。留空 = 按中性说话(不扮演任何人)。',
681
688
  value: persona ?? '', onChange: (e) => setPersona(e.target.value),
682
689
  }),
690
+ // ⭐ 2.0.5(issue #89):把人设字数亮出来 —— 超 40000 只送前 40000、超 60000 保存就截,得让用户自己看得见
691
+ h('div', { 'data-bd-note': '' },
692
+ '字数:' + String(persona ?? '').length
693
+ + (String(persona ?? '').length > 40000 ? '(⚠️ 超过 40000,超出的部分不会生效)' : '')
694
+ + (String(persona ?? '').length > 60000 ? '(⚠️ 超过 60000,保存时会被截断)' : '')),
683
695
  h('div', { 'data-bd-note': '' },
684
696
  (st.personaFromWs && String(persona || '').trim() === '')
685
697
  ? '你现在还是用「工作区」里那份 AGENTS.md 说话的(照旧生效)。想把它搬到这儿改,就把上面的路径填成本机那个目录。'