github-actions[bot]
|
1787ffbcce
|
build(plugin-market): sync default from MoviePilot-Wiki@2f1dd7a3b141
v3.0.2
|
2026-09-14 09:53:08 +00:00 |
|
Aqr-K
|
dc7e06ce38
|
fix(plugin): 落库失败的清理留在占位锁内,不再误删他人的实例 (#6695)
|
2026-09-14 17:41:08 +08:00 |
|
jxxghp
|
2dedd00db4
|
test: follow declared application version in backup names
|
2026-09-14 16:57:35 +08:00 |
|
jxxghp
|
f6e8c59ca1
|
更新 version.py
|
2026-09-14 16:39:01 +08:00 |
|
Aqr-K
|
c5d2fd2ef4
|
fix(plugin): 修分身恢复的占用判定、空模板配置重建、自动分配探测上限与预留落库回滚 (#6692)
|
2026-09-14 16:06:02 +08:00 |
|
Aqr-K
|
bc99355b2a
|
fix(plugin): 补上换入删除旧目录中途失败时的回滚 (#6691)
|
2026-09-14 15:12:51 +08:00 |
|
Aqr-K
|
1afda39ee7
|
chore(architecture): 同步官方新增站点认证模块的启动导入模块数 (#6690)
|
2026-09-14 15:12:01 +08:00 |
|
jxxghp
|
4df910990f
|
test(architecture): refresh startup module baseline
|
2026-09-14 13:55:45 +08:00 |
|
jxxghp
|
05aa9a7c1c
|
fix(auth): type site authentication configuration
|
2026-09-14 13:45:22 +08:00 |
|
jxxghp
|
4af54fcf5f
|
test(architecture): refresh dependency baseline
|
2026-09-14 13:35:07 +08:00 |
|
jxxghp
|
1cb1f02f19
|
fix(auth): normalize site authentication parameters
|
2026-09-14 13:24:14 +08:00 |
|
jxxghp
|
6d82f44fc8
|
fix(music): split core recognition and organization optimizations (#6686)
|
2026-09-14 13:04:58 +08:00 |
|
jxxghp
|
9724305a03
|
fix(imdb): handle null episode fields
|
2026-09-14 12:42:54 +08:00 |
|
jxxghp
|
f17b331a78
|
fix(auth): satisfy mypy initialization settings typing
|
2026-09-14 08:27:15 +08:00 |
|
jxxghp
|
6f9ad991d5
|
chore(architecture): sync host baseline metrics
|
2026-09-14 08:20:11 +08:00 |
|
jxxghp
|
2b1757e71d
|
fix(i18n): translate configured superuser initialization error
|
2026-09-14 08:07:43 +08:00 |
|
jxxghp
|
1e416882c0
|
fix(auth): lock configured superuser during initialization
|
2026-09-14 07:58:36 +08:00 |
|
Aqr-K
|
dd4ae3e8d5
|
refactor(plugin): 移除已无调用者的物理分身源码改写器 (#6683)
物理分身是早期实现:复制整个插件目录,再用字符串替换改写副本源码里的类名、
plugin_config_prefix 和联邦构建产物。虚拟实例接管后,分身不再复制目录,
由装载器改写类身份、按实例 ID 隔离配置与数据,这套改写器随之失去调用者。
求证依据(全仓 git grep,覆盖 app/、tests/、scripts/、docs/、skills/):
- PluginPackageManager.clone() 无任何生产调用者。分身的唯一生产路径是
POST /api/v1/plugin/clone/{plugin_id} -> PluginManager.clone_plugin()
-> PluginCloneService.clone(),后者只写 PluginInstance 记录与隔离配置,
不碰包适配器。clone() 也没有经 PluginSystemServices 暴露出去。
- clone() 的四个私有实现 _modify_plugin_files / _modify_python_file /
_modify_federation_files / _rename_federation_assets,消费者只有 clone()
自身与 PluginSystemServices 的同名透传。
- PluginSystemServices 的四个透传,消费者只有 PluginManager 的 _modify_* shim。
- PluginManager 的四个 shim 无任何调用者。动态可达性已单独排查:
全仓没有 getattr/字符串反射指向这些名字;app/runtime/compat/manifest.py
不登记它们的别名(只有 app.core.plugin -> 本模块的模块级映射);
app/sdk/ 不再导出;PluginManager 与 PluginPackageManager 都没有
__getattr__ 兜底,属性不存在即 AttributeError;官方插件基线
official-plugin-baseline.json 零命中。
- @observe_compat_facade("PluginManager") 只包装类上已存在的方法,
不会凭空合成属性,因此 shim 删除后 enforce_facade 再也匹配不到
notices.py 里那四条 key,登记随之成为不可达数据,一并删除。
替代路径:这四条弃用声明当初承诺的替代目标是
get_plugin_system().package._modify_*(),那是一次「门面搬到适配器」的
重定位登记,本次连同能力一起下线;分身能力本身的替代路径是虚拟实例
PluginCloneService.clone(),它已在生产链路上,见
docs/v2-to-v3-overview.md §3.6「不复制插件源码,也能保持各实例配置隔离」。
既有磁盘上的旧物理分身不受影响:卸载路径读取 is_clone 属性并调用
remove_plugin_package() 的逻辑原样保留,只是不再产生新的物理分身。
这是对已公告弃用 API(DeprecationStage.SILENT,since v3.0.0)的正式移除。
连带改动:
- package.py 的 import re 仅服务于 _modify_python_file,同步移除;模块
docstring 去掉「分身处理」。
- system.py 的 typing.cast 仅服务于被删透传,同步移除。
- tests/test_plugin_package_manager.py::test_clone_rewrites_python_and_federation_assets
是这套改写器的唯一测试,且只覆盖已无调用者的路径,随实现一并删除。
(删的是测试函数不是测试文件,tests/run.py 的分片装箱不变。)
- mypy 低水位随实现下降:app/runtime/extensions/plugin/manager.py 的
assignment 8->4(四个 shim 的 version/icon 参数 str = None)、
no-untyped-def 12->11(_rename_federation_assets 缺返回标注),
fixture 与 docs/refactor/optimization-checklist.md 的全量 mypy 计数
9,371 -> 9,366 同步更新。依赖、复杂度、ruff、并发等其余基线无变化。
Co-authored-by: jxxghp <jxxghp@gmail.com>
|
2026-09-14 07:19:46 +08:00 |
|
Aqr-K
|
5e232ca14d
|
fix(plugin): 安装记录大小写不敏感查询、游标物化,site 端点改从 Application 取 (#6682)
* fix(plugin): 安装 journal 按大小写不敏感列出事务记录
create 用 func.lower 判定同一物理插件并据此拒绝重复占位,list 却还是等值过滤。
判据分叉后,恢复流程查不到那条被 create 认定为未收尾的 journal,会认为没有待恢复
事务,而新事务又永远被同一行挡住。list 改用与 create 相同的 func.lower 判据。
* fix(plugin): 批量读插件身份时在事务内物化游标
list_by_plugin_ids 无会话调用时由组合根另开短事务,会话在 lambda 返回后立即关闭,
外层再 list() 消费惰性游标会撞上 "identity map is no longer valid",一行都读不到。
补上 .all(),让行在事务内取完。
* refactor(api): site 端点从 Application 取插件路由刷新
register_plugin_api 的唯一拥有者是 app.application.plugin.routes,
dependencies/plugin.py、scheduler/reconcile.py 与 initializers/plugins.py 都已从那里
取用,只剩 site 端点还在向 plugin 端点横向借。改为同一来源,并加门禁锁住这条判据。
依赖基线相应下降一条边(8650 -> 8649:site 不再到达 app.api.endpoints 与
app.api.endpoints.plugin,改为到达 app.application.plugin.routes),mypy 低水位同步
下降一条 attr-defined,两处文档数字随之更新。
---------
Co-authored-by: jxxghp <jxxghp@gmail.com>
|
2026-09-14 07:18:50 +08:00 |
|
Aqr-K
|
efb676318d
|
fix(test): 还原 Agent 生命周期用例泄漏的进程级资源版本 provider (#6684)
|
2026-09-14 07:02:05 +08:00 |
|
Aqr-K
|
6ea1cc9433
|
fix(plugin): 插件降级重装时拒绝迁移树不认识的库 revision (#6681)
|
2026-09-14 07:01:32 +08:00 |
|
Aqr-K
|
2789440796
|
fix(plugin): 分身 ID 对外查询统一归一到源插件,并补齐认证远程入口的源插件字段 (#6680)
|
2026-09-14 07:01:18 +08:00 |
|
Aqr-K
|
9955698b1a
|
fix(plugin): 加载入口补生命周期锁,手工重载带上分身 (#6679)
|
2026-09-14 07:01:04 +08:00 |
|
Aqr-K
|
5c01cdddb3
|
fix(plugin): 插件安装改为暂存后原子换入,避免下载失败删掉已装插件 (#6678)
|
2026-09-14 07:00:50 +08:00 |
|
Aqr-K
|
57fb96fc3c
|
feat(plugin): 分身后缀可留空自动分配,并支持按后缀恢复已停用的分身 (#6673)
|
2026-09-14 07:00:31 +08:00 |
|
jxxghp
|
a51acb05e5
|
fix(download): validate torrent bytes before html fallback
|
2026-09-14 00:32:11 +08:00 |
|
developer-wlj
|
11a2a09bf6
|
feat(update): 添加exe部署环境下的更新支持 (#6668)
|
2026-09-13 21:06:59 +08:00 |
|
Aqr-K
|
8e4a49e958
|
fix(plugin): 修复分身与本体在事件定向和注册表键上的身份混淆 (#6672)
|
2026-09-13 21:05:26 +08:00 |
|
Aqr-K
|
5fd04505c1
|
feat(plugin): 分身彻底清理,并按包含性校验收口插件数据目录解析 (#6671)
|
2026-09-13 21:05:04 +08:00 |
|
jxxghp
|
62fabea378
|
fix(scheduler): disable wallpaper cache without wallpaper
|
2026-09-13 21:02:15 +08:00 |
|
jxxghp
|
65907328d2
|
fix(plugin): skip invalid installed IDs during startup
|
2026-09-13 20:04:47 +08:00 |
|
jxxghp
|
09a82b51a2
|
fix(config): disable default wallpaper
|
2026-09-13 20:03:51 +08:00 |
|
Aqr-K
|
af3c78c7dc
|
chore(architecture): 固化 Ruff 低水位至 519 (#6669)
|
2026-09-13 19:42:45 +08:00 |
|
Aqr-K
|
f5e68576b9
|
fix(plugin): 修复实例引导合并、存在性判据与实例日志等级贯穿控制台 (#6667)
|
2026-09-13 18:59:48 +08:00 |
|
jxxghp
|
421d2febac
|
feat(plugin): skip invalid plugin instance records during read operations
|
2026-09-13 16:56:26 +08:00 |
|
Aqr-K
|
d44480d739
|
Merge pull request #6666 from Aqr-K/feat/plugin-instance-target-enablement
feat(plugin): 插件实例默认调用目标与启停,未指定实例时不再兜底取第一个
|
2026-09-13 16:37:27 +08:00 |
|
jxxghp
|
30d6d9e146
|
chore(architecture): align complexity baseline with formatting
|
2026-09-13 14:55:22 +08:00 |
|
jxxghp
|
8a6d54204d
|
chore(architecture): keep chain files within complexity budget
|
2026-09-13 14:51:11 +08:00 |
|
jxxghp
|
c1a2e11941
|
chore(architecture): sync mypy diagnostic count
|
2026-09-13 14:41:40 +08:00 |
|
jxxghp
|
b67454eb29
|
Merge pull request #6662 from Aqr-K/feat/plugin-instance-config-logging
feat(plugin): 插件配置与实例描述符迁入独立表,实例可各自设置日志等级
|
2026-09-13 14:30:57 +08:00 |
|
jxxghp
|
c60949ffff
|
Merge branch 'v3' into feat/plugin-instance-config-logging
|
2026-09-13 14:30:42 +08:00 |
|
jxxghp
|
0ae26e3a4d
|
docs: synchronize Ruff diagnostic count
|
2026-09-13 14:26:31 +08:00 |
|
jxxghp
|
c868faf0cf
|
fix(synologychat): skip unsupported command menu registration
|
2026-09-13 14:22:59 +08:00 |
|
Aqr-K
|
3d594ecee3
|
refactor(plugin): 插件配置改走独立通道,SystemConfig 不再按键值分支
插件配置此前借用 systemconfig 的 plugin.<实例ID> 单键,为了换表又在
SystemConfigOper 的 set/delete/load_snapshot 里按该前缀开分支。这是反向依赖:
一个对所有键一视同仁的通用键值存储被迫知道「插件」这个概念,读写路径依键值而
异,「这个键落在哪张表」只有读代码才说得清;规范方法按值加特例,也让此后任何新
键都要先确认自己会不会被拦截。
本次把插件配置整条链拆出,形状与本分支日志等级那条链一致:
- SystemConfigOper 整体回退到官方实现,与 f70d7c141 逐字节相同,对所有键一视同仁。
- 配置端口改按实例 ID 寻址:PluginStorage 新增 read_config / write_config /
async_write_config / delete_config,PluginConfigStore 去掉 key_prefix 与 _key,
不再有任何字符串键经过;plugin_exists 存在性规则、空键过滤与 force 语义不变。
- PluginInstanceOper 补齐读取与异步写入原语 get_config_data /
async_save_config_data,同步与异步共用同一份落库决策,避免两条路径对「值未变化
不写」和「建行用哪个源插件」各自分叉。
- _PluginBase 的 get_config / update_config 直连 PluginInstanceOper,方法名、签名、
返回与 docstring 不变;self.systemconfig 保留,插件读 SystemConfigKey 枚举值仍
然合法,插件公开面没有扩大。
插件直接用 SystemConfig 存取自身配置不予支持。它本就不是封装过的插件配置通道,
为它设计兼容或加守卫拦截,等于再把「插件」塞回通用存储里——那正是本次要拆掉的东
西。拆开后 plugin.<ID> 只是一个与插件无关的普通 systemconfig 键:迁移已经把旧的
plugin.* 行搬进插件实例表,读它拿到 None,写它会新增一条谁也不读的 systemconfig
记录,插件配置通道既不读也不写它,两边不会再有任何交叉。
代价是读取从内存快照变成一次按实例 ID 的主键查询。调用点都不在热路径上:宿主侧
只有插件启动/重载、配置表单接口与分身创建三处,插件侧 get_config() 惯例在
init_plugin 里取一次。写入侧没有变化,本来就是一次事务。
回归防线:新增用例断言 SystemConfigOper 对 plugin. 前缀没有任何特殊行为——写进去
就是一行普通 systemconfig 记录,读出来就是刚写的值,不会被路由到插件实例表。
兼容层零改动,三个 alembic 迁移一行未改。
|
2026-09-13 01:41:57 -04:00 |
|
jxxghp
|
8072b7d78f
|
Refactor application architecture and compatibility boundaries
|
2026-09-13 12:53:00 +08:00 |
|
jxxghp
|
990e3ac3ae
|
fix(module): enhance documentation for transfer plan checkpoint method parameters
|
2026-09-13 12:38:20 +08:00 |
|
jxxghp
|
765b185d42
|
fix(module): add preview parameter to transfer plan checkpoint method
|
2026-09-13 12:33:50 +08:00 |
|
Aqr-K
|
e1b961b88e
|
fix(log): 回调换实例重绑时从原始回调重包
防止包装链随重载次数无限增长的幂等守卫只判断「是否已被包装」,没判断「是不是
为同一个实例包装的」。已为实例 A 包装的回调再为实例 B 包装时,外层先绑定 B,
调用旧包装器后内层又绑回 A,原始回调仍在 A 的上下文中执行,B 的日志按 A 的
覆盖等级过滤,实例日志设置互相隔离的合同被破坏。插件的 `get_api`/`get_service`
返回同一份缓存声明、被多个分身依次注册即可触发。
改为在包装标记里一并记住最内层的原始回调,换实例重绑时剥回原始回调重新包装,
同实例重复包装仍返回原对象。标记值用私有 NamedTuple 承载并以 `isinstance` 校验,
`Mock` 之类会为任意属性名凭空造值的回调才不会让重绑取到与包装无关的垃圾。
|
2026-09-13 00:14:56 -04:00 |
|
Aqr-K
|
3eee49659d
|
fix(plugin): 旧实例键回滚往返新增的分身要能合并进独立表
`PluginInstances` 旧键刻意保留作回滚依据、从不清理,旧版本只认它,因此它在
迁移之后仍可能长出新条目或被改写。原判据是「一条一次性的永久标记」加「整表
是否为空」:标记落下且表非空之后,回滚到旧版本新建的分身会被永久跳过,保留
旧键作回滚依据的承诺随之落空。两个条件都表达不出「旧载荷相对已导入内容有没有
新增或变化」。
改为按条目记住导入时的内容指纹(`PluginInstancesImported` 的载荷从布尔改为
`{实例ID: 摘要}`):指纹对得上就跳过,独立表里那行用户怎么改都不会被旧副本盖
回去;指纹对不上说明旧版本改写过,合并;指纹没记过且表里也没有该行说明旧版本
新增过,导入;指纹没记过但表里已有该行(alembic 刚搬过去的那一批)只认领指纹
不覆盖。指纹取自原始载荷而非模型 dump,模型字段将来增减才不会让全部指纹一起
失配、把用户改动整批盖回去。指纹表与旧键内容对齐后无变化的启动不再产生写入,
也不额外查表。
|
2026-09-13 00:14:47 -04:00 |
|
jxxghp
|
9ba513debc
|
fix(classification): initialize defaults in fresh v3 environments
|
2026-09-13 11:31:54 +08:00 |
|