dsh-deepmoyu 2.3.0 → 2.4.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.
Files changed (90) hide show
  1. package/AGENTS.md +93 -153
  2. package/CHANGELOG.md +36 -0
  3. package/CONTRIBUTING.md +51 -0
  4. package/CONTRIBUTORS.md +3 -7
  5. package/NOTICE.md +3 -3
  6. package/README.md +143 -81
  7. package/SECURITY.md +21 -0
  8. package/assets/screenshots/memory.png +0 -0
  9. package/assets/screenshots/menu.png +0 -0
  10. package/assets/screenshots/workspace.png +0 -0
  11. package/client.js +1404 -441
  12. package/cordis.patch.yml +1 -1
  13. package/docs/ASSETS.md +25 -0
  14. package/docs/DEPLOYMENT.md +102 -0
  15. package/docs/PRIVACY.md +32 -0
  16. package/docs/RELEASE_AUDIT.md +70 -0
  17. package/docs/RELEASING.md +94 -0
  18. package/docs/TEST_MATRIX.md +77 -0
  19. package/docs/assets-permissions.json +20 -0
  20. package/docs/tool-evidence.json +196 -0
  21. package/index.js +1095 -285
  22. package/lib/asr.py +41 -35
  23. package/lib/background-output.mjs +64 -17
  24. package/lib/background-tools.mjs +1 -0
  25. package/lib/companion.mjs +43 -0
  26. package/lib/config-policy.mjs +20 -0
  27. package/lib/favops.py +9 -2
  28. package/lib/ids.mjs +41 -0
  29. package/lib/login-session.mjs +34 -0
  30. package/lib/login.mjs +5 -4
  31. package/lib/mcp.mjs +3 -2
  32. package/lib/memory-center.mjs +74 -0
  33. package/lib/mode.mjs +6 -7
  34. package/lib/model-relay.mjs +5 -4
  35. package/lib/open-directory.mjs +93 -0
  36. package/lib/pace.mjs +92 -12
  37. package/lib/persona.mjs +46 -0
  38. package/lib/product-status.mjs +123 -0
  39. package/lib/prompts.mjs +40 -5
  40. package/lib/pv-production.mjs +280 -0
  41. package/lib/pv-session.mjs +316 -0
  42. package/lib/pv.mjs +398 -306
  43. package/lib/pv.py +84 -22
  44. package/lib/pv_cover.py +108 -26
  45. package/lib/pv_editorial.py +336 -0
  46. package/lib/pv_verify.py +267 -0
  47. package/lib/python-env.mjs +61 -0
  48. package/lib/reply.mjs +10 -3
  49. package/lib/run-settings.mjs +6 -0
  50. package/lib/sticker-automation.mjs +5 -4
  51. package/lib/sticker.mjs +135 -25
  52. package/lib/tool-scope.mjs +65 -0
  53. package/lib/update.mjs +265 -0
  54. package/lib/uvfetch.mjs +165 -153
  55. package/lib/verify.mjs +111 -127
  56. package/marketplace/pyyxzi__dsh-deepmoyu.yml +7 -0
  57. package/package.json +23 -12
  58. package/presets/deepmoyu.patch.yml +1 -1
  59. package/prompts/duty.md +4 -3
  60. package/screenshots.json +5 -0
  61. package/selfcheck.mjs +21 -6
  62. package/vendor/bilibili-mcp/requirements.in +9 -0
  63. package/vendor/bilibili-mcp/requirements.txt +1936 -11
  64. package/vendor/bilibili-mcp/runtime_guard.py +35 -10
  65. package/lib/__pycache__/pv.cpython-310.pyc +0 -0
  66. package/lib/__pycache__/pv_cover.cpython-310.pyc +0 -0
  67. package/tests/automation-routes.test.mjs +0 -183
  68. package/tests/automation.test.mjs +0 -79
  69. package/tests/background-tools.test.mjs +0 -182
  70. package/tests/background-window.test.mjs +0 -75
  71. package/tests/dup-cross-channel.test.mjs +0 -158
  72. package/tests/manual-browsing.test.mjs +0 -671
  73. package/tests/mcp-restart.test.mjs +0 -131
  74. package/tests/memory-chain.test.mjs +0 -413
  75. package/tests/model-relay.test.mjs +0 -116
  76. package/tests/persona.test.mjs +0 -67
  77. package/tests/pet-run-routes.test.mjs +0 -127
  78. package/tests/pet-run-settings.test.mjs +0 -38
  79. package/tests/pet-session.test.mjs +0 -125
  80. package/tests/pv-stage1.test.mjs +0 -203
  81. package/tests/sticker-routes.test.mjs +0 -141
  82. package/tests/sticker-upload-routes.test.mjs +0 -97
  83. package/tests/sticker-upload.test.mjs +0 -122
  84. package/tests/sticker.test.mjs +0 -169
  85. package/tests/test_guard_cross_channel.py +0 -141
  86. package/tests/test_pv_cover.py +0 -95
  87. package/tests/test_pv_stage1.py +0 -250
  88. package/tests/test_reply_pictures.py +0 -255
  89. package/tests/token-ledger.test.mjs +0 -78
  90. package/tests/verify_pv_sample.py +0 -91
