Files
2026-10-08 17:32:34 +08:00

930 lines
100 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。所有成员包(`apps/*`、`packages/*`)与根 `deno.json` 使用同一个版本号;`/api/v1/health` 与备份清单里的版本取自 `apps/server/deno.json`。
## [0.3.44] - 2026-10-08
迁移 `0094`(旧的集数映射规则转成作品识别词后删除 `episode_mapping_rule` 表)。
### 新增
- 规则页加了「识别词」页签,一处看全所有识别词:上面是全局识别词,下面是写了作品识别词的作品(可搜索,显示规则行数、停用行数、最后修改),点一部作品在右侧抽屉里改,也可以「为作品添加」。
- 全局识别词:写法和 MoviePilot 的自定义识别词一样(屏蔽词、`A => B` 替换、`前 <> 后 >> EP+1` 集数偏移、替换 + 偏移、`{[tmdbid=…;type=tv;s=1]}` 指定作品),MP 的列表可以直接粘贴。站点 / RSS / 搜索来的资源、整理时的文件名、文件管理识别、下载时选文件、刮削,识别前都会先过一遍;命中的行在集数映射预览里显示「命中识别词」。
- 作品识别词:一部作品一块文本,一行一条,例如 `S02 >> S01 EP+24`、`S03 @ADWeb @MWeb >> S01 EP`、`S01E13 >> S00E01`、`S01 @某组 >> 忽略`;作品页「集数映射」里改的是同一份。
- 识别词编辑器有「可视化」和「文本」两种方式,随时切换不丢内容:可视化里一行一张卡,选类型填字段、开关停用、拖动排序、写备注,卡片下面拿近期资源试这一行;文本里有行号、语法着色,写错的行标红。改完先试算(哪些资源会变、哪些仍对不上季表、哪一行写错了),确认再保存。
- 全局识别词保存后在后台把标题命中改动行的资源重新识别,页签里能看进度。
### 调整
- 作品原来的结构化集数映射规则自动转成作品识别词:同一季同一换算的发布组合成一行,停用的规则变成注释行。
- 识别词照写的用:算出来的集数对不上作品季表时,资源保持集数待确认、在预览里标「对不上」,不再自动停用规则(原来的「映射规则算出的集数对不上作品季表,规则已停用」没有了)。要停用某一行,把它注释掉或在可视化里关掉开关。
- 集数待确认的「采用建议」「忽略」和智能体写规则,都是往作品识别词末尾加一行,上面一行注释写清楚来历;用户注释掉过同范围的行,智能体就不再自动写。
- 发布组比较不分繁简:`綠茶字幕組` 的规则也认 `绿茶字幕组` 的资源。
## [0.3.43] - 2026-10-08
### 修复
- 作品已有 TMDB 季集结构时,资源标题里写的季不在结构里(如 TMDB 把三期连续编在第 1 季,发布者却写 S02、S03),不再按标题建出这一季:资源先按集数映射规则换算,换算不了就停在「待确认」。
- 刷新元数据时,结构外的临时季连同下面的临时集一起退役,挂在上面的资源解开关联(仍属于这部作品);有文件覆盖或收录版本引用的季留着不动,特别篇(第 0 季)不清。
## [0.3.42] - 2026-10-08
### 修复
- 资源把「全 24 集」写成 `S01-S24` 这类季范围时,不再给作品每一季都建一个空的临时季(药屋少女的呢喃因此多出第 4~24 季):季范围只建第一季,后面的季只挂已有的。
- 刷新元数据时,把不在 TMDB 季集结构里、下面没有集、也没被资源或文件引用的临时季退役;季范围误建的空季和切换季集结构后留下的孤儿季会在下次刷新时消失。
## [0.3.41] - 2026-10-08
迁移 `0093`。
### 调整
- 智能体运行时升级到 Pi 1.1(pi-durable + pi-ai 1.1.0):会话的每一步(模型回复、工具调用、用量)都先写盘再显示,进程中途退出后续跑更稳;工具调用结束事件多了执行耗时(毫秒)。
- 多轮对话和续跑后的 token / 费用累计改为整段会话的真实总量(之前换进程续跑后从 0 重新计,界面上的用量偏低)。
- 模型服务的 Azure 提供方随 Pi 改名为 `azure`(原 `azure-openai-responses`),迁移 `0093` 自动改已保存的模型服务,配置项不变。
- 智能体抽屉和智能体会话页用同一个对话界面,抽屉是它的紧凑版。抽屉标题就是最近会话切换(点开是和会话页同一份列表),右边是「新对话」「在页面打开」和关闭;不再有单独的「历史」弹层。
- 智能体只剩一个按钮入口:桌面是侧栏最上方的「智能体」(Ctrl+J),手机是顶栏胶囊里的智能体按钮;去掉右下角悬浮按钮和最小化小窗。关上抽屉会话照常在后台跑,再打开接着看。
- 会话列表合成一个:对话和自动巡检混在一起,巡检和事件发起的会话带一个小标签;筛选只剩搜索和一个状态下拉(全部状态 / 等你处理 / 进行中 / 失败);子会话不再单独列出。
- 子会话在父会话里看:派出的位置有一张卡片,实时显示任务、状态、正在做什么、用时、调用次数和费用,展开能看它的过程,也能单独打开;会话顶部的「N 个子会话运行中」点一下跳到卡片。
- 智能体的回答不再夹带内部字段:模型被要求转述子会话结论、不照抄 ID 和原始字段;旧会话里「childRunId:…」「decisionId: null」这类行和「返回字段」表格从正文里拿掉,原文放进「技术信息」。
- 新对话的开场建议改成按所在页面给两条完整的问法,点一下直接发出(例如在整理记录页是「整理记录里没识别出的作品是什么」);不再填半句话。
- 输入框只保留 `/先给方案` 一个指令;原来的 `/重跑` 改成会话结束后顶部的「重新运行」按钮。
- 从列表打开的记录不再跳到单独的页面,改在右侧抽屉里展开,列表的位置和筛选都不动:整理记录、订阅、站点(含概览、资源、原站视图、抓取、RSS、账号页签)、下载、日志里的任务,以及规则组、媒体库的未识别资源与外部身份、设置里的下载器等实例。
- 打开的记录写在地址里,刷新、分享链接都能回到这条;浏览器后退就是关掉抽屉。
- 抽屉里再看详情(站点的资源和 RSS、订阅对比的格子)在同一个抽屉里切换,顶部「返回」回到上一层,不再叠第二个抽屉。
- 回收站并进文件管理:左边目录树点「回收站」,右侧换成回收站列表。
- 设置页左栏只列分区,不再展开节;节是页面里的小标题,搜索和带节的链接照样能定位。
- 旧的详情页地址(整理记录、订阅、站点、下载、任务、回收站)继续可用,会打开对应列表页上的抽屉。
- 在列表页开着记录抽屉时打开智能体,会带上这条记录作为上下文;智能体回复里的整理记录、下载链接直接打开对应抽屉。
- 抽屉打开时焦点落在抽屉本身,不再一打开就给第一个标签亮焦点框。
### 修复
- 运行状态 → 数据库语句统计:相同语句文本出现多行时界面报重复 key。
### 注意
- 会话存储格式变了:会话文件从 `agent-sessions/<会话 ID>.jsonl` 改为 `agent-sessions/<会话 ID>/` 目录。升级前已经结束的会话照常查看;升级时还在运行或挂起等待(审批、选方案、等子会话)的旧会话不能继续,会以「这个会话由旧版本创建……」失败,需要的话重新发起。
## [0.3.40] - 2026-10-08
迁移 `0091`。
### 调整
- 顶栏搜索移进右侧玻璃胶囊(与通知、日夜切换、账户同一块),桌面是带 Ctrl K 提示的淡底胶囊,手机只留图标;不再是旁边单独一个黑边输入框。
- 输入框、下拉选择改成淡玻璃:半透明底、细边,悬停时边线加深;聚焦和出错的光晕与红线保持清楚。
- 分段选择统一换成滑动的玻璃滑块,不再有实心黑色的选中块:站点的「全部 / 已启用 / 需要处理」和「卡片 / 列表」、下载面板的「进行中 / 已完成」、订阅的类型与视图、文件管理的筛选、智能体会话列表的分栏与筛选、页面里的标签页(媒体库、日志、规则、运行状态的时间范围等)、站点凭证类型与 RSS 用途。
- 按钮角色统一:页头与工具栏的次要操作一律是描边胶囊(整理记录的「批量」、订阅的「规则」「批量」、日志的「刷新」、下载盘的「调整阈值」),开关型按钮按下后显示选中外观;文件管理工具栏的图标按钮统一为描边圆钮,排序改用下拉选择。
- 下载面板的总速度标上「总速度」,空闲时显示 0 B/s,不再是两道横线。
- 分页:一页就放得下时只留总数,不显示翻页按钮;没有条目时不显示;窄卡片里按宽度收起首页 / 末页和「上一页 / 下一页」文字,不折成两行。
- 智能体页:列表页和会话页共用同一个外壳,标题和左栏会话列表切换时不再消失、不重播动画,两栏正好占满一屏;会话列表顶部的分栏、搜索和筛选拉开间距。
- 设置页左侧当前分区、整理记录顶部的状态计数、搜索结果的多选条件改用玻璃选中态。
### 修复
- 运行状态 → 存储:缓存与数据目录在宽屏并排,「数据库里最大的 10 张表」「数据库语句统计」整行放在下面,不再留出大片空白的左栏。
- 站点卡片底部的「⋯」不再单独掉到下一行。
- 部分剧集的「集数映射」显示「还没有季表」,资源全标「元数据未覆盖」,和「季与集」里完整的季集对不上(如兰香缘):9 月 29 日之前刷新的作品,季记录还是根据资源临时建的、没随 TMDB 集一起转正,季表把整季丢了。季表现在认这种季;迁移 `0091` 把 26 部作品的 28 个季和其中 26 个对上 TMDB 的临时集转正。
## [0.3.39] - 2026-10-08
### 修复
- 站点快照开始前,把这个站点 10 分钟前就开始、还停在「运行中」的旧快照记录按中断收尾(进程被杀或旧版本卡死留下的;清理任务不删运行中的记录,之前会一直挂在快照历史里)。
## [0.3.38] - 2026-10-08
### 调整
- 界面材质与 uhd_web 同步(截至 2026-10-08):内容卡、悬浮层、选中态、分段滑块、药丸改用同一套边光(左上亮、右下暗的细边加外侧暗线);主按钮的转动光谱环改为静止的左上光谱高光,悬停时沿边扫过一小段,减少动态效果时只变亮;次按钮与主按钮同为 lens 玻璃。
- 输入框、多行输入、下拉选择统一由 `.field-glass` 给底、边、聚焦光晕和出错红线,去掉各处自带的边框和底色;对话框、确认框、抽屉的底更实,按钮行间距加大。
- 提示条改成玻璃浮层,状态色只在图标上,多条时展开排列不叠放;原生 `title` 悬停提示换成同款玻璃气泡。
- 控制台外壳:侧栏不画硬分隔线,折叠开关移到标志行;顶栏不铺磨砂,标题下用页面底色渐隐,通知、智能体、日夜切换和账户收进一枚玻璃胶囊。分组小标题保留。
- 登录页改为整页居中一张卡,只留标题,去掉左侧宣传语。
- 作品详情头图的「订阅」改回普通主按钮(静态高光在剧照上看得清),去掉实心按钮例外 `pill-solid`;发现页海报上的评分与状态角标改成烟色小玻璃。
- 触屏判断改为通用方案(`<html data-input>`、`touch:` 变体、`useTouchInput()`):车机等把触屏报告成鼠标的设备也按触屏处理,悬停效果只给真鼠标。
### 修复
- 站点快照加 5 分钟总截止时间:请求在过人机验证、浏览器代抓或限流排队时卡住,快照到点记为失败,后台任务不会一直停在运行中(之前 OurBits 的一次定时快照卡了 10 小时)。
- 定时任务在认领或收尾写库时出错(如关停时连接已断)不再成为未处理的错误,改为记一条日志。
## [0.3.37] - 2026-10-07
### 调整
- 作品详情页头图重做:剧照铺在顶部并渐隐到页面底色,浅色 / 深色结构一致;操作按钮并入头图区,订阅为唯一的主色实心按钮;状态徽标并入同一行;简介折叠只留一个「展开」;标语只显示简体中文。
- 全量重写界面与服务端的用户可见文案(按 `.claude/skills/human-copy`):去掉客服腔、翻译腔与过度说明,修正与事实不符的提示(如永久删除的开关位置);术语表补齐下载盘、验证、整理来源、需要处理、后台任务等叫法;`check:copy` 新增禁用词规则(您 / 请先 / 一键 / 其它 / 无需 / 进行+动作 等)。
- 删除三个无引用的组件文件。
### 修复
- 出站代理缺省直连 `alist` / `openlist` 容器名(之前测试连接会报 HTTP 502)。
## [0.3.36] - 2026-10-07
迁移 `0090`。
### 新增
- Alist / OpenList 存储(对齐 MoviePilot v3):设置里登记多个实例(永久令牌 / 账号密码 / 访客,可选路径密码,测试连接);文件管理切换存储后可浏览、新建、改名、删除(回收站)、移动、复制、上传、下载;整理支持 本地 → Alist(上传)、Alist → 本地(下载)、Alist 内(接口复制 / 移动)、跨实例(本地中转),复制与移动都有;刮削写到 Alist;Alist 目录可作整理来源,快照比对发现新文件;健康检查显示实例连通性。
- 相对 MP 的改进:出错与「不存在」分开、401 自动重登、复制 / 移动等 Alist 任务真正完成、同名冲突先查再写(暂存名 → 改名)、上传空闲超时与退避重试、下载断点续传与直链过期重取、按实例限速与并发、刷新节制。网盘方向按用户决定不核验大小 / 哈希(接口成功且目标存在即成功)。
- 本地文件系统守卫:`/@alist/` 虚拟路径落到本地写操作一律拒绝,不会在容器里误建目录。
## [0.3.35] - 2026-10-06
### 修复
- 运行状态页 CPU / 内存 / 网络一直没有数据:Deno 2 不带 `--allow-all` 时不能直接读 `/proc`、`/sys`,编译产物改为经 `cat` 读取(`--allow-run` 增加 `cat`);沙箱子进程的内存看门狗同因修复。
## [0.3.34] - 2026-10-06
迁移 `0089`。部署后需重建 postgres 容器才启用语句统计:`docker compose --env-file .env.deploy up -d postgres`。
### 调整(数据库)
- 标题 / 别名模糊匹配改用 `%` 运算符,能走 trigram 索引(资源标题搜索在 8 千行上从 75 ms 降到 0.6 ms);巡检结果回填加部分索引;删除无用的 `content_unit_air_date_idx`;`random_page_cost` 调为 1.1。
- 数据保留补齐:引擎运行(终态、未被保留中的任务引用,缺省 14 天)、已投递事件、识别尝试(每条资源留最近 3 次)、已识别条目、站点快照;新增每天 04:40 的流水数据清理,分批删除并在删后 `ANALYZE`;保留天数在「设置 → 系统 → 数据保留」;`scripts/db-retention.ts` 可 dry-run / apply。
- 启用 `pg_stat_statements`:运行状态页「存储」显示最慢 / 调用最多的语句与各表死元组。
## [0.3.33] - 2026-10-06
迁移 `0086`、`0088`。
### 新增
- 统一元数据缓存:TMDB / 豆瓣 / Bangumi 共用「来源 × 资源类型」缓存策略;进程内存一级 + PG 二级,跨进程失效(LISTEN/NOTIFY);过期后先返回旧值再后台刷新、同请求合并、失败不缓存;关注中作品的条目续期不被淘汰,进入关注时预热(详情、各季、剧集组、图片);设置「缓存」分区显示命中率。
- 刮削写 `clearlogo.png`(TMDB 标志,原语言 → 中文 → 英文 → 无文字)。
- 生命周期事件与链式钩子(ADR-006):订阅、下载、整理、刮削、字幕、作品关注 / 元数据刷新 / 季集结构切换、站点可达性等广播事件;名称识别、整理改名、整理拦截、资源选择、订阅完成判定五个钩子。功能清单写进智能体提示;前端插槽(作品页、整理记录行)默认显示,补字幕作为样板。
### 修复
- 日志页在真实数据上带筛选或关键词时超时:先按原始列筛选取前 N 条再算标题,关掉 JIT;同等数据从一两分钟降到 0.25 秒内。审计加按时间倒序索引。
## [0.3.32] - 2026-10-06
界面第二轮与 TMDB 多语言规则。迁移 `0083`。
### 调整
- 智能体:切换会话不再整页闪烁重挂载;「对话 / 自动巡检」分栏跟随当前会话并写进地址,保留列表滚动位置、子会话所在父行自动展开;草稿按会话保留;切回看过的会话直接铺出历史;抽屉与整页互相切换(会话页加「在侧边打开」,在智能体页按 Ctrl+J 聚焦页面输入框)、关闭后焦点归还、路由变化时新对话上下文跟随;列表改用一行的紧凑分页。
- 发现:分「推荐」与「探索」。推荐含 TMDB 流行趋势 / 正在热映 / 热门 / 即将上映 / 正在播出 / 高分、豆瓣各榜单、Bangumi 今日放送与热门趋势;探索按来源(TMDB / 豆瓣 / Bangumi)筛选与关键词搜索。卡片显示本地状态,可直接订阅、搜索资源。豆瓣 / Bangumi 走不登录的 HTTP 接口,请求统一缓存。
- 整理:只保留「整理记录」,整理队列改为标题栏按钮展开;记录按状态、类型、整理方式、媒体库目录、分类、来源、时间筛选。
- 界面上表示处理状态的「入库」统一改为「整理」(如已整理、未整理、整理后自动刮削);真正是否被媒体服务器收录由媒体服务器决定。
- 系统只留日志、运行状态、设置:日志页合并任务、定时与自动、登录、审计,可实时追加、勾选后问智能体,定时任务作为日志页的页签;运行状态加入 CPU、内存、网络、磁盘读写与趋势、各进程 CPU,首页换成运行状态简版卡。登录失败写审计。
- 设置按「接入 / 流程 / 系统」重排为 12 个分区,加搜索定位与缓存分区(按区查看与清空),旧链接自动跳转;同一设置的不同叫法统一。
- TMDB 多语言数据只保留简体中文、繁体中文、英文与作品原语言(别名、译名、简介、识别与按作品搜资源都按此);旧数据清理脚本 `scripts/tmdb-alias-language-cleanup.ts`。
- 发布:`.env.deploy` 配 `BUILD_PROXY` 时构建镜像自动经代理。
## [0.3.31] - 2026-10-06
迁移 `0078`。
### 调整
- 去掉待处理中心,问题回到发生处:下载完识别不到、路径冲突、文件被排除、整理卡住或失败在整理记录「需要处理」里就地处理(指定作品 / 候选 / 让智能体识别 / 重新整理 / 忽略);集数待确认先自动解决,原因显示在作品页与订阅详情;站点不可达、下载器离线、下载目录读不到、磁盘空间不足进运行状态「需要关注」;铃铛只放需要你批准的智能体操作与系统健康问题;首页显示汇总计数。旧的待处理链接按类型跳转。
- 下载完识别不到作品时自动派智能体识别,认出后自动重新整理(缺省开启,设置里可关)。
- 智能体不再设硬性预算上限(每天次数 / 花费、单次花费 / token 不再拦截,旧值保留但不生效);保留单次工具调用次数与时长的防跑飞限制并调宽;设置页显示用量与花费。
- 集数识别分两层:确定性校验对所有资源照做;拉 TMDB 元数据、开集数待确认、派智能体只对关注中的作品(有订阅、你搜索 / 手动下载过、正在下载或整理、已入库),RSS 扫进来的作品不再自动拉元数据;进入关注时补刷新。
### 新增
- 整理时指定剧集组(参考 MoviePilot 重新整理选剧集组):整理弹窗可临时按 TMDB 默认季或作品的其它剧集组换算季集与命名,作品设置不变,资产仍登记到作品当前结构的对应集;可勾选同时设为作品的季集结构。
## [0.3.30] - 2026-10-06
迁移 `0075`、`0077`。
### 新增
- TMDB 剧集组(参考 MoviePilot):作品页「季与集」可在 TMDB 默认季与各剧集组之间预览、切换季集结构;季卡片显示集数、年份与已入库数,集列表标出原 TMDB 季集号。切换时集单元原地改编号(资产、下载计划、订阅覆盖跟随),集数映射、元数据刷新、刮削按所选结构;订阅选季用同一套轨道与季卡片。
- 站点请求失败留样:解析失败或遇到人机验证时保存脱敏的页面样本(每站最近 5 份),站点页技术信息里查看。
### 修复
- 资源搜索按作品搜时判定每条结果是否属于该作品(参考 MoviePilot `match_torrent`:识别结果、类型、年份、季、标题 / 别名),不属于的不参与筛选与计数,折叠在列表最后。
- 筛选选项只列结果里实际出现的值;新增「季集」维度并放在最前(整季在前、新季在前)。
- 原盘判定参考副标题线索(原盘、BDMV、自购自抓、DIY)与 PCM 音轨。
- 站点搜索失败、超时、被人机验证拦下的结果不再缓存,下次搜索直接重试;按作品搜时中文名在前、原名第二。
- 返回 200 的人机验证 / 挑战页(如站点搜索页单独的 Cloudflare 盾)能被识别并进入浏览器过挑战流程,不再报「页面结构无法识别」。
## [0.3.29] - 2026-10-06
界面改进:参考 MoviePilot 做得好的地方,保留我们更强的部分。
### 调整
- 资源搜索结果:规格拆成中性小标签(分辨率、来源、编码、HDR、音频、字幕、制作组);促销放到标题前(免费、50% 带剩余时间);站点、大小、做种 / 下载、发布时间对齐成列;涉及多部作品时按作品分组,组头带库存状态。
- 资源搜索结果新增规则判定:关联本地作品的资源显示「命中第 N 档」「不满足:…」「无法判断:…」,命中时与库里版本比较(高几档 / 同档 / 不如)。
- 下载对话框重做:标题区显示作品、年份、站点;资源行带促销、H&R、做种数;下载器与保存目录并排下拉,写明实际下载器与「将保存到」的路径,可选自定义路径;可折叠的作品身份区,未识别时默认展开,可当场指定类型与 TMDB 编号(下载前绑定作品并加人工锁);已有版本先显示一行摘要,选一次性洗版才展开勾选。搜索、站点工作台、原站视图共用。
- 整理记录默认按作品分组(一季折成一组,组头写季集范围、条数与失败数),选择会被记住;行内显示整理方式(移动 / 复制 / 硬链接 / 原地入库)与分类。
- 文件管理:行悬停或键盘聚焦时露出 2–3 个常用操作图标(按文件状态选择),面包屑可逐级点击。
## [0.3.28] - 2026-10-04
系统梳理第二批:获取正确性、识别准确度、下载侧可见性、刮削与整理剩余项。迁移 `0073`、`0074`。
### 修复(获取)
- 订阅总带自己的收录版本:没有模板、没填质量预设、作品已有旧订阅的版本时也会建「默认版本」;旧的无版本订阅在首次评估时补建。之前这类订阅永远不下载。
- 有升级目标的洗版订阅到规则组最高档才完成,不再拿到第一个版本就完成。
- 「接续后续季」不再下订阅季之前的季。
- 按收录版本重评时先排序择优;重评范围从最近 50 条放宽到 500 条并按季 / 缺集过滤;手动下载中的集计入在途,订阅不重复下。
- 新作品收录并发评估时只建一个订阅。
### 修复(识别)
- bgm 按标题搜索的结果要与资源名称核对,唯一高分才采用;投影出的 TMDB 结果再与原标题比对。
- 人工指定只在年份与类型相容时回填识别缓存,Agent / 系统指定不回填;读缓存时也核对。
- 合并识别事项按年份与类型分组,组内不相容的资源不随组锁定。
- 季表不计资源懒建的临时季;改 TMDB 映射时删旧作品的 tmdb 别名;合并作品时内容单元迁到目标作品。
- 站点快照连续失败 3 次开待处理(恢复后关闭);TMDB 复查耗尽、本地命中但查不到时开待处理;详情拉取失败不写负缓存。
### 修复(下载)
- 下载器连不上满 10 分钟、下载目录读不到容量时开待处理,恢复后自动关闭;下载面板单独显示「下载目录读不到」。
- 下载器可设「H&R 未知也可清理」(缺省关)。
- 季包先暂停添加、选完文件再开始(磁力需 qB 4.5+),元数据迟到时延后选文件。
- 取消与提交并发不再复活计划;收单未确认的提交补做完成判定;排队任务也受阈值暂停;停用的下载器上在途任务继续同步。
### 修复(刮削与整理)
- 多集文件的 NFO 每集写一块 `<episodedetails>`;综艺按日期的期数写分集 NFO。
- 入库后自动刮削缺省开启(已保存过设置的沿用原值);没排上时在整理记录上记「未刮削」及原因。
- 平铺目录只刮本作品视频,多作品同目录时图片按视频名命名;图片扩展名按实际类型;取消时记录不停在进行中。
- 非洗版「替换」新建资产;不是视频的文件移入回收站并开待处理;混合包里明显不是本作品的视频降为待确认(`title_mismatch`)。
- 回收站清除先删文件再删记录;跨卷 Move 删源前全量校验;整理补元数据带超时。
## [0.3.27] - 2026-10-03
按 2026-10-03 系统梳理(`docs/plan/system-review.md`)修第一批:静默卡死、刮削准确度、集数映射漏口。迁移 `0067`、`0069`、`0070`。
### 修复(集数映射)
- 整理向导只发用户改过的季集,未改的交给服务端按作品映射;集数待确认的行需填季集或排除才能执行。之前向导把预填季集当人工指定,绕过了映射。
- 自动识别新建作品后排一次元数据刷新;之前季表为空,绝对集号只能按原号放行。
### 修复(下载)
- 同一种子被移除过、再次提交或接管时复活旧任务,不再永远停在「已提交」;复活后完成照常触发整理。
- qB 重启 / 重新校验 / 移动时不再把「整理中」「已入库」改回下载状态,缓存清理不再漏掉这批任务。
- qB 连续 3 轮查不到才判任务已移除。
- 同一种子已被别的计划占用时取消本计划并释放预留,不留孤儿计划。
- 下载卡住 / 出错的待处理在恢复后自动关闭。
### 修复(获取)
- 被自动化开关、下载器、预算、缓存卷挡住的资源写延后并按退避(30 分钟起,最长 6 小时)重评,电影与已满足的剧集也会重评。
- 卡住的下载不占并发名额。
- 失败 / 取消的旧计划让位,同一资源可重新计划(失败按次数冷却);用户移除、手动取消、整理失败、种子被占用的仍不重下。
- 集数待确认的资源在订阅侧写候选记录,能看到原因;订阅完成、暂停、资源过期时清掉对应延后。
### 修复(整理)
- 卡在「执行中」的整理记录由巡检重投(最多 3 次,超过转失败并开待处理)。
- 库根离线时不耗尽重试,记录等待并开待处理,恢复后自动继续。
- 有视频因集数待确认等被排除时记录为部分完成,Move 不删 qB 任务,并开待处理。
- Move 后删除 qB 任务失败会重试。
### 修复(刮削)
- 改 TMDB 映射后清掉旧作品的 TMDB 字段与图片、退役未锁定的旧 IMDb,完整刷新后自动重刮,不再新旧混写。
- 季 / 集缺元数据时先按 TMDB id 现取补齐,仍缺跳过并记部分完成,不再写占位并报成功;没有 TMDB id 的作品照旧写占位。
- 新增覆盖方式「更新」并设为缺省:只覆盖本工具写过且没被改过的文件;元数据刷新有变化时自动排更新重刮。
- 合集 / 其他类作品的 NFO 根元素改为 `<movie>`;兜底异常记内部错误并保留已写文件结果。
## [0.3.26] - 2026-10-03
### 新增
- 集数映射:资源识别到作品后,按作品季表校验解析出的季集号,不再按错号建出假的集(例如第 2 季只有 12 集却建出 S02E13)。元数据滞后(季总集数未知、在播最新季超出不多)先按原号放行。
- 确定性换算:季内绝对集号(`S02 13` → S02E01)、跨季连续编号(ANi `- 25` → 第 2 季对应集)、综艺按播出日期对集;与元数据滞后分不清时看发布时间是否贴近目标集播出日期。
- 映射规则(作品 + 季 + 发布组):偏移表达式(`EP-12`)、对照表、特别篇 / 花絮 / 忽略;规则算出越界自动停用并转待处理。
- 对不上的资源照常绑定作品,但不建集、订阅评估跳过,进待处理「集数待确认」(同作品同季同组合并,附建议规则),可确认 / 修改 / 忽略。
- 整理、季包选文件、刮削、文件管理识别与推荐名统一套用映射,下载与整理认同一集;待确认的文件不按原号入库。
- 作品页「集数映射」:季表摘要、规则管理、草稿规则模拟预览、应用后按作品重算;订阅详情显示映射摘要。
- 智能体兜底:集数待确认事项可由后台调查查看上下文、模拟、写规则(需持续授权,写入前服务端强制模拟全部样本通过);没有授权时把模拟通过的规则留作建议,一键确认。迁移 `0066_episode_mapping`。
## [0.3.25] - 2026-10-03
### 新增
- 字幕库验证码由智能体接管:沙箱识别 3 次没过时,用浏览器打开同一页面派视觉子流程读码输入;过了把浏览器里的站点 Cookie 带回,搜索 / 下载照常继续;没过开待处理事项,去原站视图输一次即可。
- 字幕站原站视图「下载当前字幕」:在原站视图里打开一条字幕详情页,一键下载,选作品后按季集配对到视频,可改写到哪个视频再写入。
## [0.3.24] - 2026-10-03
### 新增
- 补字幕第 2 步:字幕站(站点类型「字幕站」,内置 SubHD、字幕库,站点页一键添加,复用站点的代理 / UA / Cloudflare 处理与健康检测)。作品页「补字幕 → 在线搜索」:按作品名、原名、别名搜(SubHD 有豆瓣 ID 时直接开条目页),结果按季集过滤、双语 / 简体优先、按下载量排序;点下载后进同一个预览,确认后写入,历史里记来源。字幕库的云锁数字验证码、SubHD 的 SVG 验证码在沙箱里自动识别。迁移 `0065_subtitle_sites`。
- 字幕压缩包支持 rar 与 7z(沙箱里用 WASM 解压)。
## [0.3.23] - 2026-10-03
### 调整(安全)
- 不可信字节改在沙箱子进程里解析(ADR-005):种子文件(站点下载校验、qB 提交前、浏览器下载核验、公开 BT 站读文件列表)、文件管理预览、补字幕的解码与解压。子进程撤销全部权限,卡死超时强杀、内存超限强杀,不拖垮主服务。
## [0.3.22] - 2026-10-03
### 新增
- 补字幕(第 1 步:手动上传,参考 MP 插件「海拉鲁字幕大师」):作品页「补字幕」,可一次上传多个字幕或 zip;自动转 UTF-8(GBK / Big5)、识别语言(简中 / 繁中 / 双语 / 英日韩)和季集并配到对应的视频,预览里可改语言和目标;写到视频同目录,文件名是视频名加语言后缀(沿用整理规则),同名字幕先备份;登记为字幕资产,有历史,可撤销。迁移 `0064_subtitle_write`。
## [0.3.21] - 2026-10-03
### 新增
- 公开 BT 站支持详情:Nyaa(简介、文件清单、上传者)、蜜柑(简介去广告、番组页的 bgm 条目、文件清单从种子读)、AniBT(发布说明、关联番剧的 bgm 条目、文件清单从种子读)、AnimeGarden 与萌番组(接口里的简介与文件表)。简介里的 IMDb / 豆瓣 / TMDB / bgm 链接作为识别证据。
### 修复
- AniBT 资源 ID 带 `-` 时被当成非法 ID,详情与下载都会失败。
## [0.3.20] - 2026-10-03
### 调整
- 站点页按类型分组(PT 站 / 公开 BT 站;旧的 RSS 源有的话单列),去掉类型筛选;添加站点只保留 PT 站和内置公开 BT 站,自定义 RSS 源与索引器入口先下掉(已有的照常显示)。
- 站点列表模式:操作按钮改成图标,数值列不换行,窄屏隐藏次要列;公开 BT 站的表只列出口、资源搜索、资源更新;公开站卡片不再显示 RSS。
- 智能体页会话分两栏:对话(用户发起)/ 自动巡检(定时、事件触发),子会话随父会话。
### 新增
- 用对话起草巡检:计划页「用对话起草」,一句话描述要定期检查什么、多久一次,智能体建一个未启用的巡检(目标、间隔、只读能力白名单、触发条件),对话里给「检查并启用」卡片,你在计划页检查、修改后启用。新能力 schedule.draft_check 只在用户发起的对话里可用,定时巡检里不能再造巡检。
## [0.3.19] - 2026-10-03
### 修复
- 憨憨详情页(按 2026-10-02 真实页面):豆瓣信息一项一行,去掉分隔线、空值项、重复的标题行和「该信息最后更新」提示;MediaInfo 只取原文,不再混进摘要表。已缓存的详情在过期或手动刷新后生效。
## [0.3.18] - 2026-10-02
## [0.3.17] - 2026-10-02
### 修复
- OurBits 详情页:简介是页面里未渲染的 BBCode(站点靠前端脚本渲染),之前原样显示 `[quote]`、`[img]` 且换行全丢;改为按 BBCode 解析,保留换行、去掉标记,图片进截图,引用块里的 MediaInfo 单独取;文件列表按需取 `viewfilelist.php`。已缓存的详情在过期或手动刷新后生效。
### 调整(订阅,对照 MP)
- 定时主动搜索默认关闭:新建与手动搜索照常各搜一次,之后靠 RSS 与站点最新资源追更;需要时在订阅里填搜索间隔。没填过间隔的旧订阅也随之不再定时搜。
- 多版本自动补全默认关闭(订阅或规则组显式打开仍生效)。
- 订阅表单收敛:基础页只留作品与范围、下载、洗版;收录版本、优先级、自动补全折叠到进阶页的「多版本」。
### 新增
- 下载器可以单独设水位(硬阈值 / 恢复水位 / 清理目标)和保种天数,不填用全局;多个下载器共用一块缓存盘时取最严格的。公网 BT 专用的 qB 可设保种 0 天(站点 H&R 仍遵守)。
- 内置公开 BT 站:Nyaa、蜜柑计划、AniBT、AnimeGarden(聚合动漫花园 / 蜜柑 / ANi 等)、萌番组。添加站点 → 公开 BT 站里一键添加,不需要账号;支持资源搜索、定时抓最新资源、按资源 ID 取种子或磁力(蜜柑取剧集页的种子,AnimeGarden 只有磁力)。默认不进资源搜索的默认站点集合;萌番组部分网络直连不通,打开站点的「代理」即可。原来手填 RSS 的方式保留。
- 豆瓣 / bgm.tv 辅助信息源(照 MP 的做法,身份仍以 TMDB 为准):
- 识别:资源只有豆瓣 ID 时,本地缓存没有该条目会在线查一次豆瓣(移动版接口),按中文名 / 又名 + 年份匹配 TMDB;AniBT 资源带的 bgm 条目 ID、公开 BT 站上认不出的番剧标题,走 bgm.tv 条目(第二季等季条目去掉季名与年份)再匹配 TMDB。条目缓存 30 天,查不到 6 小时内不重查。
- 新增「发现」页(获取 → 发现):bgm.tv 每日放送、豆瓣实时热门电影 / 剧集;点条目自动匹配 TMDB 作品进作品页(可订阅、搜资源),不确定时列候选。
## [0.3.16] - 2026-10-02
### 新增
- 多下载器路由(照 MP):下载器的名称作为别名;可设一个默认下载器;站点可指定下载器。选择顺序:订阅 / 手动明确指定 > 站点指定 > 默认 > 第一个可用;站点指定的停用时回落默认,明确指定的不可用时不悄悄换。迁移 `0063_downloader_routing`。
### 修复(站点适配,2026-10-02 真实账号列表页核对)
- OurBits:标题列嵌套表格让大小、发布时间取错(大小全为 0),改为只匹配行的直接子单元格;副标题原先取成了标签,改为取标签之后的正文;新增标签与列表页 IMDb / 豆瓣 ID。
- 彩虹岛:副标题前混入的标签与末尾徽标去掉,标签单独取。
- 憨憨:新增列表标签。
- 站点给出纯数字 IMDb ID 时补成 `tt` + 7 位。
## [0.3.15] - 2026-10-02
### 修复
- 整理后自动刮削照 MP:按作品目录刮(剧集根目录 tvshow.nfo / 海报 / 季海报、季目录 season.nfo 照常初始化),集只刮本次整理的文件;同一目录还没开始的刮削合成一批。此前原地入库逐文件刮,剧集根目录与季目录没有元数据。迁移 `0062_scrape_record_videos`,刮削记录新增 `videos`。
- 站点卡片、列表、登录结果、站点概况不再单独显示 VIP 标签(等级里已经体现,各站 VIP 判定也不一致)。
### 工程
- `deno task test:all`:逐包跑完再汇总,连不上测试库直接失败(不再让数据库用例静默跳过);`deno task ci` 改用它。
- `deno task dev:up`:起开发库并迁移到最新。开发 API 端口改为 4390(4380 留给本机部署版)。
- `deno task release`(`scripts/release.sh`):要求工作区干净与 CHANGELOG 条目,打 tag、构建、只替换 app、核对健康版本。
## [0.3.14] - 2026-10-02
v0.3.8~v0.3.13 当时由未提交的工作区构建部署,源码在本版统一提交(`ceb66f8`)。各版细节见 `18-organize-release`(已删除,见 git `ceb66f8`)。
### 新增
- 原地入库:已登记媒体库内的文件保留位置与名称登记为资产(视频、字幕、季集覆盖、版本),不复制 / 移动;可选只刮削本次成功的主视频。迁移 `0061_organize_in_place`。
### 修复
- 识别升级链只在结果更确定时采用,不再用无匹配顶替原有歧义候选(歧义事项照常开)。
- 刮削入队:重放去重时不再返回已删除的记录;任务已入队但关联写回失败时保持排队,由处理器补关联。
- `bluray_dir` 资产以原盘目录本身为刮削根。
- 通知铃铛弹层与用户菜单统一样式;站点卡片共用卡头、底栏贴底,分页不贴卡片。
## [0.3.13] - 2026-10-02
### 变更
- 手动、文件管理、下载详情、历史重整共用一个整理弹窗(电影 / 剧集、TMDB 搜索或 ID、来源配置、复制 / 移动、目标路径、本次刮削、预览),只「加入整理队列」。整理页分队列与记录。
- 成功历史跳过对齐 MP;成功移动的记录从媒体库目标重整。
## [0.3.12] - 2026-10-02
### 新增
- 列表统一分页(10 / 20 / 50 / 100 条,默认 50,记住选择;游标接口按需拉取)。
- 搜索历史(按账号保存最近 30 个关键词,搜索页与 Ctrl / ⌘ K 共用)。
- 首页存储与下载器概况卡。
## [0.3.11] - 2026-10-01
### 新增
- 搜索结果标题可点开资源详情抽屉(与站点工作台同一实现),关闭后保留搜索词、筛选与分页。
### 修复
- 原站视图桌面窗口未最大化导致的上下黑边(浏览器镜像 `1.18.0-umt.1`)。
## [0.3.10] - 2026-10-01
### 新增
- 独立手动下载、串流外详情页资源下载;TMDB / Local 元数据兜底(`metadata.resolve_organize`);正常多版本与一次性洗版。迁移 `0060_manual_acquisition`。
## [0.3.9] - 2026-10-01
### 新增
- 分类规则、整理来源与持久目录快照、手动存量整理、文件管理整理入口。迁移 `0059_organize_source_snapshot`。
## [0.3.8] - 2026-10-01
### 变更
- 全面依赖升级:workspace 直接依赖到当时 latest(Router 8、Vite 8、TypeScript 7 等)、camofox 1.18.0 / Node 24、PostgreSQL 16 → 18.6、备份客户端 18.6、演示 qB 5.2.4。见 `17-full-upgrade`(已删除,见 git `ceb66f8`)。
## [0.3.7] - 2026-10-01
### 新增(HIS-1 整理记录对齐 MP 历史记录页)
- 列表加海报、源 → 目标路径、大小、下载器名称;成功不再加徽章,失败 / 部分成功带一句原因。
- 筛选新增类型(电影 / 剧集 / 未识别)与时间(今天 / 7 天 / 30 天);关键字支持 `*` `?` 通配,并能搜文件名与种子 hash;筛选写进地址栏。
- 列表上方按状态计数(只列非零项,点一下筛选);「按作品分组」。
- 删除记录:可选同时删除源文件、媒体库里的文件(移入回收站,可还原;已入库文件同时从媒体库移除;下载器任务不动)。确认框先核对,写清删几个文件、多大、哪些删不了、哪些下载会被重新自动整理。
- 批量:选择 / 全选、批量删除、批量重新整理(选中记录的源文件一起进整理向导)。行菜单:查看详情、重新整理、让智能体排查、只看这个作品、删除。
- 详情加海报、大小、下载任务与删除;种子 hash 在「技术信息」。
- 接口:`GET /organization-records/stats`、`POST /organization-records/delete`;列表查询新增 `kind`、`since`、`organizeOnly`;公开记录新增 `media.posterPath`、`sizeBytes`、`download`(只加字段)。MP 功能对照表见 `docs/runbook/organize.md`。
### 变更(SCR-2 刮削照 MP 简化:在目录里就地刮削)
- 文件管理里任意视频文件或目录都能「刮削…」(右键 / ⋯ 菜单、多选批量栏、详情),不要求先整理入库:服务端按路径识别作品(目录里已入库的直接用;没入库的按文件名与目录名查本地作品和 TMDB),在该目录里就地写 NFO 和图片。剧集目录递归到季目录与每集,季目录只写季与各集,单集文件只写该集,电影目录写每个视频的 NFO 与目录海报,蓝光原盘目录写 `<目录名>.nfo`。
- 认不准作品时对话框列出候选(可搜索),选一个后「继续刮削」;可打开「同时加入媒体库」,不打开也能刮削(直接用 TMDB 字段)。覆盖方式缺省按设置,对话框里可临时选「只补缺失 / 全部覆盖」。多选时逐项识别。
- 作品详情「重新刮削」「覆盖重写」与入库后自动刮削改为对作品目录刮削,和文件管理同一实现。
- 刮削记录简化为每次一条(目录、识别结果、写了哪些文件、跳过原因),作品详情显示该作品最近一条。去掉"只有已入库作品才能刮削"的限制;「刷新元数据」不再要求有已入库文件。
- 与 MP 的文件布局差分:用 MP `ScrapingChain.scrape_metadata` 的真实决策代码跑同一组目录对照 7 个场景,只有 3 处登记偏离(不写 backdrop.jpg 副本、剧照 `-thumb.jpg`、根下电影图片带视频名)。见 `docs/runbook/scrape.md`「与 MP 的差分」。
- 接口:`POST /files/scrape` 改为 `{items[{root,path,mediaEntityId?,external?}], mode?, addToLibrary?}` → `{records, needsChoice, skipped, pending, entities}`;新增 `GET /files/scrape-records?ids=`;`POST /files/scrape-batch` 去掉 `write`(只刷新元数据);`POST /library/{id}/scrape` 返回 `recordIds`;`GET /library/{id}` 的 `scrape` 改为刮削记录(带 `root` / `path` / `match`)。任务 `scrapeMedia` 升到 v2(输入 `{recordId}`)。迁移 `0058_scrape_record`(替代 `media_scrape`)。
### 新增(ID-3 用站点详情页的 ID 识别资源)
- 识别升级链:标题认不准(有歧义 / 没结果)时,资源有站点详情页且还没抓过,就抓一次详情(走详情缓存与站点限流,失败不影响识别)取 IMDb / TMDB / 豆瓣 ID,再按 ID 查 TMDB 确认作品;确认后照常回填资源、登记别名(守卫照旧)、关闭同资源的待识别项。
- 只在搜索结果、订阅相关的资源、池条目补全前、手动重新识别时抓;RSS 批量入库不抓(订阅相关的推迟到复查)。每站每小时上限可在设置 → 元数据 → 资源识别里调(缺省 10,0 = 不抓)。
- 站点给出的 IMDb / TMDB ID 作为强证据参与打分:标题对不上也能自动确认;年份或类型冲突时只作候选(与 MP 的差别登记在差分组 `site-ids-*`)。
- 详情只有豆瓣 ID 时,用缓存的豆瓣条目(来自站点详情页的豆瓣信息块或元数据补全的搜索摘要,不请求豆瓣)按标题 + 年份匹配 TMDB。
- 观众列表页的豆瓣链接抽成 `doubanId`(新增 UMT 扩展字段 `torrents.fields.doubanid`)。
### 变更
- 能从站点拿到 ID 的资源不再开「没识别出作品」事项;升级链还在排队(每站每小时限额已满)时不开事项、15 分钟内复查;已开的事项在资源被识别后自动关闭。
## [0.3.6] - 2026-09-30
### 新增(SEARCH-4 资源筛选对齐 MP)
- 搜索结果与站点资源的快速筛选新增 8 个维度:音频编码、字幕(中文 / 简体 / 繁体 / 英文…)、配音(国语 / 粤语)、特性(10bit / 50 帧以上 / 特别剪辑版)、年份、分类、大小分档、做种分档,都带计数、可多选、可组合。
- 筛选条顺序照 MP(站点、季/集、促销、编码、质量、HDR、分辨率、制作组),其余维度收进「更多筛选」(桌面宽弹层、手机抽屉)。原「版本」改叫「质量」。
- 解析器补「配音语言」字段(`audioLangs`:国语 / 粤语 / 英语)。
- MP 维度对照表见 `docs/runbook/search.md`「与 MP 的对照」。
### 变更
- 全站弹层、下拉选择、下拉菜单、对话框、抽屉改为不透明实底(不再半透明 + 背景模糊),文字压在列表上也看得清。
- 站点资源 Tab 的「做种」「大小」下拉(只筛已加载的结果)换成快速筛选里的分档,按全部本地资源计数和筛选。
## [0.3.5] - 2026-09-30
### 新增(SCR-1 刮削:NFO 与图片写进媒体库目录)
- 整理入库成功后可自动刮削:按作品写 NFO(电影 `<视频名>.nfo`,剧集 `tvshow.nfo` / 季目录 `season.nfo` / 每集 `<视频名>.nfo`,UTF-8、临时文件 + 改名原子写入),下载海报 `poster.jpg`、背景图 `fanart.jpg`、季海报(作品目录 `season01-poster.jpg` + 季目录 `poster.jpg`)和剧照 `<视频名>-thumb.jpg`。Emby、Jellyfin、Kodi 都能识别。元素与 MP `TmdbScraper` 对照(差分见 `apps/server/test/scrape/`),缺值不写。
- 设置 → 媒体库与目录 →「刮削」:入库后自动刮削(缺省关,同 MP)、已有文件「只补缺失 / 全部覆盖」、下载图片、下载剧照。
- 作品详情新增「刮削」:上次刮削时间、写了哪些文件、失败原因,「重新刮削」「覆盖重写」;文件管理菜单与详情新增「刮削」(与「刷新元数据」分开)。三处都排同一个后台任务 `scrapeMedia`(文件道),图片经图片缓存与出口代理下载、并发 4,失败只记该文件,不影响 NFO。
- 接口:`POST /library/{id}/scrape`、`GET /library/{id}` 的 `scrape`;`POST /files/scrape` 的 `writeNfo` / `images` 不再返回 `not_implemented`(排 `scrapeMedia`,返回 `queued`);`POST /files/scrape-batch` 新增 `write`。迁移 `0057_media_scrape`。见 `docs/runbook/scrape.md`。
### 新增(CF-2 Cloudflare 验证处理)
- 站点请求遇 Cloudflare 挑战(`cf-mitigated: challenge`,或 403 / 503 / 429 的挑战页)不再算凭据错误:不置账号失效、不开「登录失效」事项、不排自动重登;503 挑战不再算维护;健康检测记「需要人机验证」。
- 过挑战级联(只处理有登录态账号的站点;同站 30 分钟最多一次、同一时刻只处理一次;不接打码服务):浏览器用该账号的 profile 打开同一地址 → 等它自己过(≤ 15 秒)→ 「我是人类」复选框 / Turnstile 由系统发起视觉子流程点一下(最多 2 次,预算取设置,自动化总开关关闭时跳过)→ 选图 / 输码类转人工,待处理事项「<站点>需要你在原站视图里过一次验证」,接管过完交还即继续。
- 过了之后读回 `cf_clearance` 与浏览器 UA:账号 UA 跟随浏览器且两端出口一致时交给 HTTP(`__cf_bm` 仍不带),重试 1 次,按站点记复用是否有效;仍被挑战时这次页面请求改由浏览器导航取 HTML 交给原解析器,之后 6 小时该站页面请求直接走浏览器,到期再试 HTTP。
- 站点卡片 / 概览显示「Cloudflare:自动通过 / 浏览器代理中,至 hh:mm / 需要你验证」,原始记录进技术信息。
- camofox 插件新端点 `POST /umt/tabs/{tabId}/mouse-click`:`click_at` 发真实鼠标事件,跨域 iframe 里的 Turnstile 也点得到(需要重建 camofox 镜像)。
### 变更(CF-2 出口统一)
- 站点请求(适配器、RSS、登录、用户数据)不再隐式继承容器的 `HTTP(S)_PROXY`:站点没开代理明确直连,开了走站点 / 全局代理,与浏览器会话同一出口。TMDB、Brave、图片缓存等外网请求照旧按环境变量走代理,改为代码里显式指定。出口表见 `docs/runbook/sites.md`「出口」。
## [0.3.4] - 2026-09-30
## [0.3.3] - 2026-09-30
### 变更(MD-2 简介不回退英文)
- 作品、季、集的简介(以及作品标语)只回退到中文变体(缺省链 zh-CN → zh-SG → zh-TW → zh-HK),不再回退到 en-US;都没有就留空。标题、别名仍按完整回退链(可到 en-US)。排在第一个中文之前的语言照常用,链里没有中文时按原链。对照 MP:每集信息只按配置语言取,简介为空就为空。
- 设置 → 元数据 → TMDB 新增「简介回退到非中文」(`metadata.overviewNonChineseFallback`,缺省关),打开后恢复旧行为。
- 媒体详情:作品和每集没有简介时显示一行小字「暂无简介」。已有的英文简介在下次刷新时按新规则清掉。
- 存量重算脚本 `scripts/overview-recompute.ts`:找出语言不在简介链里的作品 / 季 / 集简介,不请求 TMDB,只用 `kv_cache` 里缓存的 TMDB 响应按新规则重算(缓存已淘汰的直接清空);缺省 dry-run,`--apply` 写库。见 `docs/runbook/metadata.md`「存量简介重算(MD-2)」。
### 变更(AG-4 智能体与浏览器零碎问题)
- 子会话系统提示与父会话一样要求思考、步骤说明和汇报都用中文(目标、工具结果是英文也一样)。
- `agent.spawn` 同目标去重:同一父会话里同一目标的子会话还在运行或 10 分钟内已完成时不再新建,返回已有子会话与结果摘要(`reused: true`)。
- 浏览器会话保活:桌面连接、人工接管、智能体会话正在用的会话每 2 分钟做一次只读调用(`BROWSER_KEEPALIVE_MS`,0 = 关闭),不再被 camofox 空闲 5 分钟回收;用完照常回收,保活时标签页已被回收按 BR-3 自愈重连。
- 会话页:概况条上方恒定一行会话统计(工具调用、MCP、已用 token、距上限剩余、费用);本轮进行中显示「思考中 · 已调用 N 次工具」,结束后并入进度行;汇报兜底不再列「换掉的标识」,原始汇报只在技术信息「原文」里。
### 新增(META-2 短剧元数据补全扩大来源)
- 元数据补全按来源分类抽取:百科(百度 / 搜狗 / 快懂百科、维基)、平台作品页(红果短剧、河马剧场、各视频平台)、豆瓣(只用搜索摘要,不读页面)、其它网站的搜索摘要(摘要模式:只看搜索引擎给的摘要,不打开聚合站网页)。每类来源一个抽取器(标题 / 别名、年份、集数、主演、简介、类型、平台、海报),每个字段带来源类别与置信度,多个网站给出同一值时叠加置信度,取最高的。
- 新增「主演」字段,应用时写进作品主演(没有 TMDB 人物 ID,不链接 TMDB)。
- 读网页前查 robots.txt(每个网站缓存 1 天),不允许的不读;遇到登录墙 / 验证码放弃该来源。
- 命中率:每次补全记录各类来源的结果数与是否命中;设置 → 元数据 → 资源识别 下方显示最近 30 天各来源的命中率,接口 `GET /identity/enrich-stats`。
- 设置「也用其它网站的搜索摘要」(`identity.enrichSnippetAllSites`,缺省开);补全白名单缺省加 `baike.com`、`kuaikaw.cn`(已保存过白名单的需手动加)。
- 真机验证:用户库 4 条短剧此前全部无结果,现在 4 条都从搜索摘要补到标题与年份,3 条有集数,4 条有主演(见 `docs/runbook/identity.md`「真机记录(META-2)」)。
### 变更(META-2)
- 补全的第二次搜索改为「标题 短剧 site:百科 / 豆瓣 / 平台」,摘要已够用时不再搜;只读结果标题 / 摘要含完整标题的网页(只有七成字对得上的首页、榜单页不再读)。
- 模型抽取改为候选之一:模型改写的值置信度 0.3,网页原文更可信时取原文(以前模型改写的简介会盖过原文)。
### 变更(AG-5 智能体提示词与 Skill)
- 系统提示分层:角色与边界 / 当前环境 / 能力地图 / Skill / 行为规则 / 汇报格式 / 本次目标,每层一个文件(`packages/agent/src/prompt/`),按会话类型(用户会话 / 巡检 / 后台调查 / 子会话 / 视觉子流程)选层。
- 「当前环境」:会话开始时把已接入的下载器、媒体服务器、站点、媒体库目录、订阅 / 下载任务计数、待处理数写进提示(名称 + 中文状态 + 相对时间,不含地址与凭证),智能体不再把"站点列表里没有"汇报成"没有下载器"。
- 汇报规则收紧:第一句就是结论、不超过 8 行、大小写 GB、时间写相对时间、不写 ID / hash / adapter / 英文状态码;被拒绝的动作只写一句「没做:…,需要你批准」;不说教。子会话思考与汇报用中文。
- 巡检、后台调查的只读白名单加上 `download.list`、`site.list`、`site.user_data`。
### 新增(AG-5)
- 6 个 Skill(`packages/agent/skills/`):巡检、收录一部作品、入库 / 整理问题排查、下载排查、订阅追更检查、数据清理与存储;每个写明适用意图、步骤、用到的能力、何时需要批准、汇报模板、不要做。用 Pi harness 的 Skill 格式加载,服务端按意图触发词载入(首轮进系统提示,追加消息换意图时附在消息前)。
- 只读能力 `download.list`:按状态 / 作品 / 名称列下载任务,附按状态计数,大小、进度、时间给人话;智能体先列再看,不再向用户要下载任务 ID 或种子 hash。
- 汇报核对 `lintReport` 与提示评测:fake 模型 8 条固定提示(e16),真实模型前后对比脚手架(`e16-agent-prompt-eval.real`,手动跑),记录见 `docs/design/agent-prompt-eval.md`。
## [0.3.2] - 2026-09-30
### 新增(BR-4 浏览器 UA 与指纹统一)
- 固定浏览器身份:浏览器镜像的 umt-cookies 插件首次启动时生成一套 Windows 指纹(UA、navigator、屏幕、WebGL、Windows 字体、随机种子)存进持久卷(`/root/.camofox/umt-identity.json`),之后每次启动复用,不再每次随机;Camoufox / Firefox 升级时只改 UA 与版本字段。修正上游字体配置路径,Windows 字体(含微软雅黑)按 Windows 渲染。新增 `GET /umt/identity`(访问凭据保护,只含 UA / OS / 版本 / 时间)。
- 站点请求 UA 跟随浏览器:列表 / 搜索 / 详情 / 下载种子 / 健康检测、RSS、登录、用户数据都带账号 UA,不再发 `Deno/2.9.7`。优先级:账号手动 > 待切换 > 设置里的全局 UA > 跟随浏览器(读不到浏览器身份时用同型 Windows Firefox UA)。站点账号页显示 UA 来源(跟随浏览器 / 手动填写 / 待切换),原始 UA 在技术信息里。
- 出口按站点统一:站点开了"使用代理"时浏览器会话也走同一代理,没开时直连;浏览器不再使用容器环境变量里的代理(`UMT_BROWSER_PROXY_MODE=env` 可退回)。插件新增 `PUT /umt/sessions/{userId}/proxy`。
- Cloudflare 验证 Cookie(`cf_clearance`、`__cf_bm`)只留在浏览器:回写站点账号时剔除,只记名字,站点请求不用。
### 变更(BR-4)
- 设置 → 站点默认 → User-Agent 缺省改为空(跟随浏览器),原缺省 Windows Chrome 140 去掉;挂站点的 RSS 与站点其它请求同一出口(站点开代理时 RSS 也走代理)。
- 迁移 0056:存量 Cookie / 账密账号标"待切换",继续用取得登录态时的旧 UA,下次重新登录或浏览器回写 Cookie 时 Cookie 与 UA 一起切换;设置里仍是旧缺省 UA 的清空。
- 上线需重建 app 与 camofox(`docker compose build app camofox && docker compose up -d app camofox`);camofox 只有插件层变化,不重新下载浏览器包。见 `docs/runbook/browser.md` §11。
## [0.3.1] - 2026-09-30
### 新增
- IO Worker 分道(WK-1):io worker 进程内分文件 / 网络 / 维护三条道,各自并发(缺省 2 / 4 / 1)、各自排队,文件道占满不挡网络任务;维护道在文件道或网络道有排队 / 运行时让路(连续让路 10 分钟放行一个),调度器里内联的清理、回填、保留期裁剪也走维护道。任务在 `defineTask({ lane })` 显式声明,归属表见 `docs/runbook/dev.md`「IO Worker 分道」,ci 逐项核对。
- 设置 → 自动化 → 高级 →「后台任务并发」:三条道的并发,保存后几秒内生效,不用重启;环境变量 `WORKER_FILE_CONCURRENCY` / `WORKER_NETWORK_CONCURRENCY` / `WORKER_MAINTENANCE_CONCURRENCY` 设了以变量为准。
- 运行状态页进程表按道显示「运行中/并发 · 排队」与维护道让路状态;心跳照常记录事件循环延迟(将来拆进程的判据)。
### 变更
- 下载计划并入下载面板(DL-3):去掉「下载计划」页签,旧地址(含 `?plan=` 与 `/downloads/plans/:id`)跳到下载面板并打开对应行;还没提交的下载作为「进行中」的行与下载任务按加入时间一起排并计入计数,状态写「等你批准」「等磁盘空间」「等开启自动化」「准备提交」,可直接批准 / 取消(等批准的同时在待处理里);下载详情新增「为什么下这个」(来源:订阅 / 智能体会话 / 手动;目的:补缺 / 升级(替换哪个版本)/ 换源;选中理由要点,原始评估进技术信息);没提交就结束的下载(失败 / 取消 / 过期)进作品的下载历史并写明原因;审批被拒、撤销或过期时草案随之结束。新增 `GET /acquisition-plans/{id}/why`、`POST /acquisition-plans/{id}/cancel`,面板接口行带 `kind`(task / plan)并支持 `planId`。界面与智能体能力标题不再出现"下载计划"(动作计数写"准备下载 N 个资源")。
- `WORKER_CONCURRENCY` 从 io 组总并发改为映射到网络道;compose 不再给它缺省值(缺省走设置页)。`worker` / `worker:agent` / `all` 角色与镜像入口不变。
### 变更(IA-2 导航与站点类型)
- 侧栏改为 4 组:概览 / 获取 / 整理 / 系统。「任务」移到系统组;站点、订阅、规则合成「获取」组(组名是 `nav.ts` 的 `ACQUIRE_GROUP_TITLE` 常量,改名只改一处);独立的 RSS 导航项取消。
- RSS 属于站点:站点详情新增「RSS」Tab,承载原 RSS 页的新建 / 编辑 / 启停 / 立即抓取 / 抓取状态,详情里加「最近条目」;原「抓取与 RSS」拆成「抓取」和「RSS」。旧 `/console/sources*` 链接跳到对应站点的 RSS Tab(`?feed=` 查所属站点后打开该 RSS)或站点列表;任务 / 业务任务里的 RSS 链接改指站点。
- 站点类型:站点新增 `kind`(PT 站 / 公开 BT 站 / 自定义 RSS 源;Torznab 索引器只定义结构,未实现),每种类型声明获取方式(搜索 / 列表抓取 / RSS / 详情页 / 登录 / 账号数据),实际可用 = 类型 ∩ 站点定义。站点列表可按类型筛选,详情按类型显示 Tab 与字段(自定义 RSS 源没有登录、账号、等级);添加站点第一步选类型,PT 站仍从站点定义库选。
- 服务端按获取方式调度:快照只排能抓列表的站点,RSS 只排能抓 RSS 的站点,账号数据 / 健康检测只扫有登录的站点,搜索站点只含能搜索的;不支持的登录 / 凭证 / 抓取请求返回 400。
- 不带站点新建 RSS(旧 API)时归入同主机的自定义 RSS 源站点;RSS 不能再移出站点。智能体 `site.list` 带站点类型与获取方式,系统提示同步"RSS 属于站点"。
- 迁移 0055:`site.kind`;旧的通用 RSS 站点 → 自定义 RSS 源;不属于任何站点的 RSS 按主机归入新建的自定义 RSS 源站点,下次抓取把条目写成资源。
### 修复(IA-2)
- 同一站点添加第二个 RSS 且都用缺省名称时,secret 名冲突导致 500。
### 变更(设置页,FIX-8)
- token 类数字(上下文窗口、上下文预算、最大输出、会话上限等)以 K 为单位输入,列表按 K / M 显示;存储仍为 token 数。
- 密钥类字段(模型服务、TMDB、Brave、qB、站点、Emby)已保存时显示「已设置 ••••••••」(有末 4 位提示时带上),留空保存不变,「清除」需确认;明文不下发前端。服务端统一"空串不变、null 清除"。
### 修复(v0.3.0 核对问题,FIX-7)
- 智能体汇报展示层兜底:UUID、能力 ID、原因码换成名称 / 人话(旧会话同样生效)。
- 概况条"全部完成"不再把跳过的步骤算进完成数;子会话数量按实际会话树计(不含失败的派发)。
- 巡检目标不再原样显示 `{{now}}` 等模板占位符。
- 智能体新增 `downloader.list`,不再误报"下载器不在系统内"。
- 字幕文件不再标为主文件;版本行悬浮按钮不遮挡大小 / 时间;作品页「收录版本」文案区分;会话标题里的时间与原因码转人话;种子详情去掉原始错误码。
- 文件管理目录树改为与主面板同款的圆角卡片,头部与工具栏对齐。
- 站点更新凭据时不再误删两步验证密钥与 User-Agent。
## [0.3.0] - 2026-09-29
### 新增
- 搜索快速筛选(SEARCH-3 / POLISH-1):搜索结果与站点资源列表共用一行多选筛选——分辨率、编码、版本、站点、促销、HDR、H&R、制作组、季 / 集,选项带计数,同维度"或"、跨维度"且",记住上次选择;`qf` 参数见 `docs/runbook/search.md`。
- 入库版本可见(LIBV-1):作品详情每集显示入库版本规格(分辨率 · 来源 · 编码 · HDR · 制作组 · 大小),一集多个版本并列;季 / 作品汇总;配了收录版本时标出符合 / 缺失 / 可升级;`GET /library/{id}/versions`;旧文件规格回填脚本(缺省只读)。
- 下载面板(DL-2):总速度、每个种子的 ↓/↑ 速度与剩余时间;「进行中 / 已完成」分段,默认进行中;已完成显示分享率与整理结果;`GET /download-tasks/board`。
- 文件管理(FM-2):宽布局,目录树贴左、可拖宽、可收起;预览文本 / NFO(GBK、UTF-16 自动识别)、字幕前 200 行、.torrent 文件列表(隐藏 passkey)、图片;调研见 `file-preview-research`(已删除,见 git `ceb66f8`)。
- 种子详情可读(DETAIL-1):简介拆成信息块与正文,MediaInfo / BDInfo 转规格概要,截图画廊,文件清单目录树;旧缓存现算,不重抓。
- qB 兼容(QB-1):qB 5.0–5.2 登录(200 / 204、Cookie 名取自响应),认证方式可选账号密码 / API Key / 不认证;接管任务按文件名与种子名识别,识别不出建带候选的待处理;冲突可选替换 / 保留两者 / 跳过;下载历史(迁移 0054)。
- 数据整理(DH-1):full 刷新含季 0(`metadata.includeSpecials`,缺省开);对上 TMDB 结构的临时单元转正式(迁移 0053);重复单元合并(`identity-cleanup.ts --merge-duplicates`,缺省只读),懒建加锁。
### 变更(去 AI 味,DEAI-2 / AGUI-3)
- 术语:「版本目标」→「收录版本」,「Agent 上游」→「模型服务」,界面上的 Agent →「智能体」;见 `docs/design/glossary.md`。
- ID、hash、token、耗时、原始字段默认折进「技术信息」(设置 → 界面可默认展开);内部原因码统一转成人话(`packages/contracts/src/reasons.ts`)。
- 首页只回答"在忙什么 / 要我处理什么 / 最近入库了什么";计划页智能体巡检置顶,自动任务按分类分组折叠,维护类收成「数据清理」。
- 待处理"没识别出作品"主按钮为「指定作品」。
- 智能体对话重做:每轮工具步骤合成一行人话进度;被拒调用变成一行「没做…[批准并重试]」;最终回复不再重复显示;去掉右侧栏;方案卡一键选定,绑定同一计划时选定即批准(只认控制台管理员会话,超时自动选不算批准,删除 / 覆盖仍单独确认);「先看方案」改为单次指令 `/先给方案`;抽屉去 Tab,历史弹层「等你处理」置顶;汇报格式写进系统提示。
### 修复(本版)
- 超预算待处理事项先于会话终态写入,消除 E15 偶发失败。
- 下载面板「已完成」里未整理的外部任务不再显示「待整理」。
### 新增(v0.2.4 之后、INT-3)
- 媒体详情页对照 MP:季 / 集列表、每集标题 / 简介 / 播出日 / 剧照,作品库与 TMDB 预览共用;标题 / 简介按设置 `metadata.languages` 回退(缺省 zh-CN → zh-SG → zh-TW → zh-HK → en-US),另存中文名;`POST /media-entities/{id}/refresh?full=1` 拉全部季的每集信息(MD-1)。
- 新建档(订阅建档、搜索 / TMDB 预览页建档、整理向导、手动指定未登记的 TMDB 身份)当场按语言链取标题 / 简介,并自动入队一次 full 刷新(INT-3)。
- 存储预算与保留:`settings.storage`(PG / 图片 / 备份 / 会话证据预算,各类流水保留天数,缓存有效期)、定时清理任务、`GET /system/storage` 与健康页存储等级,图片缓存按容量 LRU;设置页「自动化 → 存储与保留」可改(CACHE-2 / INT-3)。
- 计划页从任务页拆出:自动任务紧凑列表 + Agent 巡检卡片;`GET /schedules` 给每个巡检带最近 100 次会话的费用与模型汇总(FE-6 / INT-3)。
### 变更
- `cache.tmdbMaxSize` 缺省 256 → 5000,迁移 0051 把仍是旧缺省的已存设置一并调整;`cache.tmdbTtlHours`、`cache.emptyResultTtlSec`、`identity.poolArchiveDays` 弃用,设置页不再显示(由 `storage.cacheTtl` / `storage.retentionDays` 取代)(CACHE-2 / INT-3)。
- 设置页布局:分区标题层级、标签左 / 控件右的表单行、每块独立保存条、吸顶导航与锚点定位(FE-7)。
- 部署:postgres 内存参数与容器内存上限(CACHE-2)。
### 修复(BR-3 浏览器服务重启后自愈)
- camofox 重启后会话操作遇到 404 / 410 自动重连:重新注入账号 Cookie、新开标签页回到原地址并重试一次;失败返回 503 `browser_reconnect_failed`。`POST /browser/sessions/{id}/reconnect` 幂等。
- 桌面模式打开时先确认会话;画面 5 秒未出图自动重连一次(INT-3)。
### 修复(HH-2 憨憨 RSS 与详情页)
- RSS 标题「[分类]名称[副标题][大小][上传者]」在站点适配层拆开;旧 RSS 行按需重新规范化;详情页补全豆瓣信息、截图、MediaInfo 里的 IMDb / TMDB、上传时间与文件清单。
- 原站视图空闲时显示「自动化」,最近有自动化操作才显示「Agent」。
### 修复(ID-2 身份匹配对照 MoviePilot)
- 憨憨 RSS 标题的分类前缀「[电视剧]」「[动漫]」「[音乐]」被当成中文名,经别名召回把多部剧的资源并入同一部作品;分类词、单字、停用词不再作为片名或别名参与比对,自动绑定也不再登记它们。存量用 `scripts/identity-reevaluate.ts --rollback-wrong` 撤销(缺省只读)。
- 副标题与 RSS 内嵌描述里的中文名、别名参与匹配;中英名任一精确 + 年份精确即高证据,续作 / 章节序号与季号参与区分,同级多候选按年份精确、命中的名称文字种数取舍;评分权重成表可覆盖。
- `Travis - 12 Memories` 不再被当成第 12 集。
- 站点资源标题更新后按新标题重新解析并重新识别,不能确认时撤销原自动绑定。
- 憨憨真实标题差分集(113 条)对照 MP:修前一致 88.5%,修后 100%(含 1 条 MP 误识别),见 `docs/porting/moviepilot-identity-match.md`。
### 已知限制
需求逐条覆盖见 `11-requirements-coverage`(已删除,见 git `ceb66f8`):当前相当于 REQ 的 M0 大部分 + M1(仅 mock 环境)+ M2 约三分之一。
- 综艺只识别内容类型与上 / 下分段,不计算正片覆盖,也没有节目级附加内容策略。
- `require_distinct_asset` 只保存设置,同一个文件仍可同时满足两个版本目标。
- 旧库只有库根"只登记 / 纳管"两种模式,没有首次扫描登记和启用前的影响预览。
- Agent 不做主观选片,也没有规则学习与样本回放;策略预览只对最近 200 条已识别资源试算。
- Emby 查询结果不参与收录决策,也没有本地资产与 Emby 的对账。
- 站点 HTTP 访问失败不会自动转浏览器。
- 观众、馒头、CHD 只对 mock 与解析样本验证过,没有连真实账号。
- 用户委托换源时,新提交与原任务的处置不在同一个计划里。
- 定时任务里的"备份"是占位,备份靠宿主机 cron 调 `umt backup`,恢复没有自动化演练。
- 没有身份巡检;同一挂载根离线引起的多条待处理不按根因合并。
- 没有调查整个 qB 实例(含未纳管任务)的能力。
- AT18(恶意标题)、AT29(部分入库不清理)、AT42(未纳管占用)、AT73(多下载器同 hash)与流程版本升级没有测试。
## [0.2.4] - 2026-09-29
### 修复(v0.2.3 真机验收)
- 内置 Agent 巡检模板的能力白名单未包含新增只读能力(迁移 0045 更新)。
- 仅授权 `browser.solve_challenge` 时子流程无法执行点击。
- api 与 worker 进程的浏览器会话状态不同步。
- 浏览器桌面镜像:APT 换源脚本在无 debian.sources 的底座上失败。
## [0.2.3] - 2026-09-29
### 浏览器
- 原站视图改为 Webtop 4.0(Wayland/Selkies)真实远程桌面:同会话(桌面里的窗口就是 Agent 驱动的 camofox),中日文字体、输入法上屏、剪贴板双向,只读/接管口令按人工租约注入;非 HTTPS 或旧镜像自动回退截图模式。
- 视觉自动化闭环:`browser.screenshot` 以图片喂视觉模型,`browser.click_at/type_at/scroll/wait` 按视口坐标操作,`browser.solve_challenge` 有界子流程;二次验证立即转人工。
### Agent
- 新增只读能力 `subscription.list`、`decision.list`、`download.inspect`;`download.plan` 审批判定与授权器一致;超预算会话标注与同根因合并;汇报 Markdown 渲染;系统提示与能力描述补充(中文、参数类型、禁止无意义探查)。
- 上游模型列表一键获取/刷新(远程优先、静态回退),Brave 网页搜索能力 `web.search`/`web.fetch`(白名单抓取)。
- 真实上游验证(OpenCode Go / DeepSeek V4.1 Flash)发现并修复:站点缺失时下载提交无限重试;恢复失败误记为未执行;识别按原名比对;从 TMDB 候选建订阅丢 id;上游测试补全带 sessionId。
### 部署
- camofox 随栈默认启动(本地构建 1.17.0);compose 网段固定 `UMT_SUBNET`;可选 `tls` profile(Caddy 自签或 ACME);容器经宿主代理中继访问境外站点(runbook)。
## [0.2.2] - 2026-09-28
### 修复
- 编译产物启动即 `ERR_MODULE_NOT_FOUND`:web 的 `shadcn` 开发依赖带进第二份 `@modelcontextprotocol/[email protected]`(zod@3),`deno compile --exclude-unused-npm` 嵌入的目录与裁剪后快照解析的路径不一致。去掉 `shadcn` 依赖,只把它的 `tailwind.css` 拷成 `apps/web/app/shadcn-tailwind.css`,MCP SDK 只剩一份。
- 编译产物自检:`scripts/check-compiled-binary.sh` 用空环境跑 `--role preflight`,必须加载完整模块图并在配置校验处以退出码 2 结束;已接入 `deno task ci`(`check:binary`)与 Dockerfile 构建阶段。
- 运行状态页把容器重建前留下的旧心跳行当成"N 个进程超过 45 秒没有心跳"报警。`GET /system/health` 现在把进程分成当前实例(最近 10 分钟有心跳的 host 上、同 host 同 kind 最新启动且未退出的进程)与已下线实例,45 秒 stale 判定与告警只看当前实例;已下线实例放在新字段 `retiredProcesses[]`,不计入 `level`,页面折叠显示。横幅按角色报警,如「io worker 45 秒没有心跳」。
- 进程正常退出(SIGTERM / SIGINT)时把自己的心跳行标 `stopped_at`(迁移 0043),退出后立即不再当活进程;重启后 upsert 清回 null。纯 api 进程退出时也会停心跳写入器。
- 心跳清理改为定时任务 `system.heartbeat_cleanup`(维护组,1 小时):删 24 小时没有心跳的进程行和 7 天前的采样;写入器不再自己裁剪。
## [0.2.0] - 2026-09-28
Agent 上游全覆盖与订阅登录、控制台信息架构重排、定时任务看板、全站文案第二轮审校;W9 与前端波补上站点中心、订阅重做、统一规则、命名模板、全局搜索、文件管理 v2 与统一任务页。基线见 `08-v0.2-closeout`(已删除,见 git `ceb66f8`)(W8-A 与"W10 集成记录")、`09-visual-qa`(已删除,见 git `ceb66f8`)、`docs/design/{console-ia,site-center,subscriptions,naming-template,file-manager-v2,pi-providers,agent-ui-reference}.md`、`docs/runbook/{schedules,agent,sites,rules}.md`。
### Agent
- 全局入口:侧栏顶部常驻 Agent 入口(展开与折叠态均带活跃会话数角标);右下角悬浮按钮(带活跃计数、最新状态摘要),在 Agent 会话页与迷你坞展开时隐藏;`Ctrl/Cmd+J` 切换抽屉、`Esc` 关闭,打开即聚焦输入框;抽屉首屏给出随页面变化的快捷目标。
- Agent 上游:新增 `pi_upstream` 表与 CRUD,一个上游 = 一个 pi provider(41 个内置之一,或 `openai-compatible` 自定义兼容端点,或 `fake`)+ 一份凭证;同一 provider 可建多个上游,各自独立凭证存储;`authKind` 分 `api_key` / `oauth` / `none`;默认上游可指定,`runAgent` 只从上游选模型。
- 订阅登录:8 种(Anthropic Claude Pro/Max、OpenAI Codex、GitHub Copilot、xAI、Kimi Code、Meta Muse、OpenRouter、Radius),browser 与 device 两种交互,登录会话 15 分钟;条款提示只陈述事实(借用官方客户端身份、可能违反条款、有限流或封号风险)。
- 设置页 Agent 分区:上游列表、新建向导(选 provider → 凭据与模型 → 登录 / 测试 / 设默认)、编辑抽屉(登录 / 重新登录 / 退出、测试、设默认、删除)。
- 子会话:`agent.spawn` 派生子会话(独立 agent_run,同一 runAgent 任务),`agent.await` 取子会话状态与脱敏汇报;能力白名单继承父会话并取交集;并发上限 `maxConcurrent`、派生层数上限 `maxDepth`、单会话最多 10 个子会话;预算从父会话划拨;中止父会话递归取消未结束子会话。
- `agent.await` 落定时挂起会话而不占 worker 槽:`drive` 返回 `suspended`,由 `waitForFact` 每 2 秒查一次子会话落定 / 超时 / 父会话取消,再以 `resumedAwaits` 重开会话续跑;单会话最多挂起 100 次。
- 没有候选的待识别资源(无法解析,或候选为 0,或查询失败且自动复查已停)开 `identity_unresolved` 待处理事项:可手动指定 TMDB ID、选本地作品或忽略。
- 旧 `settings.pi.provider / baseUrl / model / thinkingLevel / apiKeySecretRef` 弃用:schema 保留兼容旧数据,`PATCH /settings` 丢弃,设置分区不再展示;`runAgent` 没有上游直接失败并提示「未配置 Agent 上游」。
- Agent 汇报里的下载链接改指向 `/console/downloads/:id`,不再经 `/console/tasks/:id` 404 探测再跳转。
### 控制台信息架构
- IA-3 定稿(前端波 FE-1):侧栏 5 组 14 项(概览、资源、订阅、整理、系统);待处理不进侧栏,改为顶栏收件箱(角标 + 按类型分组的下拉)。
- 引擎面板、定时任务、身份与元数据不再单独入口;旧地址全部重定向到任务页、任务页"计划"页签和媒体概览。
- 统一"任务"页:定时、事件、手动、Agent 触发的运行在一条流里,页签为全部 / 进行中 / 失败 / 计划,来源与业务对象可筛选。
- 任务详情抽屉:业务摘要、时间线、相关审计,引擎步骤折叠在最后;未结束可取消,已结束可重跑。
- 首页按正在进行、需要处理、媒体概览、计划、最近完成与失败、缓存与保留、来源健康、运行状态重组。
- 新增运行状态页:进程心跳、事件循环延迟、SSE 连接数、数据库、磁盘与挂载根,带 1 小时到 7 天的趋势。
- 以下为 IA-1 / IA-2 阶段的调整,部分入口已被 IA-3 收编:
- 侧栏改为 7 组 19 项(概览、资源、订阅、下载、整理、Agent、系统),按业务流程排列;新增"定时任务"入口。
- 站点工作台合并快照与账号:详情页 4 个页签(整理视图 / 原站视图 / 快照与 Feed / 账号)。
- 原"下载与任务"拆分为下载队列、下载计划、业务任务三页;订阅页"收录策略"页签独立为收录规则页。
- 身份判定收口到待处理中心:身份页"待识别"改为只读,已进待处理的行标注跳转,判定动作只在待处理执行。
- 设置页改为 9 个左侧分区(自动化、站点与账号、下载器、媒体库与目录、媒体服务器、元数据、Agent、API Key、账户与安全),用 URL hash 定位到分区与节;旧 `?tab=` 全部重定向到新分区 hash,`settingsPath()` 直接生成 `#分区[/节]`。
### 定时任务看板
- `scheduled_job` / `scheduled_job_run` 表驱动全部周期任务,worker(io 组)内唯一调度器按表调度(`pg_try_advisory_lock` 选出执行者);控制台"定时任务"页(`/console/schedules`)查看与调整。
- 已登记 16 个任务,分 5 组(采集、下载、整理、维护、Agent);Agent 组含 3 个默认关闭的巡检(待处理巡检、下载诊断、订阅与站点周报)。
- 模块自建计时器全部并入注册表:`pi.token_refresh`(上游登录刷新,维护组,10 分钟)与 `auth.cleanup`(登录会话清理,维护组,1 小时)改为 `registerScheduledJob`,模块里不再有 `setInterval`。
- 支持立即执行、跳过本次、开关与周期自定义(`customized` 标记,改过之后再登记不覆盖,`PATCH {reset:true}` 恢复默认);自定义巡检可增删,内置任务只能停用。
- 调度器中断恢复:新执行者拿到锁时,把上一个执行者留下的 `running` 状态改为 `failed`。
### 站点中心
- 站点页是站点的唯一入口:添加站点向导、站点卡片与列表、单站详情。
- 凭证管理:账密、Cookie、API Key(馒头)、Passkey、TOTP,同账号同类凭证原地替换。
- 账号数据:上次登录、上传 / 下载、分享率、等级、VIP、账号状态,新表 `site_user_data`(迁移 0031)保存历史并画走势图。
- NexusPHP 账密登录走 takelogin;验证码或二次验证失败时开待处理事项,提示改用 Cookie。
- 手动"检测健康"与"用凭证刷新登录状态";Agent 能力新增 `site.list`、`site.health_check`、`site.refresh_login`、`site.user_data`,执行类需要持续授权。
### 订阅
- 订阅总览按状态分组(追更中、待搜索、已完成、暂停、待定),可按上次更新和缺集数排序。
- 覆盖矩阵:每条订阅对照库内已有和订阅要求,按季 / 集和版本目标逐格显示。
- 多版本目标逐个显示缺失,可开"自动补全其他版本"并设补全预算。
- 订阅表单 v2:基本与高级两页,旧字段读入时归一化。
### 规则
- 收录策略与偏好标签合为一个"规则"页:硬条件、软偏好、优先级阶梯、排除分层显示。
- 规则组 `rule_group` / `rule_atom`(迁移 0033)与 `/rules` 端点;兼容 MoviePilot 规则字符串的解析与序列化,内置关键字。
- 规则字符串与分层卡片双向同步;可对最近已识别的资源或粘贴的标题试算命中层与拒绝原因。
- 偏好标签作为规则的展示形态保留抑制记录;`/console/preferences` 重定向到规则页。
- 升级判断按订阅引用的规则组重算当前资产的优先级。
### 命名模板
- 模板引擎:Jinja 安全子集,支持 MoviePilot 的命名变量与目录布局。
- 全局、库根、作品三级覆盖,模板按版本保存(迁移 0032);整理与文件管理按覆盖链生成目标路径。
- 设置页命名表单:变量清单、示例、实时预览;库根和作品可单独覆盖。
### 全局搜索
- `GET /search` 聚合本地作品、TMDB 候选、已启用站点的资源(限流、15 秒超时、并发合并、短缓存、库存叠加)与页面跳转。
- 顶栏搜索框与 `Ctrl/⌘+K` 命令面板;`/console/search` 结果页可按站点、分辨率、来源、大小、免费、H&R 筛选和排序,资源行可下载或交给 Agent。
### 文件管理 v2
- 后端补齐 G1–G9:按 TMDB 候选就地建作品、最小体积(设置项 `organize.minSizeBytes`)、目标已存在时的处理、命名来源、建议文件名。
- 目录树可折叠,下载目录在前;列表显示作品与季集、解析提示、目录计数;右键菜单按适用性显示或禁用并说明原因。
- 共享整理向导:文件与作品 → 选项 → 预览并执行;文件管理、下载任务、整理记录都从这里整理。
- 目录展开成逐个视频整理时,同目录同主干的字幕和外挂音轨随行进计划。
- 整理向导执行多组后跳到 `/console/organize?ids=`,只列本次的记录。
### 实时与系统
- outbox 事件(Feed、待处理、下载、整理)投递成功后镜像到 SSE,首页、收件箱、任务流、Feed 列表随之刷新。
- 进程心跳表与 `/system/health`、健康历史;引擎 runs 补关联业务对象与触发来源。
- `/dashboard` 补作品、剧集、季、集、资产计数与版本目标满足率。
- `/engine/runs` 支持 `triggeredBy` 筛选与多值 `status`,任务页的来源筛选和"进行中"页签改为服务端分页。
### 文案与术语
- 全站第二轮文案审校:控制台、设置、Agent、服务端消息统一术语表用词(待处理 / 待识别 / 整理记录 / 运行记录 / 凭证 / 子会话 / Agent 上游),精简说明文字、空态、确认按钮与 toast。
- 内置 Agent 巡检的目标模板改短、改具体。
- 实例(下载器 / 媒体服务器)CRUD 报错改用可读名词,不再显示表名。
- 审计日志补 `pi_upstream` / 定时任务 / 持续授权相关动作的显示名。
- 术语表新增:上游、订阅登录、凭证、定时任务、巡检、运行记录、子会话、停止、持续授权。
### 修复
- 设置页深链改用分区 hash 定位,不再依赖 `?tab=` 查询参数(旧链接仍可打开,经重定向落到新分区)。
- Agent 汇报的下载任务链接直接指向下载详情页,不再先探测业务任务详情再判断是否为下载任务。
- 生产容器静态 ffprobe 升级到 9.0.2;`.gitignore` 忽略 compose override 文件。
- 视觉走查 17 项(`09-visual-qa`(已删除,见 git `ceb66f8`)):改密时旧密码错误不再被踢回登录页;预览失败时不能再执行整理;手机上 Feed 表不再把操作列挤出屏幕;操作者、原因、用途等不再显示内部 id 与英文代码。
- 手动整理成功入库后,处于"需处理"的版本目标回到核验,再按实际入库资产落定;同一下载任务的整理冲突事项自动关闭。
- 自定义 Base URL 的 Agent 上游"测试"不再把状态改成可用,提示用"最小补全"确认端点可达。
- 新作品首次下载的计划用途记为"补缺",不再是"升级"。
- 按 TMDB 建档时同事务写入元数据,别名按规范化文本去重。
- 更新站点账号凭证不再因 secret 重名报 500;馒头刷新登录在站点地址是 IP 时不再拼出非法地址。
- 表单保存失败时提示第一处问题并滚动到出错字段;移动 / 复制选到源所在目录时直接提示,不再发出注定失败的预览请求。
- 数据库迁移只内省目标 schema,并行测试在共用库上删 schema 时不再偶发"schema 不存在"。
### 已知限制
完整清单见 `08-v0.2-closeout`(已删除,见 git `ceb66f8`)"仍遗留"节。
- 41 个 provider 里只有 fake 与 OpenAI 兼容本地端点有自动化覆盖;8 种订阅登录只测了 fake 的 OAuth 状态机;Codex `_randomBytes` 在 Deno 下的行为待 spike(`docs/design/pi-providers.md`)。
- `agent.spawn {await:true}` 仍在进程内轮询等待,占 worker 槽到超时;要挂起需要和 `agent.await` 相同的关闭会话 + 重放机制,但 spawn 是 replay=never,重放会得到"结果未知",需另行设计。
- 子会话挂起期间父会话状态保持 `running`(避免被祖先会话的 `agent.await` 当成已落定);运行时长预算按每段 drive 计,不含挂起等待。
- 查询失败但仍在自动复查期内的资源不开待识别事项,避免 TMDB 抖动刷屏,复查耗尽后才开。
- 身份页"待识别"详情抽屉的提示句仍写"选择候选或忽略",未识别类(无候选)读起来不准确,留给下一轮文案。
- 旧 `settings.pi` 字段只是弃用未删除,真正删除需要一次迁移清理里面的旧键。
- 原站视图仍是占位(IA-1 遗留)。
- 观众站定义没有 H&R 选择器,资源的 H&R 一律显示"未知"(视觉走查 U8)。
- 界面文案中文句子里的半角 `,;:` 与全角 `。` 并存,尚未定全站标点规范(视觉走查 U11)。
- Agent 悬浮按钮在滚动途中仍会盖住页面右下角的控件,页面末尾已留出高度(视觉走查 U6)。
- 订阅还没有 `subscription.*` outbox 事件,订阅页不随后台变化实时刷新。
- `/engine/runs` 的 `triggeredBy` 在服务端逐行推断后筛选,单次请求最多检查 2000 行,命中稀少时一页可能少于 `limit`。
- 定时任务运行记录没有对应的引擎 run id,卡片与任务之间按业务对象关联。
- 控制台账户弹层的二次验证(TOTP)开启时只显示密钥与 otpauth 链接,不渲染二维码。
## [0.1.0] - 2026-09-28
第一个可用版本:REQ v0.7 的 M0 + M1 纵切。全链路在没有真实 PT 账号的情况下用 mock(RSS / 站点 / TMDB / qBittorrent / Emby)验证。范围与验收依据见 `00-first-version-plan`(已删除,见 git `ceb66f8`) §3.1 和 `04-v0.1-acceptance`(已删除,见 git `ceb66f8`)。
### W0 底座
- Deno workspace 单仓(`apps/server`、`apps/web`、`packages/{adapters,agent,contracts,db,domain,mapping,tasks,testkit}`),迁入 uhd_web 设计系统。
- OpenWorkflow 与 Pi SDK 兼容性 spike,结论写入 ADR-002 / ADR-003;Deno 2.9.7 + TypeScript 7 spike 写入 ADR-004。
- MoviePilot / MovieClaw 迁移对照账本(识别、刮削、转移入库、站点框架)。
### W1 领域与适配
- `@umt/domain`:发布标题解析、身份判定、Slot 状态机与完成条件、收录模式判定、路径模板与路径绑定、整理计划、下载状态机,全部是纯函数。
- `@umt/adapters`:qBittorrent(多实例、管理标签、带数据删除前的安全检查)、文件系统(Copy/Move、跨卷 Copy→核验→删源、EXDEV 不静默降级、全量 sha256)、TMDB、Emby、RSS、PT 站点(NexusPHP 观众、馒头 API,移植 MoviePilot 开放站点框架)。`@umt/testkit` 提供对应 mock。
- `@umt/db`:36 张表的全量迁移;`@umt/contracts`:共享 zod 契约与 API 注册表;`@umt/mapping`:domain 与 contracts 之间的映射集中在一处。
- `@umt/tasks`:基于 OpenWorkflow 的持久任务引擎、任务注册表、outbox 中继、操作账本 fencing(旧 attempt 的提交会被拒绝)。
- `@umt/agent`:能力注册中心、Pi AgentRuntimePort、fake 模型、输出脱敏。
### W2 服务编排
- 认证与设置:管理员登录门禁(argon2id、会话 cookie、CSRF 双提交、登录限速、可选 TOTP)、API Key scope(read / organize.read / organize.execute / admin)、密钥加密存储、实例与路径映射、审计、PG 通知驱动的 SSE(带序号,可补读)、自动化总开关与只读对账模式、工作流引擎面板 API。
- 来源与身份:站点与 Feed 管理、多 RSS 抓取与多层去重、站点快照与实时补查、TMDB 识别与本地实体优先、待识别池、人工纠错映射。
- 规则、下载与入库:订阅、Slot、策略版本(发布即生成持续授权)、确定性 evaluateAcquisition、每日预算与并发、qB 同步与标签接管、缓存卷硬阈值与恢复水位、verifyAndImport(Copy/Move)、路径绑定固定、整理记录与公开增量 API、媒体库与首页聚合。
- Agent:14 个能力接到服务,服务端授权(持续授权 / 一次性审批),会话 API + SSE 增量,后台事件触发有界调查任务。
### W3 控制台
- 20 个路由:首页、媒体库、订阅与规则、偏好标签、待处理中心、身份与元数据、PT 站点工作台、来源 / Feed / 快照、下载与任务、整理记录、Agent 会话、系统设置、工作流引擎面板、审计。
### W4 集成验收与修复
- 单容器打包(API + worker + 静态前端,compose 只有 app 和 pg),`DATA_DIR`,备份与恢复脚本,runbook。
- 控制台接入真实端点;Playwright 全路由冒烟(`deno task test:web:smoke`)。
- BrowserProvider 接口与 camofox-browser 适配骨架(只落接口)。
- 主循环解耦:后台循环只做编排,清理 / 对账 / 入库一律入队到任务引擎;io / agent worker 分组;外部 IO 能力调用限流;事件循环延迟探针。
- 安全修复:审批只能由管理员会话决定,共享一份脱敏表,TMDB 错误信息不带 api_key,生产构建不能打开 Agent mock。
- 授权内异常调查与恢复:有持续授权时,调查结论可在授权范围内自动重试并继续。
- 手动整理守卫(`POST /organization-records`):`sourcePaths` 必须在已登记的媒体库根或下载器路径映射之下(realpath 后按目录前缀匹配,拒绝 `..` 与符号链接逃逸,dryRun 同样受限);Move 需要管理员会话,或 API Key 同时有覆盖目标作品的持续授权 / 与本次请求一致的一次性审批;来源是纳管下载任务且做种义务未满足时返回 409 并建待处理,不改成 Copy。
- 剧集完成判定:总集数未知(集单元都是临时单元)时 Slot 不判满足,订阅继续追踪;覆盖按实际文件登记,整季包不因包名覆盖整季;已在库的相同文件算作核验到的内容。
- 工作流引擎面板支持重跑:`POST /engine/runs/{id}/retry`(仅 admin,新幂等键 `retry:<id>:<序号>`,写审计),run 详情页有"重跑"按钮。
- 新增 e2e:E7 常规剧集纵切、E8 管理标签移除与 qB 任务消失(AT24)。
### 文件管理(`/console/files`,00 §6 追加范围)
- 后端 `/files` 模块共 18 个端点:根 / 列表 / stat(行内带资产、Slot、下载任务状态)、mkdir、rename、move、copy、organize、delete、回收站(列表 / 还原 / 还原到… / 清理)、identify、probe、scrape、records、download。
- 路径守卫:realpath 必须落在已登记根内,拒绝 `..`、URL 编码、符号链接逃逸与对根本身的写操作;执行前再做一次 realpath(TOCTOU);根离线返回 503,不返回空列表;fs 竞态错误映射为 503/404/403/400。
- 两阶段写操作:move / copy / organize / delete 先 dryRun 产出 `planId` 与源事实指纹,执行时只认 planId,源变化返回 `plan_stale`;全部写操作带幂等键并写审计。
- move / copy 经 `planImport` 的 `transfer` 变体生成整理记录,由 `verifyAndImport` 执行:逐文件账本可续跑、经 fsproxy、跨卷目录 Move 为逐文件 Copy→核验→删源;资产位置逐文件跟随,整目录搬走时修订路径绑定。请求最多等待 `FILES_TRANSFER_WAIT_SEC`,超出返回 `executed.pending`。
- organize 支持逐项覆盖季 / 集 / 内容单元 / 目标目录 / 操作 / Slot;delete / 回收站 / 还原写整理记录(迁移 0026)。
- 回收站:`<root>/.umt-trash/<day>/<uuid>/`,`trash_item` 表(迁移 0024),删除前核对引用,做种中的文件不能改名、删除或 Move;过期清理由 `purgeTrash` 任务执行。永久删除默认关闭(`FILES_ALLOW_PERMANENT_DELETE`)且只接受管理员会话;API Key 删除每次都要一次性审批。
- download:仅管理员会话,nfo / 字幕 / 图片白名单,`FILES_DOWNLOAD_MAX_BYTES` 上限,`nosniff` + `CSP sandbox`,写审计。
- 前端:目录树、虚拟滚动网格、面包屑、排序与 glob 搜索、多选 / 右键菜单 / 拖拽后 dryRun 预览、键盘操作(F2 / Del / Shift 区间 / Ctrl+A)、离线与空态、移动端布局;改名 / 移动 / 复制 / 删除对话框,4 步整理向导(未决项挡住下一步),回收站页;SSE `files.changed` 触发刷新。`?mock=1` 内存后端只在 DEV 构建生效。
- 运行手册 `docs/runbook/files.md`。
### 订阅增强(对照 MoviePilot,`05-subscription-gap`(已删除,见 git `ceb66f8`))
- 总集数账本:季单元记录 `episode_total` 及来源 / 锁定 / 时间(迁移 0025);`resolveEpisodeTotal` 只增不减,TMDB 回退时以已覆盖的最大集号为下限,手动值可锁定。
- 完成判定按账本:总集数未知时不结束并记疑似缺集;`pending`(元数据未就绪)的订阅可搜可评估但不会完成;once 与持续订阅的当季完成都写 `subscription_history`。
- Slot × 单元预留:缺口 = 发布单元 ∩ 集范围 − 已覆盖 − 在途;剧集 Slot 可同时有多个互不重叠的在途计划,重叠或忙时延后(`slot_deferral`),计划结束或周期重评时再评估。
- 硬条件与优先级:排除来源、HDR / 编码集合、每集体积、include/exclude 正则(白名单校验)、站点范围、最少做种、仅免费;MoviePilot 规则组分级映射为 0–100 优先级并带逐级 trace;分集洗版(`slot_unit` 账本)。
- 季包选文件:提交后读取 qB 文件列表,把已覆盖或在途的集设为不下载;无法判定时整包下载并记录原因。
- 主动搜索:建订阅时、每 `searchIntervalHours`(默认 24h)和 `POST /subscriptions/{id}/search` 入队 `searchSubscription`;元数据每 6h 刷新并写季总集数。
- 前端订阅抽屉:立即搜索、追更进度(每季总集数与来源、每集状态、在途 / 延后计数)、设置并锁定季总集数。
- 新增 e2e E9 持续追更剧集。
### 转移语义与文件系统隔离(`docs/porting/moviepilot-rust-transfer.md`)
- FsProxy + fsworker:文件操作在可杀子进程里执行;复制 / 哈希按进度停滞看门狗(`FS_HANG_TIMEOUT_MS`),快操作按总超时;超时后 SIGTERM → SIGKILL → `FsError('TIMEOUT')`,stat / 根探测超时不会被当作"不存在"。
- 生产二进制内置 `--role fsworker`(`/app/umt-server` 自身 spawn,容器演练见 `docs/runbook/deploy.md`)。
- `copyWithVerify` 支持 conflict / skip / replace:replace 先硬链接留底再原子 rename,旧文件进 `.umt-trash` 并登记 `trash_item`;写前清理超过 24h 的 `.uhd-partial`。
- 核验读失败抛错,不再当作"不匹配";对账错误不再误报 EEXIST;TIMEOUT / IO 有限重试(`FS_TRANSFER_MAX_ATTEMPTS`)后建待处理,不删记录。
- 复制流 1 MiB 块;强制全量 sha256 走 `sha256sum` 子进程;手动整理遍历有上限(`ORGANIZE_WALK_MAX_FILES`)。
- 字幕 `.default` 标记、同集其他版本作为洗版处置候选。
### Agent 会话页
- 移植 agentui(MIT,`LICENSE-agentui.md`)组件并换成本项目语义 token:流式光标、可展开的思考块、带类别 / scope / 风险 / 幂等徽章的工具卡、服务端拒绝的醒目态、压缩标记、预算条、审批卡(仅管理员会话可操作)、"模型声明 vs 系统核实"双栏最终汇报、跟随滚动与回到底部。
- 输入框(Enter 发送、中止需确认、追加、执行 / 只要方案切换、从方案一键执行)、会话列表与状态筛选、断线重连横幅;侧栏抽屉按路由带入上下文,可最小化为迷你坞。
- 设置页新增 `autoInvestigateMode`(调查 / 授权内恢复)与最大恢复次数、`agent.sessionDir`。
### 识别与站点解析补迁(MoviePilot 差分)
- 标题识别:动漫前缀标签、多种集号写法、首括号作标题或组名、原盘判定、`{[tmdbid=…]}` 显式块与 bangumi/anilist id、流媒体平台表等;繁简表补字。标题识别剔除登记项后 100% 对齐,missing / our_bug 清零。
- 站点:18 个站点定义的行选择器收紧、字幕搜索分支(只到解析层)、体积解析的银行家舍入。差分快照与样本来源登记在迁移账本。
### 稳定性与部署
- 容器内三个受监管进程(api + worker(io)+ worker:agent),静态 ffprobe。
- qB 同步在事务内 `for update` 重读下载任务后再合并,修复与入库并发时把 `imported` 写回 `importing` 的丢失更新。
- 授权内恢复的核实结论与 run 终态同一次写入,观察者不会读到中间态。
- 完成判定只保留 `applySlotEvent(verify_passed)` 一条路径,整理流程不再自行把订阅置为完成。
- server 测试分为并行的 unit 组和文件级串行的 pg 组,`packages/tasks` 同样串行;`deno task ci` 连续 3 次全绿(约 340–370 秒)。
### 发布前安全修复(W6-B,`07-v0.1-final-review`(已删除,见 git `ceb66f8`) §1.2)
- 多源 Move 授权:`/files/move` 与 `/files/organize`(action=move)按**每个源**所属作品(声明作品 ∪ 源下已登记资产的作品)逐一核对持续授权,任一不覆盖整体 403 并列出未授权项;无法归属作品的源只接受一次性审批;organize 先整体预检,不会只执行一部分组。
- `GET /files/download`、`POST /files/trash/purge` 在注册表标 `auth:"session"`,由中间件统一只放行管理员会话(DEV key 与 admin scope 的 API Key 一律 403);永久删除同口径;`api-registry.test` 新增反向断言,未标 session 的端点不得对 admin scope 返回 403。
- 脱敏键表只剩一份:rss 与 browser 的参数判定改用 `@umt/contracts` 的 `SENSITIVE_QUERY_PARAMS` / `isSensitiveQueryParam`,补齐 `pass_key`、`c_secure_pass`、`refresh_token`、`password`、`uid_key`、`auth` 等写法,加三处一致性测试。
- 回收站"还原到…"只允许可写的 managed 库根;原位还原逐级重建父目录且不跟随符号链接;跨卷还原受 `FILES_TRASH_CROSS_MAX_BYTES` 上限,回收站进出的跨卷复制经 fsproxy。
- `/files/identify` 的远端查询经进程共享的 TMDB 限流器,单次请求最多 20 个远端查询;`POST /files/probe` 改为需要 `organize.execute`(会写 `media_info`)。
- fsworker 阶段完成的进度一律立即上报,不再被节流吞掉最后一跳(全量 ci 下偶发的 fsproxy 用例失败)。
- fsproxy 挂死验收开关 `UMT_FS_TEST_HANG_AFTER_BYTES` 必须同时设置 `UMT_FS_TEST_HOOKS=1` 才生效,preflight 发现已设置会告警。
- 控制台账户弹层新增"二次验证"入口(生成密钥 → 验证码确认开启;凭密码 + 验证码关闭),不显示二维码,手动输入密钥或 otpauth 链接。
### 已知限制
完整清单与出处见 `07-v0.1-final-review`(已删除,见 git `ceb66f8`) §8;范围外内容以 `00-first-version-plan`(已删除,见 git `ceb66f8`) §3.2 与 §6 为准。
**范围外(00 §3.2 / 02 后置)**
1. 国产综艺分段、`require_distinct_asset` 组合校验、浏览器 / camofox 与原站视图、HHClub / CHD、旧库分范围接管、Agent 主观选片与规则学习、多用户。
2. Passkey、主密钥轮换、子代理、Transmission、TTG 自定义适配、馒头 adult 模式。
**订阅(05 §4 遗留)**
3. 完成判定前不会强制刷新元数据;titleQuery 订阅不会自动建档回填;季范围语义(`current_season` 在没有季单元时固定)未做;偏好标签不参与评估。
4. 同作品同季重复订阅没有查重;`prefer_pack`、回退等待期、Agent 选片理由与独立预算、队列按优先级出队、实体级识别词都未做;没有"清账重置"(只能把状态改回 active 重新订阅)。
5. (已解决)完成判定的双路径已在 W6-A 合并为一条,编号保留以便与 07 §8 对照。
**文件管理**
6. NFO / 图片投影(scrape 的 `writeNfo/images` 返回 `not_implemented`)、硬链接、蓝光原盘整目录操作未做;路径守卫没有下沉到 adapters。
7. 从回收站还原不会恢复资产状态,需要重新整理登记;永久删除开关是环境变量,不是设置项。
8. 跨卷进回收站与跨卷还原(都受 `FILES_TRASH_CROSS_MAX_BYTES` 上限、复制经 fsproxy)、永久删除、identify(已经走 TMDB 限流器,单次最多 20 个远端查询)、probe(串行,每次 30 秒超时)仍在 HTTP 请求内执行;浏览、根探测、readdir 与永久删除的 `rm` 不经 fsproxy。计划 v0.1.1 改为入队(07 S-7)。多项永久删除没有服务端的逐项确认(单项要求 `confirmName`)。
9. 前端没有整理向导 e2e 和移动端快照,页面行为靠 model 单测和冒烟覆盖。
**转移与文件系统**
10. `planImport` 规划期的 stat / 哈希、资产对账和文件管理不经 fsproxy;没有根级熔断;失效软链一律按冲突处理;hardlink、organize 源侧空目录上溯清理、蓝光原盘未做。
11. 二进制必须位于 `/app/umt-server`,否则 fsproxy 回退为进程内看门狗(能按时报 TIMEOUT,但卡住的线程无法回收)。基准 B1(50 GB)、B2(并发)、B3(真实 FUSE 冻结)没有跑。
**Agent 与安全**
12. (已解决,W6-B)控制台 TOTP 入口已补;开启时只显示密钥与 otpauth 链接,不渲染二维码。
13. (已解决,W6-B)rss 和 browser 已改用 contracts 的共享键表;全仓凭证泄漏的故障注入测试留到 M2。
14. `GET /inventory/media-servers` 在请求内串行查 Emby;能力调用超时后,底层调用仍会跑完。
15. Agent 页的幂等键来自审计(最多 3 页),审批卡片的 planId 靠解析工具摘要得到,较早的运行可能取不到。
16. 自动恢复只核实到下载恢复,入库由后续流程负责;恢复白名单只有 `task.retry`、`download.recheck`、`identity.resolve`。
**识别与站点**
17. 字幕搜索只到解析层;RSS 不带时区的时间与 HTML 命名实体未处理;过滤器的 tmdb 放行、SPECSUB 等属于 Slot 能力扩展。
**质量与运维**
18. 恢复流程只有人工演练;流程版本升级没有产品侧测试;下载状态机 `ALLOWED` 未收紧;`scanIncremental` 出错时仍返回 complete;AT18 恶意标题 e2e、AT42 未纳管占用没有测试;`vertical.test` 的用例依赖执行顺序;web 单测少(账户弹层的 TOTP 对话框只有类型检查,没有组件测试);E6 自动恢复只核实到 recheck 后回到下载中,engine-retry 用的是 mock enqueue。
19. `deno task ci` 约 6 分钟(W6-B 两次全绿 357 s / 341 s),server 测试(pg 组文件级串行)是主要耗时。