Commit Graph
850 Commits
Author SHA1 Message Date
jxxghp 03ada7eb01 refactor: 收敛 factory 模块级副作用并统一 async 路径进度为异步后端
- 将 configure_token_codec/configure_plugin_routes 移入 create_app(),消除 import 期副作用
- runtime 层新增 AsyncCacheProxy/AsyncTTLCache/AsyncProgressHelper,共享 progress region
- search/system/history/scheduler/dashboard 的事件循环路径切换异步进度后端
- 同步进度回调经事件循环提交或线程池执行,避免阻塞事件循环
2026-08-19 09:11:42 +08:00
jxxghp 91d339a8dd fix(test): 刷新架构基线,修复 app/chain/site.py 行号漂移导致的 CI 失败 2026-08-19 06:38:13 +08:00
InfinityPacer fc69039d00 fix(docker): stabilize bootstrap self-updates (#6354) 2026-08-19 05:54:41 +08:00
jxxghp 282b922f1b fix: 修复批量插件重载窗口期残留 handler 直调导致 missing event TypeError
插件重载 stop 阶段清除 sys.modules 缓存后,若广播事件命中注册表中残留的旧类方法声明,
EventBindingResolver.owner_class 因 inspect.getmodule 返回 None 而解析失败,原实现会
直接返回原始函数并绕过实例绑定,旧签名无 event 参数时抛出 TypeError 并刷屏通知。

- binding.py:owner_class 解析失败时区分类方法声明与自由函数;类方法声明记入
  unresolved 诊断并跳过执行,等待重载完成后新 handler 按标识覆盖自愈;
  自由函数保持直调路径不变。
- 收敛 binding-miss 与新路径的未命中记账逻辑到 _record_unresolved,首次未命中才告警。
- 新增回归测试:模块卸载后残留类方法被跳过、自由函数直调不受影响。

Closes #6351
2026-08-18 21:40:13 +08:00
jxxghp 4cc06ce7ad fix(test): 修复 doctor/monitor 惰性门面用例在无站点资源的 CI 子进程中失败
该用例以独立子进程加载 app.monitor 实现,链路最终 import
app.application.site.sites;CI 无该动态资源模块且子进程不经过
conftest 引导,导致 ModuleNotFoundError。改为触发实现加载前显式
安装与 conftest 同源的 sites 垫片,并通过 CONFIG_DIR 指向临时
目录隔离子进程配置。
2026-08-18 17:28:21 +08:00
jxxghp 8f81492e99 fix: 修复站点批量导入报错(重复方法覆盖导致异步调用失效) 2026-08-18 17:10:14 +08:00
jxxghp a6997d0dac fix: 修复站点用户数据DTO缺少name字段导致种子排序报错 2026-08-18 15:56:40 +08:00
jxxghp 8d62f33155 fix(plugin): 修复坏插件模块声明击穿模块调度导致接口大面积报错
- projection 只接受映射类型的 get_module 声明,非法值跳过并记日志
- dispatcher 同步/异步路径防御非映射方法表,单个坏插件被隔离
- media 端点改用 application 层插件运行时门面,消除分层违规依赖
- 图片能力测试打桩 models.dev 目录边界,适配仓库内离线目录留空

Closes #6346
2026-08-18 15:53:28 +08:00
jxxghp dc23977b0c fix: 修复站点用户数据转换并完善媒体来源扩展 2026-08-18 14:50:09 +08:00
jxxghp c2a27f7c71 refactor: 收口订阅与插件应用边界 2026-08-18 13:54:17 +08:00
jxxghp 8472bcff43 refactor: 收口 V3 分层架构与插件兼容边界 2026-08-18 13:22:02 +08:00
jxxghp 17499e5ac9 fix 插件恢复前先装配插件市场、包管理、依赖安装等外部服务 2026-08-18 09:42:58 +08:00
InfinityPacer bf60cc485b fix(docker): persist CloakBrowser cache (#6344) 2026-08-18 05:36:32 +08:00
jxxghp 5128ae9e1e refactor: 推进后端分层架构治理 2026-08-18 00:29:14 +08:00
jxxghp 5d0bacabd5 fix(dashboard): 修复首页存储空间显示为 0
仪表板 _build_storage 原先仅按 library_storage 选取存储,用户只配置
本地下载目录而未填媒体库存储时存储集合为空,直接返回 0;而设置页经
LocalStorage.usage 同时统计下载目录与媒体库目录,故显示正常。

改为汇总下载目录的 storage 与媒体库目录的 library_storage,与 usage
口径对齐。存储名用 set 去重,同一存储只查询一次;磁盘层面 space_usage
已按 st_dev / Btrfs FSID 去重,相同磁盘的不同目录不会重复累加。

closes #6268
2026-08-17 17:34:34 +08:00
jxxghpandCodeBuddy Code 233e8c688a test(scheduler): 移除对 clear_cache provider_name 的冗余断言
该字段未被实现显式设置,测试应仅校验 clear_cache 的 manual 语义。

Co-Authored-By: CodeBuddy Code <hy3@tencent.com>
2026-08-17 14:01:02 +08:00
jxxghp 72f5667927 refactor(scheduler): 缓存清理改为仅手动执行
移除 clear_cache 的 add_job 注册,不再自动定时执行。
在 _jobs 中标记 manual=True 并补充 provider_name,
list() 新增手动任务展示段,未调度的手动任务也能在 UI 中显示和手动触发。
2026-08-17 13:38:01 +08:00
jxxghp 252f0f986f fix(scheduler): 恢复缓存清理定时任务注册
commit 4b1df72a 移除了 clear_cache 的 add_job 调用但保留了 _jobs 定义,
导致任务在 UI 中不可见、无法手动执行。现以固定 24 小时间隔重新注册,
不再绑定 META_CACHE_EXPIRE。
2026-08-17 13:33:32 +08:00
jxxghp 2bb090d2be fix(download): 下载失败冷却日志补充失败原因和重试时间
将 _active_download_failure_fingerprints 返回类型从 Set[str] 改为 Dict[str, DownloadFailure],
__is_context_in_failure_cooldown 从失败记录中提取 error_message 和 next_retry_at,
日志输出格式改为「近期添加下载失败(失败原因:xxx),暂时跳过该资源,将于 yyyy-MM-dd HH:mm:ss 后重试」。
2026-08-17 13:24:22 +08:00
InfinityPacer 3ebbec3317 perf(startup): reduce readiness work (#6341) 2026-08-17 11:32:04 +08:00
jxxghp 23ca70fa37 fix(acoustid): 测试函数独立检测本地 fpcalc 依赖而非仅校验网络
原先 test() 依赖 init_module() 一次性缓存的 self._fpcalc_path,初始化之后再安装或移除 fpcalc 都不会反映在测试结果中,导致 UI 测试可能错误显示为通过。

- 抽出静态方法 _resolve_fpcalc() 基于 shutil.which 定位可执行 fpcalc,init_module() 复用
- test() 每次自行重新定位 fpcalc,缺失则直接失败且不发起网络请求,并写回 self._fpcalc_path
- 新增 3 个回归用例覆盖本地依赖检测与独立于 init 缓存的行为
2026-08-17 11:07:13 +08:00
jxxghp 77b7960b7d fix(subscribe): 修复历史 note 双重 JSON 编码导致的订阅列表 500
2.0 时代旧代码对 JSON 列显式 json.dumps,导致 note 字段在库里是
字符串而非数组,响应模型按 List[int] 校验失败返回 500。

- 新增 3.0.7 数据迁移,解析并回写字符串型 note 为真正的 JSON 数组
- Subscribe 响应模型增加 note 字符串兼容解析,脏数据按空值处理
2026-08-17 10:56:31 +08:00
jxxghp eefe1ec931 fix(config): 更新配置成功时返回空字符串消息,修复保存设置 500 错误 2026-08-17 10:34:45 +08:00
jxxghp 134c00fc7f fix(compat): 补齐刮削与规则拆分后的旧路径映射,保持插件导入可用
- app.chain.media 登记 ScrapingChain/ScrapingOption/ScrapingConfig 符号叠加,
  刮削能力拆出 ScrapingChain 后旧模块路径仍可惰性解析
- app.application.filter/filter_rules 映射到收敛后的 app.application.rules
- 补充旧路径模块身份与符号解析测试
2026-08-17 09:06:27 +08:00
jxxghp d7e610e656 feat(agent): 新增 apply_patch 多文件补丁编辑工具
参考 Codex apply_patch 设计,支持单次调用对多个文本文件执行新增、
更新和删除:补丁以 *** Begin Patch / *** End Patch 包裹,Update 段
用 @@ 分隔 hunk,上下文行须与当前内容精确一致;先整体校验全部文件
操作,通过后才逐个原子写盘,并以校验期 sha256 防止并发修改。

- 工具描述与系统提示词明确 apply_patch / edit_file / write_file 分工:
  跨多文件或增删文件用 apply_patch,单文件单处替换用 edit_file
- 注册进工具工厂与 ALWAYS_INCLUDE 列表,加入策略 inventory 与
  MCP 隐藏列表,流式回调归类为 file_write
- 同步 create-moviepilot-plugin / publish-moviepilot-plugin /
  create-moviepilot-skill 技能的 allowed-tools 与版本
- 新增 tests/test_agent_apply_patch.py 覆盖解析、多文件应用、
  整体拒绝、权限边界与版本冲突场景
2026-08-17 08:01:59 +08:00
InfinityPacer 6269a24e9d fix(config): restore source app.env resolution (#6340) 2026-08-17 06:13:46 +08:00
InfinityPacer ca99af10f1 fix(auth): preserve bcrypt password compatibility (#6339) 2026-08-17 06:13:18 +08:00
jxxghp 1402626a4a refactor(tmdb): 空结果缓存过期时间收敛为设置项 EMPTY_RESULT_CACHE_TTL
- ConfigModel TMDB 配置区新增 EMPTY_RESULT_CACHE_TTL(默认 30 分钟),支持环境变量覆盖
- request/async_request/discover/TmdbCache 统一改读 settings,移除模块级常量与跨模块导入
2026-08-16 21:20:32 +08:00
InfinityPacer 2aca9cc06b fix(runtime): enforce canonical capability entrypoints (#6338) 2026-08-16 21:16:09 +08:00
jxxghp fa06a4ac03 fix(tmdb): 空结果缓存使用独立短 TTL,故障恢复后快速自愈,关闭 #6332
- cached 装饰器新增 empty_ttl/empty_if,空结果按独立短 TTL 写入
- TMDB request/async_request/discover 空结果快照 30 分钟过期
- TmdbCache 未识别负缓存(id=0)同步改用 30 分钟短 TTL,正缓存不变
2026-08-16 20:50:55 +08:00
InfinityPacer 4e47cce5f2 fix(runtime): prevent implicit scheduler startup (#6337) 2026-08-16 19:48:22 +08:00
jxxghp 54f093a099 Merge remote-tracking branch 'origin/v3' into v3
# Conflicts:
#	app/api/endpoints/agent.py
#	app/api/endpoints/anthropic.py
#	app/api/endpoints/openai.py
#	app/chain/__init__.py
#	app/chain/message.py
#	app/chain/site.py
#	app/chain/subscribe.py
#	app/chain/transfer.py
#	app/modules/discord/__init__.py
#	app/modules/qqbot/__init__.py
#	app/modules/slack/__init__.py
#	app/modules/telegram/__init__.py
#	app/modules/wechat/__init__.py
#	app/runtime/extensions/module_manager.py
#	app/runtime/extensions/service_registry.py
#	tests/test_agent_interaction.py
#	tests/test_slash_command_interactions.py
#	tests/test_web_agent_stream.py
2026-08-16 19:44:43 +08:00
jxxghp 240a4dffe6 refactor(schemas): 统一 message/notification 命名边界,旧名收敛至兼容映射表
- notification 域:渠道能力(MessageChannel→NotificationChannel、ChannelCapability* 迁入 notification.py)
- message 域:消息收发(Notification→Message、NotificationType→MessageType、CommingMessage→IncomingMessage、NotificationHistoryItem→MessageHistoryItem、NotificationClear*→MessageClear*)
- Agent 工具契约:send_notification_message→send_message、notification_callback→message_callback
- 源码不保留旧名物理别名,旧导入经 app/runtime/compat/manifest.py SYMBOL_ALIASES 惰性解析
- API 路径与持久化键冻结不变,前端零改动
- 新增兼容守护测试与 docs/rules/07 命名边界规范
2026-08-16 19:32:20 +08:00
InfinityPacer 5b367011c5 refactor(agent): 按需加载 Agent 运行时 (#6336) 2026-08-16 19:25:24 +08:00
LinFei83 e5f0c53069 MCP get_search_results 增加 include_labels 按需返回种子标签 (#6335)
让 Agent 在筛选命中标签时能按需查看 labels,默认不返回以免拉长上下文。

Co-authored-by: Cursor <cursoragent@cursor.com>
(cherry picked from commit 6a02e7de21)
2026-08-16 17:38:19 +08:00
jxxghp 3e417c1ac5 refactor(chain): _mixins.py 更名 _transfer.py,统一功能域 mixin 命名
TransferChain 的 7 个功能域 mixin 集合文件按域更名 _transfer.py,
与 _recognition/_messaging/_interaction/_music 的单域命名约定对齐;
同步更新 transfer.py 导入、9 个测试文件 patch 目标与架构文档。
另含 chain 基类导入排序优化与未使用导入清理(copy/datetime 已随
dispatch 方法迁入 _messaging.py)。
2026-08-16 17:25:49 +08:00
jxxghp 5810f6bc2b refactor(application): filter_rules.py 更名 rules.py 并合并 RuleHelper
规则域收敛为单一事实来源 app/application/rules.py:
- filter_rules.py 更名为 rules.py(内置规则集 + RuleParser)
- filter.py 仅含 66 行 RuleHelper(用户规则组配置访问),并入 rules.py
- 同步更新 5 处引用方导入、nettest stub 目标与架构文档
- 兼容映射 app.helper.rule 指向新路径,legacy 导入仍可用
2026-08-16 17:13:51 +08:00
InfinityPacer b8b59ae20a refactor(runtime): activate managed resources on demand (#6334) 2026-08-16 16:44:45 +08:00
jxxghp 7e851dbfa7 refactor(chain): 处理链功能域 mixin 化,清理未使用导入并根治兼容层循环导入
- ChainBase 拆分为 RecognitionMixin/MessageProcessingMixin/NotificationMixin
- TransferChain 拆分为 7 个功能 mixin(_mixins.py),SubscribeChain 音乐订阅域拆出 _music.py
- 斜杠命令交互四件套收敛为 InteractionChainMixin 委托,会话管理器移至 application 层,chain 层不再 re-export
- 模块基础类收敛到 app/modules/_base(notification/mediaserver 语义重命名)
- 清理 app/chain/__init__.py 24 个未使用导入,修正 49 处测试 patch 目标到实际命名空间
- 兼容层 legacy 符号不再并入 __all__,根治 schemas 初始化反向拉起 application.transfer 的循环导入
- 修复 bangumi 集数为字符串时 set_bangumi_info 抛 TypeError
- 新增重复代码等架构门禁测试;capability 清单校验排除下划线内部目录
2026-08-16 16:30:16 +08:00
InfinityPacer 24671f8f18 refactor(runtime): lazily activate host modules (#6331) 2026-08-16 16:07:38 +08:00
jxxghp 98276a68a8 fix(api): 修复LLM manage端点目录查询返回列表无法透过Dict响应模型校验导致设置页500 2026-08-16 08:27:21 +08:00
jxxghp cd5b85eb6c fix(api): 修复LLM manage端点在空target时url_for报Must not be empty导致设置页500 2026-08-16 08:11:45 +08:00
jxxghp 7d0cf76d9c fix(storage): 修复通用管理契约下存储页报未知错误
- usage 动作返回的 StorageUsage pydantic 模型无法透过
  Response[Dict[str, Any]] 开放映射校验导致 500,统一转为 dict
- support_transtype 返回值恢复 transtype 包装结构,与前端期望一致
- 空结果(无用量/无整理方式)恢复成功空结构语义,
  不再因 bool(结果) 被前端客户端当作业务失败弹窗
- dashboard 用量聚合改为 dict 取值;新增响应校验与空结果回归测试
2026-08-16 07:50:29 +08:00
jxxghp 441ec9475e refactor(api): LLM 提供商管理端点收敛为通用 manage 接口,端点层零特色
- schemas 新增 LlmProviderAction 公共动作词汇表
- LLMProviderManager 新增 provider_manage 统一入口,默认值填充、
  API Key 豁免判断、密钥脱敏与错误归因改写全部下沉封闭,
  不再硬编码 chatgpt/github-copilot 等产品名
- endpoint 收敛为 POST /llm/manage(ManageRequest 透传);
  OAuth 回跳地址由端点按具名回调路由统一构造后注入动作参数,
  /provider-auth/callback/{provider_id} 因浏览器回跳协议约束保留具名路由
- 新增 14 项 provider_manage 契约守护测试,
  替换原针对端点函数的两个旧测试文件
2026-08-16 07:50:16 +08:00
jxxghp a6dbd799d5 refactor(api): 渠道与存储管理端点通用化,端点层零目标特色
- schemas 新增公共 ManageRequest(target+action+params) 与 StorageAction 词汇表
- endpoint 层收敛为 POST /notification/manage、/storage/manage 两个通用接口,
  不再定义任何渠道/存储特定的名称、参数与响应字段,前端上送参数原样透传
- chain 层 manage_channel/manage_storage 接受字符串标识纯透明转发,
  StorageChain 移除全部特色管理方法
- FileManagerModule 新增 storage_manage 统一入口,模块返回归一化为
  {success, message, data};wechatclawbot channel_manage 同步归一化,
  路由标识兼容枚举名/值/对象
- dashboard 与 agentopsassistant 的用量查询改走 manage_storage(usage)
- 新增 10 项存储契约守护测试,通知侧补充 3 项链透传与字符串路由测试,
  API 守护测试对 ManageRequest 开放映射按设计豁免
2026-08-16 07:18:49 +08:00
jxxghp 5b0c631f80 refactor(notification): 建立通知渠道通用管理契约 channel_manage
- schemas 层新增 NotificationAction 公共动作词汇表(状态/二维码/退出/连通性/缓存迁移)
- 模块实现统一 channel_manage(channel, action, **params),按渠道名路由,
  非本渠道返回 None;动作语义、表单参数解释与临时参数初始化封闭在模块内
- NotificationChain 收敛为单一 manage_channel 纯透明转发,
  chain 层不再出现任何渠道名与模块特色
- endpoint 路由路径保持前端兼容,内部统一走通用接口
- 新增 6 项契约守护测试,文档记录通用模式:新渠道接入无需改 chain
2026-08-16 06:35:46 +08:00
jxxghp 6504cb36f5 fix(recognize): 修复识别测试仅传数据源时被成对身份校验误拒,名称识别与临时识别词恢复生效
- 8bf2f601 引入的显式身份成对校验把'仅传 media_source'也视为显式身份,识别测试恒传数据源导致直接返回未识别
- 成对约束仅在显式传 media_id 时生效;仅传数据源时保留为请求级识别源约束,按名称在指定数据源内识别
- 字符串来源经 normalize_media_source 规范,meta 自带同源身份(如 {tmdbid=})时优先按身份识别
- 新增 tests/test_recognize_source_selection.py 覆盖 source-only、同源身份采纳与成对拒绝场景
2026-08-16 05:36:40 +08:00
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 4858f4652b fix(runtime): 修复 ConfigReloadMixin 事件处理器因 __name__ 未同步被静默跳过,配置变更不再触发模块重载 (#6329) 2026-08-15 21:27:59 +08:00