package/AGENTS.md CHANGED
@@ -1,153 +1,93 @@
1
- # 给 AI 助手看的(本仓库 = 一个 DSH 插件)
2
-
3
- > ## 🐋 这是什么
4
- > 本包 = **`dsh-deepmoyu`(DeepMoYu · 鲸鱼摸鱼)**,从 **`dsh-bili-scroll` 0.1.19** 分叉而来(上游
5
- > [c1overzz/dsh-bili-scroll](https://github.com/c1overzz/dsh-bili-scroll),MIT)。当前版本 `2.3.0`。
6
- > **所有自动更新通道已整个删除**:`/api/bili-duty/upgrade`、`/api/bili-duty/update` 两条路由、
7
- > `runUpgrade()`、`upgrading` / `lastUpdateSource` / `ghUpdateCache` / `updateCache` 四个变量、
8
- > 设置页的「检查更新」「升到 vX.Y.Z」两个按钮 —— 全没了。
9
- >
10
- > **为什么删**:那个按钮会让宿主跑 `dsh plugin add`,把包目录重装成上游原版,而本分叉的所有改动都在包目录里。
11
- > 2026-10-21 真发生过一次(m17605),恢复花整整一轮。
12
- >
13
- > ⇒ **本机这份分叉安装**(`D:/A_four_2/大肥鱼/plugin/dsh-dafeiyu`,工作区目录名仍沿用历史代号 `dsh-dafeiyu`)**绝对不要**跑 `dsh plugin add` / 点任何更新按钮;要升级只能从 `devtools\backups\plugin-ours-*` 手动覆盖。
14
- > ⇒ 它在本机是**本地包**:profile 里靠 `dependencies: "dsh-deepmoyu": "file:D:/A_four_2/大肥鱼/plugin/dsh-dafeiyu"` +
15
- > `node_modules` 里的 junction + `cordis.patch.yml` 的 `- id: dafeiyu` 接进去。
16
- > (从 npm/GitHub 正常安装本插件的其他用户**可以**用 `dsh plugin add dsh-deepmoyu`,见 README。)
17
-
18
- `dsh-deepmoyu`(插件名「**DeepMoYu · 鲸鱼摸鱼**」,模式名「🐟 鲸鱼摸鱼模式」):每天替用户刷一轮 B 站 —— 搜、**读字幕原文**判断、写一份日报,特别值得的会发一条评论 **@ 用户**。也可以在鲸鱼摸鱼模式下**在这个对话里一轮接一轮地刷**(不另起进程)。
19
- **内部代号说明**:cordis 入口 id / agent preset id / HTTP 路由(`/feiyu`、`/pet/*`)/ 工具名(`bili_feiyu`)/ 状态文件(`feiyu.json`)仍用历史代号 `dafeiyu`/`feiyu`——改名只动身份与显示层,内部标识保持不变以兼容既有运行数据与会话。
20
-
21
- ## 排查「发不出去」时,先看这三处(2026-10-21 两个真 bug 换来的)
22
-
23
- 1. **`activity.jsonl` 里那句「没成」的原文**是判据,别只看工具回执:
24
- - `name 'key_video_reply' is not defined`(或 `key_opus_reply` / `key_dm_reply` / `legacy_dm_keys` / `legacy_opus_keys`)
25
- ⇒ `vendor/bilibili-mcp/mcp_server.py` 的 import 块漏了 `runtime_guard` 的判重键函数。
26
- **改 vendor 那一份**(家目录那份每次加载会被 `ensureHomeFiles` 按内容覆盖回去),
27
- 并同步 `devtools/patch_mcp_guard.py` 的 `BLOCK_A`,不然重跑补丁会把 bug 写回来。
28
- - `12014 发送失败,已达到当前评论发送上限` ⇒ **不是插件坏了**,是这个号的评论额度用完了
29
- (按账号算,跨天也未必立刻恢复)。必须回 `guard_status: "rejected"` + `retry_blocked: false`;
30
- 要是回成 `unknown` / `already_replied: true`,说明 `_guarded_send` 的 `reject_codes` 少了 12014,
31
- 那条判重键会被**永久毒死**,得去 `runtime-guard.sqlite3` 里把 `status='unknown'` 的行清掉。
32
- 2. **12014 只掐视频评论**:同一分钟 `bili_reply_opus` / `bili_dm_reply` 照样能发(2026-10-21 实测)。
33
- `lib/pace.mjs` 的 `QUOTA_SCOPES` 只管 `comment` + `reply`,**别把 `opusReply` / `dm` / `moment` 塞进去**,
34
- 塞了就是白白停掉三条通的通道。
35
- 3. **改完 JS(`index.js` / `client.js` / `lib/*.mjs`)必须重启 DSH**:ESM 模块已缓存,
36
- 宿主不会重新 `import`,`patchReload: live` 只重算 patch 层。Python 侧(`mcp_server.py`)不用重启 DSH,
37
- 杀掉 python 子进程,下一次工具调用就会重 spawn 读新文件。
38
-
39
- ## 帮用户安装时,按这个顺序
40
-
41
- 1. **前提**:机器上有 `Python 3.10+` **或** `uv`(有一个即可)。
42
- 两个都没有**也不用让用户先装** —— 插件点「装依赖」时会**自己下一份 `uv` 到自己的家目录**(免管理员、不用 PATH);
43
- 只有它自己也下不动时(网络到不了 GitHub / 加速代理 / PyPI 镜像),才需要引导用户手动装。
44
- · 它是**直连 GitHub → 国内加速代理 → PyPI 镜像**依次试的,并且会**核对官方 sha256** ✓
45
- · ⚠️ 若用户机器上的**杀软拦了这次下载**:让他把 `%USERPROFILE%\.dsh\bili-duty\bin\` 加白,或干脆自己装 uv / Python 3.10+ ✓
46
- · ⭐ **万一下载链路都不通**(有用户反馈"桌面版上这条链路经常不通"):**手动放一份 `uv.exe` 到 `<家目录>\bin\` 就行**
47
- —— 插件会**用那一份、跳过下载** ✓(他 `PATH` 里本来就有 `uv` 的话,直接用那个 ✓)
48
- 2. **接进 profile**(本地包,**不要用 `dsh plugin add`**):
49
- · 改 `profiles/web/package.json`:`dependencies` 加 `"dsh-deepmoyu": "file:D:/A_four_2/大肥鱼/plugin/dsh-deepmoyu"`,
50
- `dsh.profile.bundles` 里加 `"dsh-deepmoyu"`
51
- · `node_modules` 建 junction:`cmd /c mklink /J "<prof>\node_modules\dsh-deepmoyu" "D:\A_four_2\大肥鱼\plugin\dsh-deepmoyu"`
52
- (⚠️ `mklink /D` 符号链接要管理员权限,会失败;必须用 `/J`)
53
- · `cordis.patch.yml` 里把条目改成 `- id: dafeiyu` / `name: dsh-deepmoyu`(config 原样保留)
54
- 3. ⚠️ **提醒用户重启一次 dsh**(必须,bundle 层要重启才组装)。
55
- 4. 让用户**点右下角那只桌宠 → 设置 →「账号与环境」**:点「**装主依赖**」→ 点「**扫码登录**」(手机扫码,选"记住我 / 长期")。
56
- · ⚠️ 2026-10-26 起**DSH 的「设置」里已经没有「刷B站」这一页了**(使用者要求:鲸鱼摸鱼的设置不进默认设置)。
57
- 所有入口都收在桌宠身上:**单击鱼(或右键鱼)→ 菜单 → 设置**。工作台侧栏九项:偏好与桌宠 / 运行方式 / 互动与投递 / 表情收藏 / 学习与记忆 / token 账本 / 运行日志 / 日报视频 / 账号与环境。
58
- 新开会话刷、后台与定时聚合在「运行方式」,活动与事件在独立「运行日志」,学习与 soul 在「学习与记忆」。
59
- 桌宠藏起来之后,右下角会留一个 20px 的小圆点,点它把鱼叫回来;「偏好与桌宠」里也有「显示桌宠」开关。
60
- · ⚠️ 菜单卡、各面板、toast 都是 `[data-bd-pet]`(128×128 的鱼盒)的**后代**,不是兄弟 ——
61
- `[data-bd-pet-card]{bottom:calc(100% + 14px)}` 靠它当定位参照。挂到外层那个 0 高的包装 div 上,
62
- 卡片会被算到 `y<0` 的屏幕外,表现就是"点桌宠没反应"(2026-10-26 真踩过,见 `devtools/check-menu-dom.cjs`)。
63
- 同理,`cursor/touch-action/user-select/transform` 这些"手感"规则一律锁在 `[data-bd-pet-fish]` 上,
64
- 落到 `[data-bd-pet]` 会被卡片继承(菜单文字不能选、弹窗里不能滚、鼠标停在弹窗上鱼还在放大)。
65
- · 装完可以用「账号」页的「**测一下**」自检:它真跑一次登录检查 + 一次搜索,直接回答"能不能用"。
66
- 5. **别擅自打开「自动评论并 @ 你」** —— 那是拿用户的号说话;要用得让用户自己填「要 @ 谁」。
67
-
68
- ## ⚠️ 已知环境差异(有用户反馈)
69
-
70
- - ⭐⭐ **桌面版 DSH(NEXT)/ 0.2.x 装不起来 —— 已知真 bug,0.1.4 起已修**:0.1.3 及以前装到桌面版上,
71
- 设置页里**根本不出现「刷B站」**,DSH 只留一句 `warning: 1 entry did not activate … failed to import` ✓
72
- (根因:宿主半 import 的 `@deepseek-ai/schemastery` / `dsh-tools` 是 *optional peer*,而桌面版 profile 是
73
- `autoInstallPeers: false` ⇒ pnpm 永远不装;`dsh-tools` 自己还带 4 个 peer,光装它也救不回来 ✗)。
74
- ⇒ **本分叉版已含这个修法**(不再裸 import `@deepseek-ai/*` —— `lib/hostdeps.mjs` 先找宿主那棵树、
75
- 再退到自己依赖里那份,`defineTool` 拿不到就用**本地等价实现**;`schemastery` 正式进了 `dependencies` ✓)。
76
- 还不行就要 `duty.log` 里那几行(里面会写"宿主依赖是从哪儿取的" ✓)。
77
- - ⭐⭐ **桌面版(Electron / 不是 npm 全局安装)上"跑一轮 0.17 秒就结束、code=0、什么都没干" —— 0.1.6 起已修**
78
- (issue #5 / #6 / #7,三个人报的):根因是 Electron 里 spawn 的 node 少了 `ELECTRON_RUN_AS_NODE=1`,
79
- 而且 `dsh` CLI 在桌面版里不在 PATH 上。现在会带那个环境变量、并去应用目录里找 dsh;
80
- **还找不到就在 `duty.log` 里明说"请在设置里把 dsh 路径指过去"**(不再静默失败)。
81
- ⇒ 本分叉版已含这个修法(带 `ELECTRON_RUN_AS_NODE=1`、并去应用目录里找 dsh);还跑不起来就要 `duty.log` 里那几行。
82
- - **桌面版上"自动跑会卡"**:跑那一轮用的是 `dsh --profile headless --patch <overlay> <prompt>` ——
83
- 有用户反馈桌面版上会卡在那儿。**先确认 dsh 版本与 profile**,别硬跑;跑不起来就先只用手动「现在跑一轮」。
84
- - **别让用户自己去装环境** ✗:插件自带一份 uv 与依赖安装能力,先照上面第 1 条处理。
85
-
86
- ## 仓库结构(改代码时看这里)
87
-
88
- - `index.js` —— host 半端:工具注册、调度、HTTP 接口、配置与每趟后台生命周期。后台模型/工具桥、学习审核、真实 usage 记账与运行事件在此接线。
89
- - `client.js` —— 浏览器半端:**桌宠与九项侧栏设置工作台**。暖白浅蓝、衬线页标题与文字导航,菜单使用无底色 outline SVG;账本由 `PetTokenLedger` 独立渲染并支持截图视图。桌宠无呼吸光圈与贴图发光,保留浮沉与泡泡。
90
- · **PetSettingsModal 吃 `status` prop**:PetRoot 传入 `[st, setSt, fails]`,弹窗开着不再起第二条 /status 轮询;独立渲染没传 prop 时由 `useStatus(5000, paused)` 轮询。hook 顺序固定,不能条件调用。
91
- · 页面 key 为 `basic/run/speech/stickers/learning/ledger/logs/video/other`;`run` 内含 session/background 分段,`logs` 内含 events/activity 分段。`PetOtherSettings` 依 view 拆 learning/environment;学习读取只在学习页启用,离页清理轮询。图库由 `PetStickersPanel` 按需读取,固定区域内滚动,内置区只读。遇图库路由 HTTP 404 时提示完全重启 DSH、暂停自动重试但保留手动重试;不把路由缺失显示成空图库。文件上传由浏览器读取已选图片字节,`POST /stickers/upload` 只接收 base64,不读取用户传来的任意路径。
92
- · **只创建当前页组件树**:不能恢复为预先求值全部 tab 的节点。`PetSettingsView` 以 `React.memo` 隔离父层泡泡/toast 更新;状态 tuple 与 toast 回调保持稳定。`/pv` 只在视频页轮询,图库只在表情页轮询;离页和卸载清理,首次 basic 不请求 pv/learn/stickers。不透明工作台和菜单不做 backdrop blur。
93
- · 普通页使用显式两列 CSS grid,通栏卡用 `data-bd-span="2"`,`data-bd-stack` 仅用于确实同列的分组;偏好页 `data-bd-basic-grid` 四张卡直接放入 grid,长内容按行 stretch,不能用两列独立 stack 造成上下错位。`data-bd-basic-card="pet"` 按内容高度显示,其开关行不使用 `margin-top:auto`,避免为了与邻卡等高制造大片空白。窄屏单列及横向导航。账本不套普通双列。学习列表固定 360px(窄屏 320px),筛选与分页在列表外;日志/活动固定高度并在内部滚动。
94
- · 运行日志轮询 gate 是 `tab==='logs'`;`unchanged` 响应也必须安排下一次 timeout,切页需 cleanup。不能把已知0当未知,也不能把未知计量显示为0。
95
- · 账本契约:`st.tokensTotal` / `st.tokensToday` / `st.totalTokenBudget` / `st.activeDays` / `st.tokenRounds.entries[]`。`tokensUnknown` 显示未计量;已知用量同时有 `unknownRequests>0` 显示部分计量。菜单底部本轮 token 优先读 active `backgroundRun.usage.total`,否则 `feiyu.tokens.thisRun`;`tokTitle()` 只展示称号。
96
- · 不往 `settings.section` 注册,`inject` 为空数组;`apply()` 挂 CSS 与桌宠。测试从 `debugParts` 取 `PetSettingsModal` / `PetRoot` / `PetFish`。旧全页 `Panel` 已删,「显示桌宠」在「偏好与桌宠」。
97
- · ⭐ 2026-10-28「刷多久」语义(使用者原话:应该是刷多久、刷几轮,不是最长多久):后台轮时长是**工作量目标**——`promptFor` 写明「要把本轮时间刷满、一轮接一轮」;`runDuty` 的 close 里若子进程**干净提前收工**(`stopReason==='exit'`、code 0、无 error)且剩余 ≥2 分钟,就 `petLog('bg-continue')` 并自动接力(`opts._chain` ≤ 8 次保险丝,续跑时长=剩余分钟)。学习审核轮、手动停('user')、出错、时限到('time-limit')都不接力。弹窗后台时长兜底标签是「没填时段时,一轮刷几分钟」,E2E 用 `labeled('一轮刷几分钟')` 找它——改名会红。
98
- · ⭐ 2026-10-28 后台「时段」任务(使用者原话:只要是在这段时间,他就一直刷):配置 `backgroundWindowStart/End`(HH:MM,可跨午夜)= **常设指令**——`automationTick` 每一跳用纯函数 `backgroundWindowLaunch(cfg, st, now)`(lib/run-settings.mjs,有单测:段内/免跑牌/跨午夜尾段/边界)决定要不要 `runDuty('bg-window', { windowEndAt })`;`run.windowEndAt` 直接当 `runState.deadlineAt`(提示词会说「刷到几点」)。**配置本身就是持久化**:重启 DSH 不用恢复现场,下一分钟自动接上;「免跑牌」= `state.json` 的 `bgWindowHold`(手动停止时挂到时段结束,`/pet/stop` 写、`statusRev` 有它的位、手动 /pet/start 清)。时段**不进 /pet/start 请求体**(E2E 严格钉死 body),host 从 config 读。
99
- · ⭐ 2026-10-28 拟人包(全部显示层,不碰行为):① `st.petEvent = {at,text,tone}` 是桌宠「说话」统一通道——`petEvent()` 写 state + act 流水,PetRoot 监听 `at` 变化冒 toast(**首见不冒**,ref 从 0 起步);收工小结 `wrapUpLine`(深夜/傍晚/白天分档、翻车如实说、额度停牌说破「后半程只看不发」)、闲聊 `chatterLine`(`idleChatter` 开关,下一次开口时间存 `state.petChatterAt`,2.2~3.5h,定时这跳真要开跑就不聊)。② 时段任务连刷满 3 小时(按 `state.bgWindowSince` 的**墙钟**累计,懒模型单轮很短也能触发)⇒ `restUntil` 抢在接力**之前**算好:接力让路(`willContinue` 与小结/休息三方互斥——接力轮绝不发小结)、只认干净退出(user 停的牌不许缩短)、挂到时段结束前 15 分钟的免跑牌。③ `moodOf()` 从 soul「最近的心情」最后一行关键词推导 curious/content/glum,回落按最近一趟收尾 → `data-bd-pet-mood` 小灯四色。④ `st.attention.reasons`(依赖没装/审核积压 ≥5/额度停牌 >30min)→ aura `attention` 琥珀 + 菜单 footer 指引 + 首次 toast;**优先级在 run/bg 之下、idle 之上**。⑤ 后台子进程 pid 落 `state.bgChildPid`,宿主重启「认领」孤儿:只 ESRCH 探测 + 信标对账,**绝不单参 kill**(pid 复用误伤)。⚠️ PetRoot 有 `if (!pos) return null` 早退——**新 hook 一律挂在它之前**(2026-10-28 真踩过:挂早退后面,render-modal 的 hook 计数闸当场红)。
100
- · ⭐ 桌宠卡片贴缘几何:卡片 `left/right:-4px`(鱼盒 128 宽,贴边时 box 右缘=vw-6)——2026-10-27 之前的 `-8px` 会让卡片静止时戳出视口 2px(check-menu-dom top-right/top-left 真红过)。菜单回归闸等弹出动画(.22s)落定再量几何,别量在过冲半路。
101
- · 右键菜单悬浮预览(`[data-bd-preview]`)复用菜单卡的天蓝设计语言(`#edf8ff` 底、14px 圆角、徽章 eyebrow、虚线分隔、`bdPreviewIn` 入场动画,respect prefers-reduced-motion);内容只用 /status 快照,悬停不发任何请求——这条契约有回归闸盯着。
102
- - `lib/pet-session.mjs` —— 双击/菜单/设置中的新建会话复用同一路径。前端以 `uiWorkspace.selection` 和 `workspaces.list` 提供 `{sourceSessionId,workspaceId?}`,host 校验归属后仅向真实 `sessionController.create` 传 `agentPreset` 与 `workspaceId` 或 `cwd`。`cfg.workspace` 是提示词参考路径,不是执行工作目录;上下文不明且多工作区时不猜。
103
- · 权限从来源 agent 的实际 `sandboxPolicy` / `approval` / `permissionPresets` 读取,通过宿主预设 API/规范会话事件继承;保留 custom 组合和 Auto 身份检查,不接前端权限值、不改 profile/defaults。创建后继承失败返回 `ok:false` 和已建会话 ID,不能继续开刷。
104
- - `lib/hostdeps.mjs` —— 从宿主树取依赖,拿不到才退到本包或本地等价实现;`lib/verify.mjs` 做评论发出后复核。
105
- - `lib/model-relay.mjs` / `lib/model-relay-adapter.mjs` —— headless 通过本机临时能力调用父进程已注册的**原线路**,解决 buddy/xdpool 等只在 web profile 注册导致的 `NO_ADAPTER`。不复制凭证或改装 headless profile,不自动换收费模型。停止先撤销访问能力并中止流,按 `close` 收尾以免漏 stderr 尾部。
106
- - `lib/background-tools.mjs` / `lib/background-tools-mcp.mjs` —— 后台工具复用父进程的开关、质量校验、判重、节奏、活动与学习账本,不直接绕到裸 Python MCP。后台不能伪造 `force`;已排队发送在提交前再检查停止信号。
107
- - `lib/learn-review.mjs` / `lib/learn-review-mcp.mjs` —— 独立审核进程只批准/拒绝本批未变化的 pending 记录并附理由。普通鱼工具不能 approve/reject。失败同批至少 3 分钟重试、退避最多 30 分钟;实际剩余记录不为 0 时,code=0 也不能算整批完成。
108
- - `lib/background-output.mjs` —— 有界 UTF-8 输出解码与脱敏诊断,保留模型、工具和失败进展。正常镜像同步成功不刷屏,错误必须可见。
109
- - `lib/tokens.mjs` —— 每趟任务账本(`token-ledger.json`,最近 120 条):
110
- · 入账点:`feiyuStart` / `adoptFeiyu`(连续 session)、`trackManualBrowsing`(实际内容工具触发的手动 session)、`runDuty`(background,含 schedule/window/review);停止、销毁、blocked 或后台 close 收账。
111
- · 手动识别与人格分开:`browsingTools` 只包含实际 B 站内容读取和互动工具,设置/状态/记忆不算开刷;后台桥接执行不再建立手动账。`agent/status:running` 或 `session/event(session,event)` 的 `turn/start` 捕获请求前基线,首个内容工具开始认领本轮;`turn/end` / idle / disposed 幂等结账,普通预设的真实刷站可以入账但不放开人格/记忆门禁。
112
- · 手动停止使用 `agent.cancel({kind:'user'},{keepInbox:true})`;立即取消活动状态,保留 pending 直到请求退出以补最后 usage。`source:'manual'`、无 goal 的状态也必须在菜单/状态卡/设置/活动显示正在刷。缺投影时 `tokens.thisRun:null`、`tokensUnknown:true`,不能编成0。
113
- · 连续目标按活动分段计量:暂停时结束当前段,恢复时新建基线与明细;暂停间隙闲聊或独立手动刷站不能加到原目标。`resetTokensTotal` 要同时重设活动基线并重建活动明细,清账后不能从0游标回灌整段历史。
114
- · 总量以 `state.json` 的 `tokensTotal` 为准(实际刷站轮次增量 + 后台真实 usage)。明细只展示,**不能拿已裁剪明细加总冒充累计**。
115
- · 桥接只累加每请求最后一个可信 usage 快照,缺失不估算、不按 0 处理。混合有/无 usage 保留已知数并记 `unknownRequests`。旧 `bg-usage.jsonl` 仅兼容回填,不能与桥接重复入账;信标需同时有后台角色和明确 `BILI_DUTY_HOME`。
116
- · 后台 token 预算仍是**软预算**,真实 usage 用于记账;墙钟时限是独立定时器。不要误写成已有后台 token 硬熔断。
117
- · `/status` 与 `/pet/log` 支持 `?rev=`。`statusSnapshot()` 在同次请求复用 state 和镜像 manifest,`statusRev()` 将原变化信号摘要为 64 位十六进制 SHA256;别读 ledger 或扫 activity。保留 token 累计、今日、上限、连击和明细顶层字段,否则会回归累计显示 0。镜像由 `queueMirror()` 合并、延后和节流执行,不能放回同步状态响应路径。
118
- · `GET /diag` 排除凭证,不读 `bili_credential.json`;`resetTokensTotal` 连明细清空但保留上限,跨天重置 `tokensToday`。
119
- - `lib/sticker.mjs` / `lib/sticker-download.mjs` / `lib/sticker-automation.mjs` —— 同一套内置只读与收集图库。自动收集和配图独立开关,默认关闭,概率默认 35% / 30%,冷却 60 / 180 秒,容量 1–60。下载逐跳校验公网地址并固定 DNS,最多 5MB;按内容去重,锁内复查容量和名称并合并账本,不接受客户端任意本地路径。设置页本地上传接收已选文件字节,限 PNG/JPEG/GIF/WebP、单张 5 MB,验证格式后与收集项共用容量、去重和删除规则;仅上传路由可接收至 7 MB JSON,其余接口保持原请求体限制。
120
- · 自动收集异步排队,仅由鱼模式评论图片触发;来源信号和会话范围必须在读取评论前捕获,停止时取消对应下载/排队并在提交前复查,不能取消其他会话或永久停掉后续新趟。`goals.pause` 本身不保证撤销正在运行的工具。
121
- · 自动配图只在允许的新视频评论通过原质量、权限和节奏闸后选择;显式图片优先,显式空字符串保留纯文字。回复楼层、私信和动态不自动配图;不能借配图绕过发送开关。图库 HTTP 接口与 `bili_sticker` 复用库函数,`/status` 不枚举图片。
122
- - `prompts/duty.md` —— 一轮的章程,用户可改;`ensureCharter` 按摘要保护用户版本,新版可落 `duty.md.new`。
123
- - `vendor/bilibili-mcp/` —— 内置 Python MCP(MIT,AGI_Ananas)。
124
- - `selfcheck.mjs` —— 假 ctx 上真实运行两个半端的预检。
125
- - `tests/` —— 统一入口 `npm test`(selfcheck + 全部 `.test.mjs`;包括桥接、停止竞态、真实/部分计量、后台自动审核、工作区归属、权限继承、图库与收集取消回归;数量以本次输出为准)。
126
- Python 那几个单独跑:`python tests\test_guard_cross_channel.py` 等;`verify_pv_sample.py` 是带参数的 CLI,不算用例
127
- - `devtools/check-pet-image.mjs` —— 桌宠贴图那条静态路由的验收(`node devtools/check-pet-image.mjs`):
128
- 绕开浏览器真跑一遍 `index.js` 的 `apply()`,打 `/api/bili-duty/pet/image` 四条用例(200 真图 / 不传 name / 路径穿越 404 / 未知名 404)。
129
- ⚠️ 为什么要它:`pet-shot.cjs` 走 `file://` 直接读磁盘上的 png,**永远看不出路由挂没挂**;
130
- 改了 `index.js` 之后宿主不重启,浏览器那边就是 404 + 静默退回纯 CSS 的鱼。
131
- - `devtools/check-menu-dom.cjs` —— 桌宠菜单的**结构与定位**回归闸(`node devtools/check-menu-dom.cjs`):
132
- 假 React 真渲染 `PetRoot`(从 `debugParts` 取),断言卡片是 `[data-bd-pet]` 的后代、左右键与拖拽处理器挂对地方、
133
- 再右键一次能收起;最后用 chrome headless 量 `getBoundingClientRect`,要求左下/右下两种摆位下卡片都完整落在视口内。
134
- ⚠️ 为什么要它:`render-modal.cjs` 只展开组件树、不做布局,卡片被甩到 `y<0` 那种 bug 它一个字都看不出来;
135
- 截图能看出来但没有断言。改动 `PetRoot` 的渲染结构后**必须**跑这一条。
136
-
137
- ## 约定
138
-
139
- - 配置与运行数据都在用户的 `$DSH_HOME/bili-duty/`,**不写进插件包目录**
140
- - 谷时窗口按 DeepSeek 官方口径:工作日 9–12 / 14–18 是高峰,其余(含周末)都是谷时
141
-
142
- ## 看到工作区根目录那堆 `state.json` / `seen.md` 别当垃圾删
143
-
144
- 它们不是散落的文件,是**记录镜像**(`lib/mirror.mjs` 的 `mirrorOnce` 产出的脱敏投影,
145
- 每轮跑完 + 每次打开桌宠 ⚙️ 设置各同步一次)。名单固定 9 个:
146
- `seen.md` `voice.md` `soul.md` `state.json` `feiyu.json` `duty.md` `charter.sha256` `config.json`(+ heavy 档的 `activity.jsonl`),
147
- 外加一份台账 `_mirror.json`(记 sha256 与来源)。
148
-
149
- - **原件**在 `$DSH_HOME/bili-duty/`,镜像只是给人看的副本;删了下一轮会自动长回来
150
- - 位置就在**工作区根目录**(`lib/mirror.mjs:11` 的 `MIRROR_SUBDIR = ''`)——
151
- 这是 2026-10-21 使用者明确要的「在当前目录也放一份」,**不要**为了"整齐"把它挪进子目录
152
- - 目标目录由 `out/` `digest/` 两个 junction 反推工作区根;两个都没了就退回 `cfg.mirrorDir`,
153
- 再没有就不镜像(桌宠 ⚙️ 设置 →「全部设置」会提示)
1
+ # DeepMoYu 开发约定
2
+
3
+ 本仓库为标准 DSH 插件 `dsh-deepmoyu`,基于 `dsh-bili-scroll` 0.1.19(MIT)。当前包版本以 `package.json` 为准。不要将外层工作区中的个人记录、运行目录或旧发布包复制进仓库。
4
+
5
+ ## 维护本机链接安装
6
+
7
+ 本机运行中的安装可能通过 `file:` / `link:` 或 junction 指向本仓库,并包含未提交改动。**不要对当前本地分叉执行 `dsh plugin add` 或用 registry 更新覆盖源码。** 普通外部用户按 README 正常安装不受此约束。
8
+
9
+ 更新通道(2026-10-30 使用者要求恢复):`GET /api/bili-duty/update` 查 registry 上的最新版,`POST /api/bili-duty/upgrade {confirm:true}` 由设置页按钮触发。它**不是**原来那个裸的重装按钮,`lib/update.mjs` 里三道闸一个都不能删:① 只有 profile 下真实目录(registry 安装)才 `canUpgrade=true`,目录联接/`.git` 源码检出/不在 profile 里的安装一律锁定并给手动办法;② 有刷站、后台、渲染在跑时拒绝;③ 单飞,同一时间只允许一个升级进程。改这一节前先读文件头那段 m17605 的事故注释。
10
+
11
+ 不要擅自重启用户正在使用的 DSH、修改真实 profile / 模型凭证 / 全局权限,或向平台发送真实评论、私信或动态。隔离测试使用独立临时目录、受控服务与合成数据。修改 JS 后需要完全重启 DSH 才能生效,页面刷新与 patch 热重载不会清除模块缓存。
12
+
13
+ ## 仓库与发布
14
+
15
+ - `index.js` 为宿主入口;`client.js` 为浏览器自注册脚本。
16
+ - `presets/deepmoyu.patch.yml` 为模式声明,和 `cordis.patch.yml` 一并由 `dsh.bundle.patch` 加载。
17
+ - `lib/` 为运行模块;`vendor/bilibili-mcp/` 保留上游许可证和发送守卫。
18
+ - `scripts/qa/` 为可移植验收,不依赖上级工作区、其他项目的 node_modules 或个人路径。
19
+ - `scripts/release/` 检查清单、构建归档并验证清洁安装;发布文档在 `docs/`。
20
+ - 更新版本时同步锁文件与 CHANGELOG。npm 版本、GitHub Release 与市场收录分别验证,不能相互替代。
21
+ - 运行数据不得进入源码包;npm 包只带运行文件与用户文档,源码 ZIP 带锁文件、测试、CI 和发布资料。
22
+ - 保留根 MIT 与 vendored MIT 署名。素材权限独立记录在 `docs/assets-permissions.json`,不能用代码许可证推断第三方权利。
23
+
24
+ ## 模式隔离
25
+
26
+ - 角色工具仅注册到已选择鲸鱼摸鱼模式的 `agent.ctx.tools`,禁止根层注册及全局 fallback。
27
+ - 普通、无预设、未知、畸形或已切出模式的会话不获得角色 schema、人格、soul 或已批准学习。
28
+ - 模式判断以宿主选择/会话事件为准;残留鱼 goal 不构成人格授权。
29
+ - 旧工具句柄在执行前重新检查;异步读取返回后、发送或自动动作提交前再次复核。
30
+ - 宿主 goal driver 独立注入 objective;切出模式时和每次执行前阻止本插件拥有的残留鱼目标。不得暂停其他目标、改其他会话模型或权限。
31
+ - 缺少可靠作用域时禁用会话工具,并在 `toolScope` 中报告能力;后台受控桥与 HTTP 工作台可保持独立。
32
+
33
+ ## 会话、后台与用量
34
+
35
+ - 新建会话仅使用真实宿主 API,并校验来源会话、工作区归属与有效权限。
36
+ - 来源的 `sandboxPolicy` / `approval` / `permissionPresets` 按宿主机制继承;不接受前端伪造权限,不改 profile/defaults。继承失败不得继续开刷。
37
+ - 配置中的参考工作区路径不等于执行 cwd;多工作区且来源不明时不猜测。
38
+ - 会话/后台分别保存参数;保存草稿不改变运行中的任务。
39
+ - 后台时长为工作量目标,干净提前结束且剩余时间足够时才接力;手动停止、错误、审核任务、时限到达不接力。保留接力保险丝。
40
+ - 连续时段支持跨午夜。手动停止的暂停状态持续到时段结束,重启调度不得绕过;配置不混入启动请求体。
41
+ - 后台模型桥复用原线路,不复制密钥、不自动换模型;停止先撤销能力并中止流,再等待 close 收尾。
42
+ - 后台 token 预算为软预算,墙钟截止独立计时。usage 只累加每请求最后一个可信快照;缺失不估算、不当 0,混合返回标为部分计量。
43
+ - 累计值以持久状态为准,不能将裁剪后的最近明细相加冒充累计。暂停、恢复与重置基线保持幂等。
44
+ - 孤儿进程按信标与所有权核对,不对仅凭历史 PID 的进程执行 kill。
45
+
46
+ ## 配置、存储与隐私
47
+
48
+ - 所有运行数据写 `<DSH_HOME>/bili-duty/`,不写插件安装目录。
49
+ - 配置与记录使用事务锁和原子写入;文件损坏不等于不存在,不可用空数据覆盖损坏历史。
50
+ - 仅修改本次明确更新的字段,避免锁外旧快照覆盖其他进程的新配置。
51
+ - 布尔权限不得把字符串 `"false"` 转成 true;未知或畸形输入明确拒绝。
52
+ - 登录轮询绑定本次二维码;旧轮询不能覆盖更新的账号或二维码。下载与网络操作有明确超时。
53
+ - 诊断不读凭证文件。隐私参考必须区分本机保存、对 B站的认证请求、模型上下文与在线语音数据流。
54
+ - 记录镜像是用户要求的本地副本,保留工作区根目录语义,不为整齐而静默迁移或删除。
55
+
56
+ ## 发送、审核与表情
57
+
58
+ - 评论、楼层回复、动态回复、私信、动态、成果投递分别授权;不能借通道或后台桥绕过开关。
59
+ - 发送审核批准后仍经过原授权、质量、永久判重、节奏、冷却和额度门禁。结果未知不自动重发。
60
+ - 12014 按已核实的平台评论通道处理,不能误停其他独立通道;不要将平台拒绝毒化为永久已发送。
61
+ - pace 系数只影响下一次成功发送后保存的间隔,不追溯缩短或放大已经锁定的等待。
62
+ - 外部学习先待审;普通角色工具不得自行 approve/reject。撤销批准从后续提示词移除,保留来源与审计。
63
+ - 表情审核开关仅由人工设置入口改变;关闭不放行旧待审。发送绑定已批准的图片字节快照,防删除/重传同名项替换。
64
+ - 上传接收浏览器提供的字节,不读取任意用户给定本地路径;下载逐跳校验公网地址、固定 DNS、限制大小/跳转/格式。
65
+ - 自动收集按会话范围捕获来源,停止时取消对应队列与下载并在提交前复核;不能永久禁用后续新任务或影响其他会话。
66
+ - 内置图库只读;显式空图保持纯文字,楼层回复、私信和动态不自动配图。
67
+
68
+ ## 工作台与性能
69
+
70
+ - 主导航六组:`run/speech/learning/video/logs/basic`,默认 `run`。子页 `stickers→learning`、`ledger/review→logs`、`other→basic`。不要恢复历史九个主入口。
71
+ - 会话和后台启动位于首屏;状态、参数、权限与错误说明使用客观文案,角色实际对话可保留个性。
72
+ - 只构建当前子页,不预求值全部组件;切页重置正文滚动并清理该页轮询。
73
+ - PetRoot 共享 status tuple,弹窗不得重复起 `/status` 请求。status、活动和登录轮询均 single-flight;晚到响应不能回退已保存状态、清屏结果或新的登录。
74
+ - 视频/图库/记忆按页读取,离页清理;404 明确提示重启并暂停自动重试,保留手动重试。
75
+ - 不往 `settings.section` 注入插件设置;浏览器模块返回的 `inject` 为空,apply 仅挂样式与桌宠。
76
+ - 卡片、菜单、预览与 toast 位于 `[data-bd-pet]` 内,以鱼盒定位;cursor/touch-action/user-select/缩放规则只作用鱼本体,不能被面板继承。
77
+ - 不透明面板不加 backdrop blur;保持减少动效与键盘焦点;窄屏及矮窗口菜单在视口内滚动。
78
+ - 所有 hooks 均位于 `if (!pos) return null` 等早退之前。
79
+
80
+ ## 视频
81
+
82
+ - 可见会话制作不替换为无回执的后台假完成。保留来源会话、所选模型、冻结素材和目标终态。
83
+ - 渲染接受后等待实际完成/失败/取消,再将终态回传原会话一次;不取消其他制作任务或会话。
84
+ - 逐句旁白、字幕、口型与时间线一致。成片列表仅加入通过实际音视频校验的产物,失败保留独立日志和计划。
85
+ - 本地 Python 脚本与角色素材通过初始化同步到运行目录,新增辅助脚本要验证运行目录可找到它。
86
+ - 用户章程按摘要保护,不能在升级时覆盖已修改内容。
87
+ - 不打包用户参考音频或 GPT-SoVITS 模型,不将在线语音描述为完全离线。
88
+
89
+ ## 验证
90
+
91
+ 运行 `npm test`、`npm run test:python`、`npm run test:ui`、`npm run test:browser`,以及相应宿主隔离门禁。改变菜单结构必须测真实浏览器定位;改变轮询必须测延迟响应与卸载;改变配置必须测跨实例事务及畸形输入。
92
+
93
+ 发布前运行 `npm run release:check`、`npm run release:build` 和 `npm run release:smoke`,核对当前归档而非旧包。无宿主时明确 skip,显式坏宿主路径失败;不将合成浏览器/模拟平台数据写成真实账号已发送。审查记录列出覆盖范围、命令、实际结果和外部限制。
package/CHANGELOG.md ADDED
@@ -0,0 +1,36 @@
1
+ # 更新记录
2
+
3
+ ## 2.4.2
4
+
5
+ 本节对应当前源码,不能据此推断 npm 或插件市场已更新。
6
+
7
+ - 恢复更新通道:账号与环境页可「检查更新」「升级到最新版」,查询 npm registry 的 dist-tags(默认走 npmmirror,可改成官方源)。
8
+ - 升级带三道闸:只有 profile 下真实目录(registry 安装)才允许一键升级;目录联接、源码检出、不在 profile 里的安装一律锁定并说明手动办法;刷站/后台/渲染运行中拒绝;同一时间只允许一个升级进程。
9
+ - 修复升级失败回执被检查结果覆盖成成功的问题(返回体合并顺序)。
10
+ - 新增 `lib/update.mjs` 与其单元/路由回归:版本比较、packument 解析、安装方式识别、失败原因翻译、日志脱敏。
11
+
12
+ ## 2.4.1(待发布)
13
+
14
+ 本节对应当前源码,不能据此推断 npm 或插件市场已更新。
15
+
16
+ - 工作台合并为六组导航,默认进入运行方式;会话与后台启动位于首屏。
17
+ - 桌宠菜单、工作台及表单统一为天蓝配色,优化窄屏布局与客观状态描述。
18
+ - 角色工具使用会话作用域注册,切出模式撤销工具并暂停本插件拥有的残留摸鱼目标。
19
+ - 新增发送前审核、集中记忆管理、表情人工审核、陪伴偏好、七天回顾与恢复入口。
20
+ - 视频制作使用可见会话编排、本地编辑型渲染和音视频终态校验,保留逐句口型动画。
21
+ - 状态、活动及扫码登录轮询避免并发重入与旧响应覆盖。
22
+ - 修复跨实例配置更新丢字段、畸形布尔配置误开启及旧二维码登录覆盖新状态。
23
+ - 模型配置工具不再修改发送权限、收件人或审核门禁;`force` 参数不构成授权。
24
+ - uv 下载按 CPU 与系统选择归档,使用官方摘要、流式大小限制、超时和独立暂存目录。
25
+ - 视频回执引用持久成片路径,清理编码器管道资源;目标时长不足时要求重新编排内容。
26
+ - 长 UID、评论和消息标识在表单、配置及原始 MCP JSON 中保持精度,不从已舍入数字猜测目标。
27
+ - 可选转写仅清理本次下载,保留本地输入及并发任务;ASR 部分安装、失败、中断和外部链接环境不再误报可用。
28
+ - Windows 目录打开使用隐藏的 ShellExecute 助手,超时不会终止用户的 Explorer 窗口。
29
+ - 主环境要求升级为 Python 3.11–3.13、Pillow 13;显式升级先保留旧环境备份。
30
+ - 增加可移植测试、清洁包安装验证、源码与 npm 归档检查,以及部署和发布文档。
31
+
32
+ ## 2.3.0
33
+
34
+ - 从 `dsh-bili-scroll` 0.1.19 分叉并以 `dsh-deepmoyu` 发布。
35
+ - 增加桌宠、后台时段任务、用量账本、学习与记忆、表情图库和本地日报视频。
36
+ - 移除自动更新入口,保留原项目及 vendored 代码的许可证与署名。
@@ -0,0 +1,51 @@
1
+ # 开发与贡献
2
+
3
+ ## 环境
4
+
5
+ - Node.js 22+、npm、Git。
6
+ - Python 3.11–3.13。可用 `PYTHON` 指定执行文件;建议独立虚拟环境。
7
+ - Chrome 或 Chromium,用于真实 React/浏览器验收;可用 `CHROME_PATH` 指定路径。
8
+
9
+ ```sh
10
+ npm ci
11
+ python -m venv .venv-test
12
+ ```
13
+
14
+ 激活该虚拟环境后安装 `vendor/bilibili-mcp/requirements.txt`。依赖安装需要网络;媒体测试不会使用真实 B站账号。GPT-SoVITS 及其模型不在测试基础依赖中。
15
+
16
+ `requirements.in` 固定已验证的直接依赖,`requirements.txt` 记录 universal 哈希锁。更新依赖时使用其文件头记录的 uv 命令重新生成,并重新执行依赖审计与媒体测试;不要为保留旧 Python 环境降级到已知存在漏洞的 Pillow。
17
+
18
+ ## 测试命令
19
+
20
+ | 命令 | 范围 |
21
+ | --- | --- |
22
+ | `npm test` | host/client 自检与全部 Node 单元/集成回归 |
23
+ | `npm run test:python` | Python 发送守卫、图片发送及视频测试 |
24
+ | `npm run test:mcp` | 真实 Python/FastMCP 握手与本地 SQLite 守卫调用;不读取凭证、不访问平台 |
25
+ | `npm run test:ui` | 完整工作台场景、交互断言、变异测试及源码契约 |
26
+ | `npm run test:browser` | 真实 React 的全部页面、菜单几何、记忆操作与请求竞态 |
27
+ | `npm run test:isolation` | 人格与真实宿主目标驱动隔离;按实际宿主能力执行 |
28
+ | `npm run release:check` | bundle、锁文件、市场资料、截图、授权记录与 npm 文件清单 |
29
+ | `npm run release:build` | 构建并回读校验 npm tarball 和源码 ZIP |
30
+ | `npm run release:smoke` | 临时目录中清洁安装实际 tarball 并运行自检 |
31
+
32
+ Windows 示例:`$env:PYTHON = 'C:\path\python.exe'`;Linux/macOS:`export PYTHON=/path/to/python`。浏览器产物目录可通过 `QA_OUTPUT_DIR` 指定,默认使用系统临时目录。
33
+
34
+ 真实宿主 headless 门禁可用 `node scripts/qa/headless-relay.mjs` 执行,只访问回环模拟服务;会临时解包宿主依赖,空间不足时设置 `DSH_QA_TMPDIR`。不会重装本机插件或修改实际 profile。
35
+
36
+ 不带宿主的 CI 不可假称真实宿主测试通过;提供 `DSH_HOST_ASAR` 时必须指向真实可读取的桌面宿主。显式配置的路径错误应失败。外部 API 使用 fakes 时,报告应明确说明。
37
+
38
+ ## 修改约束
39
+
40
+ - 配置、凭证、状态与媒体产物写入运行目录,不写源码目录。
41
+ - 角色工具只注册到已选中角色的会话作用域;不要增加全局 fallback。
42
+ - 普通会话不获得角色提示词或记忆;停止和清理只操作本插件拥有的任务。
43
+ - 发送授权、审核、判重、节奏和冷却是不同门禁,不能互相代替。
44
+ - 保留源项目及第三方署名;素材与音色的公开分发权限另行确认。
45
+ - 修改 JS 后需完全重启 DSH。本机链接开发安装不应通过 registry 重装覆盖。
46
+
47
+ 详细行为约定见 [AGENTS.md](AGENTS.md)。提交 PR 时说明行为变化、修复前的复现、验证命令和实际限制;不要只报告测试总数。
48
+
49
+ ## 发布
50
+
51
+ 发布需要额外的清单、归档和部署验收,见 [发布指南](docs/RELEASING.md)。CI 不自动向 npm 发布,也不修改 DSH profile 或市场仓库。
package/CONTRIBUTORS.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # 外部贡献与致谢
2
2
 
3
- 这个插件的一些修复,最初的判断或实现来自社区。**这里只列代码/修法被采纳、并写进提交 `Co-authored-by` 的人**
4
- (只有这几位会计入 GitHub 的贡献者名单);其余只提了问题或线索的朋友,我在各条 PR / issue 下另行道谢,不列在这里。
3
+ 以下保留源项目的社区贡献记录,感谢最初提供判断或实现的贡献者。本表为项目署名记录,不代表当前分叉的 GitHub 自动贡献者统计。
5
4
 
6
5
  | 人 | 采纳了什么 |
7
6
  |---|---|
@@ -9,10 +8,7 @@
9
8
  | [@Rookiexg](https://github.com/Rookiexg) | headless overlay 要补 `agent-default-model`,否则账号登录的机器会 `MISSING_CREDENTIAL`(PR #50) |
10
9
  | [@383891598](https://github.com/383891598) | yt-dlp 的进度条会污染 stdout,导致"输出非空 = 成功"恒真(PR #23,部分采纳) |
11
10
 
12
- ## 关于"为什么不整包合 PR"
13
-
14
- 这个仓库的做法是**一条一条读、把修法自己在 main 上实现**,而不是整包合并 —— 这样发布节奏在自己手上、出问题好定位回滚。
15
- 但**采纳的思路照样算贡献**,所以上面这几位写进了提交的 `Co-authored-by`。如果你提的东西被用上了却没在这张表里,开个 issue 说一声,我补上。
11
+ 如需补充或纠正署名,请在仓库 Issues 中附上对应来源。新增贡献应在变更记录或提交中说明来源,不应删除已有许可证与署名。
16
12
 
17
13
  ---
18
- *本文件只做署名,不构成任何额外许可条款。*
14
+ *本文件只做署名,不构成任何额外许可条款。*
package/NOTICE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 第三方代码与署名说明
2
2
 
3
- 本插件(`dsh-deepmoyu` / 刷B站)本体以 **MIT** 协议发布,正文见仓库根目录的 `LICENSE`。
3
+ 本插件(`dsh-deepmoyu` / 鲸鱼摸鱼)的代码部分以 **MIT** 协议发布,正文见仓库根目录的 `LICENSE`。角色素材的来源与公开分发声明见 [素材说明](docs/ASSETS.md)。
4
4
 
5
5
  ## 内含第三方代码
6
6
 
@@ -12,7 +12,7 @@
12
12
  ## 关于版权署名
13
13
 
14
14
  `LICENSE` 第一行写的是 `Copyright (c) 2026 c1overzz`。
15
- 如果你要基于本仓库做二次分发,保留这一行和 MIT 正文即可,不必另行取得授权(MIT 本身就允许改、再发、商用)。
15
+ 二次分发 MIT 代码时应保留这一行及 MIT 正文。图片、参考音频、音色模型和第三方平台内容的权利范围应另外核对,不能由代码许可证推断。
16
16
 
17
17
  ---
18
- *本文件只是说明,不构成额外限制。*
18
+ *本文件只是说明,不构成额外限制。*