jxxghp
4345fcfa22
refactor(chain): chain 与 module 仅经 run_module 契约互联,实现模块内容封闭
...
- mTorrent 字幕链接解析下沉为 IndexerModule.site_subtitle_links,subtitle 模块自行跳过 API 站点
- TMDB/MusicBrainz 识别缓存管理改为模块方法(tmdb_cache_*/music_cache_*)经 run_module 分发
- WechatClawBot 客户端查找/临时客户端/缓存迁移内聚为 wechatclawbot_* 模块方法,
chain 移除 WechatClawBot 类与 ModuleManager 内省
- LISTENBRAINZ_* 常量迁至 schemas/types.py,模块与链层再导入保持兼容
- TMDbException 升为 schemas/exception.py 跨层契约,vendored 异常保持类身份一致
- 架构守护测试新增 test_chain_does_not_import_module_internals(共 18 项)
- 文档同步:chain->module 仅允许 run_module 分发,直接导入禁止
2026-08-16 05:25:28 +08:00
jxxghp
02f0dd0b9a
refactor(architecture): 修复模块依赖违规并强化架构守护
...
- 字幕编排上移 DownloadChain.download_site_subtitles,SubtitleModule 仅保留站点链接解析
- TransferChain.recommend_name 上移 TV episodes_info 获取,filemanager 模块不再导入 TmdbChain
- endpoint 穿透修复:WXBizMsgCrypt3 迁至 adapters/external/wechat_crypt.py;
music/tmdb 缓存管理、listenbrainz 常量、TMDbException、WechatClawBot 辅助统一经 chain 包装
- RuleParser 与 builtin_rules 合并为 application/filter_rules.py;
fsproxy/fsworker 迁至 adapters/system/
- chain/__init__.py 删除 qbittorrentapi/transmission_rpc 导入,消除后端协议类型泄漏
- 架构守护测试新增三项检查:模块间隔离、入口层穿透、下载器 SDK 泄漏
- 文档同步:05-architecture.md 记录 DB/Oper 聚合例外与迁移文件位置,AGENTS.md 更新所有权表
2026-08-16 04:59:17 +08:00
jxxghp
f7e39a47c6
docs(agents): 移除已废弃的 app/helper 资源回退描述
2026-08-15 23:05:01 +08:00
jxxghp
4858f4652b
fix(runtime): 修复 ConfigReloadMixin 事件处理器因 __name__ 未同步被静默跳过,配置变更不再触发模块重载 ( #6329 )
2026-08-15 21:27:59 +08:00
jxxghp
67968dd0cb
fix(trimemedia): 飞牛影视登录适配新版 v2 协议,密码改用 SHA256 摘要 ( #6328 )
2026-08-15 20:44:19 +08:00
jxxghp
78b0063d4c
fix: 清理音乐刮削结果中 album_type 等字段的尾部空格 ( #6327 )
...
MusicBrainz 和 ListenBrainz 模块从 API 响应中提取 album_type、
secondary_types 时直接使用 dict.get() 取值,未做 strip() 处理,
导致部分结果带有尾部空格(如 'Album '、'Broadcast ')。
修复:
- MusicBrainz 新增 _stripped() 工具方法,3 处 album_type 赋值统一清理
- ListenBrainz 新增 _stripped() 工具方法,_fresh_release_to_info 中清理
- Pydantic schema 层增加 field_validator 作为兜底安全网
- 新增 9 个回归测试覆盖所有场景
2026-08-15 20:35:02 +08:00
jxxghp
dd38c16400
refactor(messaging): 拆分用户交互模块到 application/messaging 层
...
- 新增 application/messaging 交互层:router.py 统一会话优先级与回调分发,
site/subscribe/skill/media/plugin 各交互状态与视图从 Chain 迁出
- MessageChain 改为通过 InteractionRouter 派发文本会话与按钮回调,
新增结构化 callback_data 通道(兼容 CALLBACK: 文本前缀)
- Transfer 失败重试/AI 接管回调归入 TransferChain
- MediaInteractionChain 拆出为 app/chain/interaction.py(旧路径保留兼容别名)
- WebAgent Endpoint 去重,统一使用 agent.py 回调协议函数
- 删除 app/chain/skills.py(交互逻辑并入 SkillInteractionHandler)
- 同步更新架构文档与测试,全量 4476 通过
2026-08-15 16:36:39 +08:00
jxxghp
5a1808592a
fix(transfer): 修复未识别音乐任务登记作业因年份类型校验失败 ( #6325 )
2026-08-15 11:14:10 +08:00
jxxghp
a8dc6e9973
fix(servarr): Seerr 新增剧集订阅缺 tmdbId 或空季列表时无法创建订阅 ( #6315 )
...
Seerr 的 Sonarr 兼容请求体只携带 tvdbId、不携带 tmdbId,且季列表由
lookup 返回的季列表构造;lookup 季列表为空时请求体季列表为空,旧逻辑
直接返回成功但不创建任何订阅,导致 Seerr 显示请求正常而 MP 未收到订阅。
- 新增剧集订阅时按 tvdbId 补全媒体身份,识别失败返回 500 而非静默成功
- 请求体季列表为空时按已识别季集兜底,识别不到季默认第 1 季
- lookup 在 TVDB 无可用季信息时按 TMDB 季集兜底返回季列表
- 新增回归测试覆盖上述场景
2026-08-15 10:56:50 +08:00
jxxghp
bb63b40213
fix(transfer): 修复音乐整理因缺少 tmdb_id 字段崩溃
...
MusicInfo 不含 tmdb_id 等 60 个影视专用字段,整理链访问
task.mediainfo.tmdb_id 直接 AttributeError,导致无分类音乐自动
整理全部失败。
源头修复:为 domain 与 schemas 两层 MusicInfo 增加 __getattr__
兜底,缺失字段返回 None,避免下游逐点安全访问;dunder 方法
除外以保持 copy/pickle 钩子探测正常。显式声明 recognize_cache_hit
字段保留 getattr(..., False) 默认值语义。
2026-08-15 10:20:04 +08:00
jxxghp
96118e73e7
refactor(string): split utilities by responsibility
2026-08-15 08:03:55 +08:00
jxxghp
a2117bafc8
fix(compat): preserve legacy plugin imports
2026-08-15 07:15:03 +08:00
Aqr-K
8a11214a43
refactor(db): 修复异步连接池无界增长,并完成 SQLAlchemy 2.0 迁移与分层归位 ( #6320 )
2026-08-15 06:58:38 +08:00
jxxghp
e28de9cfe1
fix: 修复音乐搜索进度更新
2026-08-14 22:15:17 +08:00
jxxghp
794bcfdfeb
fix(ci): isolate plugin market snapshot generator
2026-08-14 21:29:15 +08:00
jxxghp
d6bf78b63a
feat: 支持音乐识别信息转简体
2026-08-14 21:02:33 +08:00
jxxghp
c580181049
fix(api): keep src/dest fileitem fields in transfer history response
...
TransferHistory schema omitted src_fileitem, dest_fileitem and files which
are emitted by to_dict, so the response_model filter stripped the file
size the frontend reads from src_fileitem.size.
2026-08-14 20:40:02 +08:00
jxxghp
b3509c60bb
fix: support site resources from legacy docker updater
2026-08-14 20:26:51 +08:00
jxxghp
369d7d6448
refactor: reorganize backend module boundaries
2026-08-14 19:53:33 +08:00
jxxghp
fe0b444ceb
fix(test): stub app.infrastructure.sites in subprocess tests for CI
...
CI 无站点二进制模块,子进程测试绕过 conftest 垫片导致
test_manifest_aliases_reuse_real_canonical_modules 与
test_main_script_does_not_shadow_stdlib_platform 失败。
在子进程中复用 ensure_sites_stub,并给垫片补 __spec__。
2026-08-14 18:18:06 +08:00
jxxghp
7b3444c366
refactor backend module architecture
2026-08-14 15:45:38 +08:00
Rayan Salhab
557cc0e2e3
Fix EAC3 audio codec detection ( #6312 )
2026-08-14 11:50:39 +08:00
InfinityPacer
509d671524
test(agent): isolate scheduler in task run test ( #6311 )
2026-08-14 11:50:08 +08:00
InfinityPacer
006b6f6318
fix(auth): support nested feature permissions ( #6310 )
2026-08-14 10:21:27 +08:00
jxxghp
666e110693
docs: design backend import compatibility layer
2026-08-14 08:39:05 +08:00
jxxghp
895635c277
fix(db): 假值系统配置落库而非删除记录,布尔开关关闭态可持久化(#6309)
...
SystemConfigOper.set/async_set 原先对假值(False/0/None/空容器)执行删除记录,
读取端以「无记录」表示未配置并回落默认值,导致「挂载盘删除空目录」等布尔开关
关闭后刷新自动弹回开启。现改为假值同样落库更新,显式删除仍走 delete 方法。
2026-08-14 06:59:17 +08:00
jxxghp
87b1caf3ff
fix(agent): grant channel owners admin access
2026-08-14 00:01:37 +08:00
jxxghp
73df2aa331
fix(agent): 工具权限拦截时补齐流式换行,渠道主ID默认管理员权限
2026-08-13 23:15:28 +08:00
InfinityPacer
402543f636
refactor(agent): align policy contracts with runtime ( #6306 )
2026-08-13 22:14:43 +08:00
InfinityPacer
57e7f86f38
feat(agent): record task run history ( #6305 )
2026-08-13 22:13:36 +08:00
jxxghp
4de4fa4391
fix: 插件文件夹响应模型兼容新版对象格式
...
GET /plugin/folders 的响应模型 PluginFoldersData 只能校验旧版
数组格式,前端实际保存的是含展示配置的对象格式,导致建文件夹/
移入插件后刷新时响应校验失败(500),文件夹恢复为空。改为同时
兼容新旧两种格式。
2026-08-13 22:06:22 +08:00
jxxghp
86b35bda9a
fix: 优先使用简体音乐关键词搜索
2026-08-13 21:53:18 +08:00
jxxghp
d611891296
fix: 放宽音乐资源标题匹配
2026-08-13 20:57:15 +08:00
jxxghp
23a90991fc
feat: 支持站点音乐分类搜索
2026-08-13 19:45:09 +08:00
InfinityPacer
c86307ddd1
fix: 收口监控测试线程并修复整理历史 lint ( #6304 )
2026-08-13 19:26:05 +08:00
InfinityPacer
3560918e12
fix(agent): bind runtime tasks to app lifespan ( #6303 )
2026-08-13 19:25:52 +08:00
InfinityPacer
e014604b1c
fix: 避免服务重启后重复执行 Agent 定时任务 ( #6302 )
2026-08-13 19:25:11 +08:00
InfinityPacer
dc9f8ef168
chore(agent): raise core LangChain dependency baseline ( #6301 )
2026-08-13 17:59:14 +08:00
InfinityPacer
8dc6774d47
fix(agent): preserve context during request compaction ( #6300 )
2026-08-13 17:58:31 +08:00
InfinityPacer
228de7bd67
fix(agent): compact oversized final model requests ( #6299 )
2026-08-13 17:26:13 +08:00
jxxghp
eebd81a0e4
feat(media): support iqiyi discover source
2026-08-13 15:34:58 +08:00
kami
626e6cb472
fix(storage): refresh 115 upload token when SecurityTokenExpired ( #6296 )
2026-08-13 15:23:29 +08:00
InfinityPacer
3aed078bbb
fix(agent): bind channel admin identity ( #6294 )
2026-08-13 14:53:59 +08:00
Aqr-K
eeec40cce3
fix(monitor): 消除探测饿死与重试饥饿导致的跨目录连坐 ( #6291 )
2026-08-13 14:00:50 +08:00
InfinityPacer
f979274c07
feat(agent): 增加最终模型请求预算观测 ( #6290 )
2026-08-13 13:52:30 +08:00
InfinityPacer
ce3508730b
fix(agent): 规范化模型窗口 Profile ( #6289 )
2026-08-13 13:51:22 +08:00
jxxghp
d0e06e4b85
chore(database): align v3 migration filenames
2026-08-13 13:47:37 +08:00
jxxghp
b4863a6550
feat(media): support extensible media sources
2026-08-13 13:26:17 +08:00
InfinityPacer
f80562915d
fix(agent): harden secret confirmation failures ( #6287 )
2026-08-13 10:55:02 +08:00
InfinityPacer
527ceff5d1
fix(agent): preserve context when summarization fails ( #6286 )
2026-08-13 10:07:56 +08:00