Repository navigation
MCP:Agent 能改分拣台、B站稍后再看和 YouTube 收藏;设置里 MCP 单独一节 - #457
Merged
Merged
Conversation
收藏夹的标签后端(tag-store.js local)原来拿页面内存里的标签和视频→标签表当底稿,锁只排队不读存储:别的标签页或后台刚写的、页面还没收到 storage 事件的那次修改,会被页面下一次写入整份盖掉。改成在同一把锁(MdgLimits.keyLock)里先读存储再改,页面副本取写入后的值。清理已出分拣范围的标签也改走这条写入,不再从内存拼整份。 页面原来只在打开收藏夹时读细看结果,现在跟随 triage_analysis_* 的变化,别处写入或删除的结论立刻显示。 测试:tag-store.selftest 加「页面副本没见过的写入保留」「交错写入都落地」,把写入改回读内存时前一条失败。
bridge 和 search 不再写死站点,改问 agent-sites/ 的注册表;新站点一个文件、一个自测、一行 importScripts。 适配器的 read 可以是函数:在桥自己的标签页的页面主世界里运行(chrome.scripting),没有授权时答 NO_ACCESS。
哪些站点能搜由扩展的注册表决定,服务端只查是不是字符串;未知站点由扩展答出可用列表。
从页面 __NEXT_DATA__ 读标题、节目/主播、时长、发布日期、简介和热评。 文稿只给登录的 App 用户,页面里没有,字幕留空,缺字幕原因里给出音频地址, agent 可以拿去转写。自检用一份真实单集页数据(裁剪过)测解析。
新增两个 MCP 工具,对应扩展的 triage、propose 方法(agent-writes.js),默认关,设置页「允许 MCP 连接」下面加从属开关「允许 AI 工具改分拣台」(mcpWrites),关着返回 WRITES_OFF。参数在扩展里整份先查(bvid、收藏夹 id、长度、标签只打在勾选收藏夹自己的视频上),一处不对就什么都不写,返回 BAD_PARAMS。 - set_triage:一次最多 50 个视频,写 AI 判断(存成细看结果,source: agent,卡片标「AI 工具判断」)、保留、备注和收藏夹标签。每个键都走分拣台自己用的那把锁读改写(MdgLimits.update、saveVideoNote、triage_tags 的 keyLock),和打开着的分拣台交错写也不丢。 - propose_fav_change:取消收藏、移动、复制只进待确认队列(triage_agent_proposals,最多 20 条),不碰 B站。分拣台进度胶囊显示「AI 工具的 N 条收藏夹提议等你确认」,「查看」打开来源收藏夹列出视频,确认后走分拣台原有的 unfavMany / transfer(限流、U 撤销照旧),「拒绝」删掉,Esc 留着;有 B站批量在跑时不让确认。不靠 MCP 客户端的权限弹框。 撤销的做法:每次 set_triage 记一条日志(triage_agent_log,最多 20 条),存每个值改前改后。分拣台把每条日志当成 U 栈里的一步(切换收藏夹也保留),按 U 让后台把仍是 AI 工具写的那个值改回去,用户之后又改过的不动并说明几个。日志先取走再还原,同一步不会被撤两次;还原失败放回日志。没选「只加标记」:标记只能让用户自己一个个改回去,算不上撤销;没把撤销放页面里做:页面关着时 AI 工具也在写,日志在存储里才不丢。 测试:agent-writes.selftest 覆盖开关、非法参数整份拒绝、写入和撤销、撤销跳过用户改过的、标签名额、和分拣台页面交错写、提议的各种拒绝和上限;triage.selftest 覆盖 U 步骤和提议的执行、拒绝、Esc、批量在跑时拒绝;mcp 测试覆盖两个工具的透传和文字。
注册表加 fallback:web 最后才问,与加载顺序无关。读字幕优先用浏览器已载入的 cue,否则取 <track> 文件(WebVTT/SRT,2 MB、8 秒上限),字幕和正文各限 100,000 字。 自己读页面的站点也能截帧:在自有标签页注入 agent-page.js 跑同一个 frame。
抖音、TikTok 的验证码和删除的视频要立刻告诉 agent(THROTTLED 等),而不是当成没加载完一直重试。文档的 read 示例改成箭头函数:executeScript 按 "(" + 源码 + ")" 执行,方法简写会报语法错。
TikTok 读页面的 __UNIVERSAL_DATA_FOR_REHYDRATION__,字幕取原语言的 WebVTT。抖音在页面里用 XHR 请求 /aweme/v1/web/aweme/detail/,由页面自己的安全 SDK 签名;每页最多 3 次、间隔 3 秒,验证码、412/403/429、空响应用 THROTTLED。抖音多数视频没有字幕,返回 playUrl 供转写。
站点适配器加可选的 collections/list/has/write;批量写的规则统一在 agent-collections.js:默认关(允许 AI 工具改我的收藏)、一次不超过 20 个、逐个间隔 1.5–3 秒、改前读(已是那样就跳过)改后读(确认)、限流或掉登录即停、给撤销调用。YouTube 的 youtubei 请求在扩展自己的标签页、页面 MAIN world 里带 SAPISIDHASH 发出。只用手写的 youtubei 答复测过,没有对 YouTube 实测。
# Conflicts: # extension/background.js
# Conflicts: # docs/AGENT.md # extension/agent-bridge.selftest.js # extension/background.js # mcp/server.js
# Conflicts: # docs/AGENT.md # extension/agent-bridge.selftest.js # extension/entry-matrix.selftest.js
- 撤销 AI 工具写的判断:分拣台打开收藏夹时会给没有 criteria 的结论补上当前判断标准,原来撤销把这当成「用户之后改过」而跳过。比较时不看 criteria。 - 两个分拣台标签页同一条提议:先从队列里取走再执行,取走时发现已被别处拿走就提示「这条提议已在别的分拣台标签页处理」并停下,不再执行两次。 - 确认提议时恰好有 B站批量在跑:提议放回队列并提示,不再静默丢掉。 - verdict 用 Object.hasOwn 判断,toString、constructor、__proto__ 不再被当成判断(tag-core.js 的 verdictOf 也一样)。 - 撤销的消息没送到后台时,日志里还在的那一步放回 U 栈,后台放回日志的事件也不会再加一遍。 - set_triage 中途写失败:写失败的部分不进日志;错误里写明失败前已写入并可撤销的 bvid,免得 AI 工具盲目重试。 测试:每处各加一条,把修复改回去时对应测试失败。
# Conflicts: # docs/AGENT.md # extension/agent-mydata.selftest.js # extension/background.js # extension/options.html # extension/options.js # extension/options.selftest.js # extension/settings.js # mcp/README.md # mcp/server.js # mcp/test/server.test.mjs
…关下,关着时变灰、后台报 PERSONAL_DATA_OFF
…om 的链接按站点的标准页面读,不再落到任意网页
…改收藏参数错报 BAD_PARAMS;youtubei 403 报 NOT_LOGGED_IN 不再当限流
…d watch_later),走分拣台同一组请求
…上);写过的条目 30 秒内按刚写的算,紧接着撤销不会被当成「已是如此」跳过
…里深一层,原来只读到前 100 个)
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Agent 经 MCP 能改分拣台、B站稍后再看和 YouTube 收藏;agent 接口改成按站点适配器组织,这次只含 B站和 YouTube。
agent-sites/:B站、YouTube 各一个适配器,bridge 不再写死站点。youtu.be、/shorts/、m. 站等链接归一到观看页。set_triage:写分拣台的 AI 判断、保留、备注、标签,只改本地,分拣台按 U 撤销,用户之后改过的值不撤。propose_fav_change:取消收藏、移动、复制只进提议队列,用户在分拣台确认后才改 B站。list_collection/collection_write:B站稍后再看(走分拣台同一组请求),YouTube 稍后观看、播放列表、赞过的视频、订阅、历史(只有稍后观看和自己的播放列表能改)。一次最多 20 个,逐个写,写前写后各读一次,限流就停,返回撤销参数。已知没修:Agent 写备注时用户恰好同时保存同一条备注,Agent 那条会被丢掉,返回里不单独说明;两个 set_triage 并发时,先开始、后结束的那次可能不弹提示,撤销步骤照常有。
验证:
node scripts/selftest.mjs48 项通过,cd mcp && npm test21 项通过,node scripts/smoke.mjs通过。在登录的浏览器里(ego,本分支的扩展加新 MCP 服务)实测过:B站稍后再看和 YouTube 五种收藏的读取;两边稍后观看的试运行、真写和撤销;写开关关着时报
COLLECTION_WRITES_OFF;set_triage写入后分拣台卡片显示「Agent 判断」、标签和备注,按 U 全部撤回;propose_fav_change在分拣台出现提议并能拒绝;get_video读 m.bilibili.com 和 youtu.be 链接。实测找到三个问题,已在本 PR 修掉:YouTube 收藏一律报NO_ACCESS(按*.youtube.com查权限,清单只给了 www);YouTube 状态读比写慢约 12 秒,写完立刻重读和紧接着撤销都会读到旧状态;赞过的视频(1659 个)只读到前 100 个,新版列表的翻页 token 深一层(修后实测连翻三页 300 个不重复)。订阅 515 个一页全部返回,没有分页,没改。