150 Commits

Author SHA1 Message Date
jxxghp
d9afaba8dd feat(plugin): expose documentation before installation (#7222) 2026-10-27 21:37:00 +08:00
Aqr-K
71c2e9e3df fix(storage): retain history until target cleanup is confirmed (#7202) 2026-10-27 05:42:07 +08:00
jxxghp
3ac7526930 feat(notification): relay AppPush through private MoviePilot Server 2026-10-24 07:32:00 +08:00
Aqr-K
6610a8c008 fix: retain plugin lifecycle ownership and recover installation state (#7146)
* fix: retain plugin lifecycle ownership and recover installation state

* test: cover plugin rollback and uninstall lifecycle boundaries

---------

Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-10-23 07:44:07 +08:00
jxxghp
fa67be8e4a fix(scraping): normalize artwork and reuse downloads for aliases
Add independent alias and Fanart 4K switches, identify exact artwork names, preserve episode and season conventions, and detect missing images across case and format variants. Normalize downloaded bytes to JPEG or PNG and reuse one request with storage hard links or local upload copies.

Refs #7128
2026-10-22 09:25:42 +08:00
jxxghp
6d4ce83837 fix(types): clear host mypy debt and prevent typing regressions
严格检查全部宿主源码,清零类型错误预算并移除按模块类型豁免。
按原因、所属方法、错误码及语法指纹锁定必要兼容例外和站点类型桩,
CI 阻断新增忽略、检查范围退化、本地桩替代真实接口及新的类型错误。

修复空值、异步和供应方类型边界,保持插件与 API 兼容合同,
并补充存储、订阅、通知、Agent 和工作流边界的回归覆盖。
2026-10-21 22:03:18 +08:00
Aqr-K
bf4ef4214e perf(mediaserver): add caller-controlled query projections (#7068)
* perf(mediaserver): add caller-controlled query projections

* test(mediaserver): cover query projection option contracts

---------

Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-10-19 08:33:45 +08:00
jxxghp
60d2fe418a fix(douban): preserve recommendation lists and page model contracts 2026-10-18 15:08:37 +08:00
DDSRem
e0642eafa7 chore(types): reduce v3 host mypy debt (#7057)
* chore(types): clear AniList endpoint mypy debt

* chore(types): clear Douban endpoint mypy debt

* chore(types): clear recommendation endpoint mypy debt

* chore(types): clear subscription notification mypy debt

* chore(types): clear SDK string compatibility mypy debt

* chore(types): ratchet v3 host mypy across remaining files

* chore(types): reduce v3 host mypy debt and retire ledger

* chore(types): reconcile host snapshot with upstream HTTP pool

* test(types): cover host paths exposed by mypy cleanup
2026-10-18 09:37:49 +08:00
DDSRem
2de976f6b3 Merge pull request #7050 from DDSRem-Dev/codex-comment-migration
docs: 统一全项目中文注释和结构化契约说明
2026-10-17 19:26:29 +08:00
jxxghp
3075efba1c style: order module adapter imports 2026-10-17 12:36:48 +08:00
jxxghp
dc2f04189f fix: type host module configuration capture 2026-10-17 12:36:48 +08:00
cosini
e36884766c feat(douban): 新增豆瓣短评与影评接口
* feat(douban): 新增豆瓣短评与影评接口

* fix(douban): satisfy comment endpoint CI gates

---------

Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-10-17 12:31:41 +08:00
jxxghp
68101746ae fix(plugin): recover invalid historical instance rows (#7039)
* fix(plugin): recover invalid historical instance rows

* fix(plugin): keep maintenance on existing startup path

* style(plugin): order maintenance test imports

* chore(architecture): record plugin instance validator edges
2026-10-17 06:34:25 +08:00
jxxghp
22283b19ee refactor(types): govern plugin monitor candidate contracts 2026-10-16 23:21:33 +08:00
jxxghp
2b5eb02701 refactor(types): govern plugin path candidate contracts 2026-10-16 23:20:47 +08:00
jxxghp
6f7731545f refactor(types): govern plugin sync candidate payloads 2026-10-16 23:19:31 +08:00
jxxghp
38dd03b9f7 refactor(types): declare plugin system market port 2026-10-16 23:18:09 +08:00
jxxghp
2b5e0ce473 refactor(types): declare plugin catalog facade projections 2026-10-16 18:55:41 +08:00
jxxghp
661e9d95ae refactor(types): declare plugin access comparison result 2026-10-16 18:49:36 +08:00
jxxghp
5e14615dce refactor(types): govern raw plugin metadata mappings 2026-10-16 15:49:36 +08:00
jxxghp
3ee36342bd refactor(types): prove acquired plugin mutation context 2026-10-16 15:15:17 +08:00
jxxghp
ca15f05038 refactor(types): govern plugin lifecycle configuration 2026-10-16 15:15:17 +08:00
jxxghp
2d7af4b0a7 refactor(types): govern stored plugin configuration values 2026-10-16 15:15:17 +08:00
jxxghp
967860e830 refactor(types): specify plugin clone configuration values 2026-10-16 13:25:40 +08:00
jxxghp
ece46052aa refactor(types): preserve configured service schema types 2026-10-16 13:25:40 +08:00
jxxghp
4955b7b9ea fix: harden backend isolation and execution safety 2026-10-16 09:11:28 +08:00
InfinityPacer
d9ac4cc429 feat(plugin): expose remote entry and version on agent pets
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 04:08:15 +08:00
InfinityPacer
40e80f43f5 fix(plugin): advance runtime generation when a plugin is enabled or disabled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 04:08:15 +08:00
InfinityPacer
e97f64e777 feat(plugin): add avatar to agent pet declarations
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 04:08:15 +08:00
InfinityPacer
25aaf3a32b feat(plugin): add agent pet extension contract
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 04:08:15 +08:00
jxxghp
b663825fe7 fix(plugin): recover dependencies without disabled constraints
Keep enabled host and clone sources in dependency recovery. Fall back to per-plugin requests while retaining ready and recovered manifest constraints, preserving original sources and cancellation ownership.

Refs #6943
2026-10-10 12:20:13 +08:00
jxxghp
d7db4cfc0b fix(plugin): serialize package swaps with imports (#6939) 2026-10-10 07:42:37 +08:00
freeman
f3ad81b39e style: apply safe ruff auto-fixes and exempt startup late imports
Run `ruff check app tests scripts --fix` with the configured rule set
(E4/E7/E9/F/I): import sorting (I001), f-strings without placeholders
(F541), lambda/variable/unused-import cleanups that ruff marks safe.
Nine files whose only ruff debt sits next to pre-existing pylint
import-resolution errors (lazy exports, sys.path script imports) or
whose "unused" imports are reached through attribute access by tests are
left untouched so the changed-file pylint gate and the benchmark tests
stay green; their diagnostics remain in the baseline.

app/startup/lifecycle/__init__.py and app/main.py import business
modules after cache composition, import-path and stdio setup on purpose
(the source comments document the contract), so declare E402
per-file-ignores for them instead of adding per-line noqa.

Ruff ratchet watermark drops from 498 to 100; sync the baseline fixture
and the optimization checklist figure.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 13:29:09 +08:00
ChantXu64
e5e2558585 feat(search): 订阅补全逐页搜索、断点续搜与资源页手动分页 (#6907) 2026-10-07 14:40:55 +08:00
thsrite
4395ddecf2 feat(mediaserver): 内置媒体服务 MediaVault 更名为 Vyo
主项目更名为 Muvyo,内置媒体服务更名为 Vyo。模块目录、文件、类名、模块 ID、枚举、
名称描述、日志与文档统一改为 Vyo;配置类型值 mediavault 保持不变,
已保存的媒体服务器配置无需迁移。
2026-09-30 19:46:09 +08:00
InfinityPacer
2a68dd6fea fix(plugin): release reloaded plugin code held by framework caches (#6807) 2026-09-28 13:32:19 +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
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]
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
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
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