refactor(core): migrate to Bun and converge acquisition policies and Agent boundaries

This commit is contained in:
root committed 2026-10-13 14:37:03 +08:00
1 parent 3f1c6d02f6
commit 27c0f27434
268 files changed
+7468 -7852

No files matched your search

+18 -2
View File
@@ -29,11 +29,27 @@
3. 层内 `!` > `&` > `|`,可加括号;表达式短路求值。未知条件视为不匹配(只可能出现在迁移前的旧数据里,新写入会被拒)。
4. 版本目标自身的 `hardConditions` / `softPreferences.tiers` 保留,视为链首的匿名组;规则组有层时 pri 以规则组为准,升级比较口径自动切到 pri(对照 MP 洗版 `pri_order > current_priority`)。
**引用链**(`services/rules.ts resolveRuleChain`):订阅私有组 → 版本目标 `ruleGroupIds`(非空时)|| 订阅 `params.ruleGroupIds` || 订阅默认链 → 版本目标开了升级时再叠加洗版默认链;逐个按 scope 过滤,跳过停用/已删。搜索用 `kind: "search"` 取搜索默认链(给 `release.search` / 手动搜索接入)。
**引用链**(`services/rules.ts resolveRuleChain`):订阅私有组 → 版本目标 `ruleGroupIds`(非空时)|| 订阅 `params.ruleGroupIds` || 订阅默认链 ;补齐阶段只使用该链。洗版阶段优先使用版本目标 `upgradeThreshold.ruleGroupIds`,未单独指定时继承收录链并追加洗版默认链;逐个按 scope 过滤,跳过停用/已删。搜索用 `kind: "search"` 取搜索默认链(给 `release.search` / 手动搜索接入)。
候选评估记录(artifact `candidate_evaluation`)里:`pri` 为最终 pri;`reasons` 带 `rule_group:<id>@<revision>`;`trace` 逐组逐层写明命中/未命中及每个原子的依据,如
`规则组「片源」@r1 第1层 4K:未命中(4K✗ 分辨率 1080p)`、`规则组「片源」@r1 硬排除 REMUX 命中(REMUX✓ 来源 REMUX)`。
## 分类、保留版本与洗版
在「规则 → 收录策略」中沿用现有 movie / tv 二级分类选择适用范围。新订阅按「明确选择 → 分类默认 → 作品类型默认 → 全局默认」选择已发布策略,同层按发布时间选择;未匹配时创建默认版本。分类设置页展示当前关联。策略模板创建订阅自己的保留版本,已建版本的规则独立维护,修改默认模板不会覆盖已有版本。
订阅表单只选择新建时的收录策略,质量、组合规则和洗版在订阅详情的「收录版本规则」逐版本调整。顺序与已有订阅的自动补全也统一在详情维护;包含、排除仍作为订阅共同过滤。旧 API 的统一质量预设继续兼容,普通表单保存保留旧值。自动补全选择「跟随主版本规则」时,按主版本实际收录链取最后一个设置了补全开关的组;没有设置则关闭,显式开/关优先。
- **单版本**:一个保留版本的允许收录范围选择 1080p、2160p,组合优先级例如 `4K & H265 > 4K & H264 > 1080P & H265 > 1080P & H264`。范围内先收低档,再洗到高档;720p 即使其他条件更好也不进入范围。
- **双版本**:建立两个保留版本,分别只允许 1080p 和 2160p,各自引用组合规则和洗版设置,例如各自用 `H265 > H264` 让本分辨率的最高档为目标档。第一个为主版本,需要自动收齐第二个时开启订阅的「自动补全其他版本」。统一质量预设不会改写策略模板的分辨率边界。
- **组合优先级**:复用规则组的 AND / OR / NOT 与有序档位,发布组可使用结构化阶梯或现有自定义条件;编码偏好应写入档位,软偏好用于同档候选排序。多组串联仍取最后一个带档位的组,界面显示引用顺序。
- **阶段**:追更、补齐允许不同集采用不同版本;开启「整季同组同套」后,洗版向当季选定规格收敛,多个单集可以组成一套。规格包含分辨率、来源、编码、发布组、HDR 和剪辑版,不包含集号或种子 ID。已在途的洗版规格保持冻结,结束后才选择更优的一套;同档对齐不降低来源或分辨率等级。
- **完成与旧文件**:范围内覆盖齐且选定同套资源达到目标才算洗版完成。新文件核验后,仅回收同保留版本被完整覆盖的旧文件;旧合并集要等同套新单集全部入库,另一分辨率和异组文件不能凑覆盖。处置沿用回收站与替换失败恢复机制。
组合条件所依赖的分辨率、编码等未知时,不把未知当作否定条件成立,也不悄悄降到低档。资源属性事项交给现有调查通路:Agent 用 `release.inspect` 查看详情与 MediaInfo,有针对 `release.apply_facts` 的持续授权时只补仍缺失且有出处的分辨率、编码、来源或发布组,服务保存事实与出处并触发原规则重评。站点大小、做种、促销等通过详情刷新补齐。没有授权或证据不足时提供人机协同建议;Agent 不改变允许范围、保留目标或组合排序。
手动下载的选择只影响本次计划,沿用独立的下载与一次性替换入口。
## 内置关键字
`GET /rules/keywords` 返回全表(含 MP 上游正则/条件原文与我们的判定依据 `basis`)。
@@ -60,7 +76,7 @@
| `POST /rules/parse {ruleString}` | → `{layers, ruleString(规范化,有错为 null), errors[{code, message, position, layer, atom?, suggestions?}]}`;code:`empty` `empty_layer` `unknown_atom` `unsupported_atom` `unbalanced_paren` `unexpected_token` `invalid_char` |
| `POST /rules/serialize {layers}` | → `{ruleString}`(原子大写,只加必要括号) |
| `GET / PUT /rules/defaults` | `{acquisition[], upgrade[], search[]}`,按数组顺序串联;类型不符 400 |
| `GET/POST /rules`、`GET/PATCH/DELETE /rules/{id}` | 列表筛选 `kind source enabled includeDeleted q`;写入可给 `ruleString`(优先)或 `layers`,`hardExcludes` 元素可以是表达式或单层规则串;PATCH 可带 `expectedRevision`(不匹配 409);同名 409;条件无效 422;DELETE 被版本目标/订阅引用 409 |
| `GET/POST /rules`、`GET/PATCH/DELETE /rules/{id}` | 列表筛选 `kind source enabled includeDeleted q`;写入可给 `ruleString`(优先)或 `layers`,`hardExcludes` 元素可以是表达式或单层规则串;PATCH 可带 `expectedRevision`(不匹配 409);同名 409;条件无效 422;DELETE 被版本目标(含洗版)、订阅、有效策略模板引用 409 |
| `GET /rules/{id}/revisions` | 审计回放(含迁移前的 `preference_tag.*`) |
| `POST /rules/{id}/preview` | `{limit?, sourceReleaseIds?, titles?[{title, subtitle?}], draft?}`;缺省最近 50 条已识别资源;`draft` 试算未保存的层/硬排除 → `{sampleSize, passed, rejected, priHistogram[{pri,count}], items[{title, passed, pri, level, excludedBy, reasons, trace}]}` |
| `GET/POST /rules/atoms`、`GET/PATCH/DELETE /rules/atoms/{id}` | 自定义条件;与内置同名 409;被规则组引用不能删 409 |