jxxghp
6f0f528e2f
feat(agent): add configurable output language
2026-10-05 07:35:05 +08:00
jxxghp
e21d68496f
fix(torrents): use incremental cache for M-Team by default
...
Refs #6878
2026-10-04 10:46:49 +08:00
ChantXu64
8b30668cf3
fix(llm): preserve max reasoning effort ( #6866 )
2026-10-03 22:22:39 +08:00
ChantXu64
3c56f0bfdc
fix(llm): 允许温度留空以省略不兼容的请求参数 ( #6865 )
2026-10-03 19:55:43 +08:00
thsrite
4395ddecf2
feat(mediaserver): 内置媒体服务 MediaVault 更名为 Vyo
...
主项目更名为 Muvyo,内置媒体服务更名为 Vyo。模块目录、文件、类名、模块 ID、枚举、
名称描述、日志与文档统一改为 Vyo;配置类型值 mediavault 保持不变,
已保存的媒体服务器配置无需迁移。
2026-09-30 19:46:09 +08:00
InfinityPacer
8f9754b5f8
feat(api): serve API docs behind a runtime toggle, closed by default
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-30 18:03:37 +08:00
jxxghp
e306bc3fa8
fix(cli): move dev updates out of ordinary startup
2026-09-30 10:32:54 +08:00
InfinityPacer
810ee2896f
perf(startup): compose redis cache and agent memory only when used
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-29 20:07:34 +08:00
InfinityPacer
143ed49de0
docs(runtime): drop redundant allocator comments
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 18:20:24 +08:00
InfinityPacer
ecafd4ce14
docs(runtime): trim allocator background thread docstring
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 18:20:24 +08:00
InfinityPacer
7191b23555
fix(runtime): strip inherited jemalloc background thread config for subprocesses
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 18:20:24 +08:00
InfinityPacer
31ca107e41
fix(docker): enable jemalloc background thread only in the main process
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 18:20:24 +08:00
InfinityPacer
c5a57dbd8c
perf(runtime): release idle pool threads' allocator caches
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 17:30:52 +08:00
InfinityPacer
2a68dd6fea
fix(plugin): release reloaded plugin code held by framework caches ( #6807 )
2026-09-28 13:32:19 +08:00
jxxghp
1374328f84
fix(event): type module identity fallback precisely
2026-09-28 07:39:45 +08:00
jxxghp
342b570a07
fix(event): preserve handler identity after module unload
2026-09-28 07:29:48 +08:00
InfinityPacer
9af903e677
perf(memory): return idle allocator pages to the OS
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 02:33:53 +08:00
InfinityPacer
dc52317b51
fix(cache): keep binary blob caches out of Redis
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 02:24:40 +08:00
jxxghp
807a90fab7
fix(cache): increase Redis pool defaults
2026-09-26 15:06:59 +08:00
InfinityPacer
19e062c178
feat(plugin): attribute free-threaded GIL fallback to plugins ( #6767 )
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-23 13:12:02 +08:00
jxxghp
967431091e
feat: share GitHub token with Agent skills
2026-09-23 12:41:18 +08:00
InfinityPacer
3cef2149d0
fix(plugin): read the runtime compatibility gate from the declared snapshot ( #6761 )
...
Co-authored-by: Claude Opus 5 <noreply@anthropic.com >
2026-09-23 01:44:45 +08:00
InfinityPacer
0238351071
fix(plugin): v3t 下不再隐藏不兼容插件,改为提示不支持 ( #6760 )
...
* feat(plugin): surface v3t incompatibility instead of hiding plugins
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* chore(architecture): refresh dependency baseline after plugin gate split
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* fix(plugin): keep runtime-incompatible plugins out of startup sync
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* fix(plugin): annotate runtime compatibility ports without bare dict
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com >
2026-09-23 00:35:20 +08:00
moviepilot-codex[bot]
d96f00113c
feat: add GitHub Token device authorization
2026-09-21 18:30:15 +08:00
moviepilot-codex[bot]
63c07c43ad
fix(plugin): snapshot registry classes during reload ( #6750 )
2026-09-21 17:25:06 +08:00
moviepilot-codex[bot]
c0f7141e26
fix(plugin): invalidate federation static resource cache ( #6748 )
2026-09-21 16:24:38 +08:00
moviepilot-codex[bot]
9df35e7b83
fix: 修复配置快照、依赖同步和 Agent 上限
2026-09-21 04:26:48 +08:00
jxxghp
f08be04f97
fix(architecture): remove unused notification import
2026-09-20 11:47:07 +08:00
jxxghp
2e578a69ee
fix(notification): prevent untyped message broadcasts
2026-09-20 11:32:40 +08:00
jxxghp
ecbdcd5726
fix(cache): isolate async Redis clients per event loop
2026-09-19 18:25:43 +08:00
jxxghp
c2a232dec7
fix(docker): avoid starting update worker on regular restart
2026-09-17 17:37:38 +08:00
freeman
542f893123
fix(plugins): 启动时自愈被旧版本实现遮蔽的插件安装包根 ( #6718 )
2026-09-17 15:57:48 +08:00
jxxghp
71fffde878
feat(agent): 完善系统设置机器可读合同
2026-09-15 13:11:29 +08:00
jxxghp
ee6393974a
feat: 内置 Bangumi 数据与图片代理
2026-09-15 07:42:18 +08:00
Aqr-K
61aa3cd649
refactor(sdk): 插件契约基类迁入 SDK 并由 Compat 承接旧包根符号 ( #6701 )
2026-09-15 07:01:00 +08:00
Aqr-K
dc7e06ce38
fix(plugin): 落库失败的清理留在占位锁内,不再误删他人的实例 ( #6695 )
2026-09-14 17:41:08 +08:00
Aqr-K
c5d2fd2ef4
fix(plugin): 修分身恢复的占用判定、空模板配置重建、自动分配探测上限与预留落库回滚 ( #6692 )
2026-09-14 16:06:02 +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
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
57fb96fc3c
feat(plugin): 分身后缀可留空自动分配,并支持按后缀恢复已停用的分身 ( #6673 )
2026-09-14 07:00:31 +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
09a82b51a2
fix(config): disable default wallpaper
2026-09-13 20:03:51 +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
c60949ffff
Merge branch 'v3' into feat/plugin-instance-config-logging
2026-09-13 14:30:42 +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