jxxghp
|
67ae166a54
|
fix(servarr): restore subscription repository async contract
|
2026-09-18 22:13:33 +08:00 |
|
jxxghp
|
2e2a037eb8
|
fix(subscribe): align fork response model with returned id
|
2026-09-18 12:24:58 +08:00 |
|
jxxghp
|
4e9a64c0f0
|
refactor(application): 按模块子目录统一文件命名
|
2026-09-15 23:57:06 +08:00 |
|
jxxghp
|
71fffde878
|
feat(agent): 完善系统设置机器可读合同
|
2026-09-15 13:11:29 +08:00 |
|
jxxghp
|
37ea8ba14d
|
fix(subscribe): support cross-source video status lookup
|
2026-09-15 11:31:04 +08:00 |
|
jxxghp
|
ee6393974a
|
feat: 内置 Bangumi 数据与图片代理
|
2026-09-15 07:42:18 +08:00 |
|
jxxghp
|
ebddeee23b
|
feat(subscribe): accumulate music album track progress
|
2026-09-14 19:35:04 +08:00 |
|
jxxghp
|
1cb1f02f19
|
fix(auth): normalize site authentication parameters
|
2026-09-14 13:24:14 +08:00 |
|
jxxghp
|
f17b331a78
|
fix(auth): satisfy mypy initialization settings typing
|
2026-09-14 08:27:15 +08:00 |
|
jxxghp
|
1e416882c0
|
fix(auth): lock configured superuser during initialization
|
2026-09-14 07:58:36 +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
|
57fb96fc3c
|
feat(plugin): 分身后缀可留空自动分配,并支持按后缀恢复已停用的分身 (#6673)
|
2026-09-14 07:00:31 +08:00 |
|
Aqr-K
|
5fd04505c1
|
feat(plugin): 分身彻底清理,并按包含性校验收口插件数据目录解析 (#6671)
|
2026-09-13 21:05:04 +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 |
|
jxxghp
|
8072b7d78f
|
Refactor application architecture and compatibility boundaries
|
2026-09-13 12:53:00 +08:00 |
|
Aqr-K
|
e47d7defe7
|
feat(plugin): 插件本体与分身可各自设置独立日志等级
全局日志等级是一个开关,调试单个插件时只能整体下调。一旦下调,被调试插件那几行
日志会淹没在其他几十个插件与宿主自身的 DEBUG 输出里,找不出来;不下调又什么都
看不见。插件实例数量只会继续增长,这个矛盾不会自己消失。
因此把等级下放到实例:plugininstance 行加 log_level / log_expires_at 两列,本体与
分身共用同一张表、同一套语义。等级落在实例自己那一行而不是另起一张按实例 ID 索引
的表——它和业务参数一样是用户按实例设置的东西,同一个生命周期,实例被删时应当随行
一起消失。清除覆盖后若本体行只剩一对身份列,整行按 carries_only_identity 回收,与
清空业务参数同一规则。
覆盖带失效时间,因为它是调试设置不是长期配置:开了 DEBUG 忘记关,下次谁也想不起
某个插件为什么一直在刷日志。过期判定在读取时惰性执行并就地清理,不另起后台线程去
扫一张最多几十条的表。expires_at 在写入侧先归一到 UTC 再分发给缓存与落盘两处:客户端
提交的时间可能不带时区,两处各按进程时区折算一次,就会与读取口返回的 UTC 值差出一个
时区,表现为「提交的失效时刻和读回来的对不上」。
运行期用 ContextVar 在宿主自己控制的四类调用点绑定当前实例——构造与 init_plugin、
事件处理器、定时服务回调、插件声明的 HTTP 端点——而不是沿用 logger() 已有的栈帧内省。
内省认的是栈顶的模块与类,插件通过宿主公共方法转发调用时栈顶是宿主而不是发起调用的
插件,会把日志记到错误的来源上;分身更甚:分身共享源码,类的 __qualname__ 保持源类名
不变,内省根本分不出是哪一个分身在打日志。内省结果继续只用于文件路由,不参与等级判定。
等级过滤必须排在全局等级判定之前。官方现状是先按全局等级短路、之后才做内省,先短路
就会把实例调低的等级挡在门外,后面再怎么识别来源都看不到这条日志。
回调在注册时被捕获、稍后才由调度器或 FastAPI 调用,那时已经不在任何绑定作用域内,
故这两处改用 wrap_for_plugin_instance 把绑定包进回调自身;同一实例重复包装直接返回
原对象,避免插件缓存声明时包装链随重载次数无限增长。
进程内覆盖表按实例 ID 常驻,删分身时必须一并清掉:只删库里那一行的话,同一进程内用
相同后缀重建的分身会继承上一个分身的等级,界面显示「跟随全局」而实际仍按旧等级输出。
进程重启后反向从库预热缓存。
迁移链在 F1 之后追加:c4e1a7b9d2f6(3.0.35)-> 487f7e681955(3.0.36 加两列)。
顺带补了 agent 策略里缺失的 media.classification.policy.get 的 template 字段说明:
少了它,api_mcp_schema.json 与技能文档的两个生成脚本都跑不起来。
|
2026-09-12 19:05:05 -04:00 |
|
jxxghp
|
4d4327e25a
|
fix(site): report unauthenticated userdata refresh failures
|
2026-09-12 21:19:58 +08:00 |
|
jxxghp
|
1ba4d087c5
|
fix: scope subscription maintenance by media type
|
2026-09-12 20:56:05 +08:00 |
|
InfinityPacer
|
747f9f921f
|
fix(plugin): prioritize local plugin sources
|
2026-09-12 19:11:08 +08:00 |
|
jxxghp
|
4192585969
|
fix(classification): satisfy type and module contracts
|
2026-09-12 18:28:31 +08:00 |
|
jxxghp
|
889bdfe501
|
fix(classification): align migration defaults and source semantics
|
2026-09-12 17:43:36 +08:00 |
|
jxxghp
|
d21bd2981b
|
feat(agent): add image viewing tool
|
2026-09-11 23:17:36 +08:00 |
|
jxxghp
|
ed6439bf2e
|
fix(architecture): close mypy ratchet regressions
|
2026-09-11 15:24:46 +08:00 |
|
jxxghp
|
06ed22c584
|
feat(agent): improve browser-assisted site cookie login
|
2026-09-11 14:31:01 +08:00 |
|
jxxghp
|
e7b1e2c6e1
|
fix(architecture): close module endpoint type ratchet
|
2026-09-11 11:36:35 +08:00 |
|
jxxghp
|
92d809f351
|
refactor(api): isolate module endpoints
|
2026-09-11 11:08:03 +08:00 |
|
jxxghp
|
ae1187bd3f
|
feat(module): add dynamic module switches and catalogs
|
2026-09-11 10:31:53 +08:00 |
|
jxxghp
|
4972a3cdea
|
fix(ci): close post-merge mypy regressions
|
2026-09-10 10:19:16 +08:00 |
|
jxxghp
|
8cf7d73ad2
|
Merge pull request #6634 from dogodefi/codex/music-artist-collection-organize
|
2026-09-10 09:47:00 +08:00 |
|
jxxghp
|
0a43a307c4
|
fix(ci): restore architecture gate parity
|
2026-09-10 09:45:58 +08:00 |
|
jxxghp
|
02686ed674
|
feat(search): merge music artists into person search
|
2026-09-10 09:02:17 +08:00 |
|
yanjunpu
|
c6c7a1d621
|
feat: support artist collection downloads
|
2026-09-10 04:18:06 +08:00 |
|
jxxghp
|
7548ad0c53
|
feat(transfer): 手动整理支持 skip_success 跳过已成功记录
- 新增 skip_success 参数,规划前过滤已有成功整理历史的文件项
- 提取 _has_successful_manual_transfer_history 统一成功历史检测
- 重构 _get_successful_manual_transfer_histories 合并目录/文件查询路径
- 提取 _deduplicate_fileitems 去重逻辑为独立函数
- _TransferSubmissionCollector 增加跳过计数与回执展示
- 预览与执行共用候选范围,失败项保留重试规则
- 补充覆盖单选/多选/历史入口及混合目录的完整测试
|
2026-09-09 22:18:21 +08:00 |
|
jxxghp
|
54a7367462
|
fix(transfer): report durable submission outcomes per file
|
2026-09-09 20:54:20 +08:00 |
|
yanjunpu
|
340bafbdaa
|
test: align music library status with media existence contract
|
2026-09-09 17:01:11 +08:00 |
|
yanjunpu
|
ee1a37a2ac
|
feat: add music library status endpoint
|
2026-09-09 17:01:11 +08:00 |
|
jxxghp
|
9e1c25124b
|
fix(transfer): restore regression and architecture gates
|
2026-09-09 13:40:35 +08:00 |
|
jxxghp
|
ce690b1140
|
feat(transfer): add failure stage, recovery action, retry count, and cleanup status to transfer history
|
2026-09-09 13:17:36 +08:00 |
|
yanjunpu
|
45c2254f92
|
fix(media): preserve search plugin ABI
|
2026-09-09 04:11:28 +08:00 |
|
yanjunpu
|
0a6c440526
|
fix(media): preserve unified music search contract
|
2026-09-09 04:05:02 +08:00 |
|
yanjunpu
|
2e8664c1dc
|
fix(music): scope and rank manual search results
|
2026-09-09 03:57:20 +08:00 |
|
jxxghp
|
a69c9073cb
|
feat(transfer): implement recovery commands for discarding corrupt tasks
|
2026-09-08 23:15:38 +08:00 |
|
jxxghp
|
d0c894f5eb
|
fix(transfer): close durable error recovery loop
|
2026-09-08 22:38:59 +08:00 |
|
jxxghp
|
64543a3765
|
Merge branch 'v3' into codex/music-album-batch-transfer
|
2026-09-08 22:29:45 +08:00 |
|
yanjunpu
|
13f0ac4faa
|
fix(transfer): reidentify selected music history batches
|
2026-09-08 22:17:45 +08:00 |
|
yanjunpu
|
83a0e21035
|
Merge remote-tracking branch 'origin/v3' into codex/manual-source-classification
|
2026-09-08 22:10:15 +08:00 |
|
yanjunpu
|
4d7bd96c6b
|
fix(music): preserve album context for manual batches
|
2026-09-08 15:06:36 +08:00 |
|
jxxghp
|
a2f1407c95
|
Merge pull request #6601 from dogodefi/codex/music-release-preferences
feat(music): add MusicBrainz release preferences
|
2026-09-08 14:27:06 +08:00 |
|
yanjunpu
|
5a4a5a1188
|
Merge remote-tracking branch 'origin/v3' into codex/manual-source-classification
# Conflicts:
# docs/architecture-overview.md
# docs/architecture/optimization-checklist.md
# tests/fixtures/architecture/dependency-baseline.json
|
2026-09-08 13:45:01 +08:00 |
|