jxxghp
|
71fffde878
|
feat(agent): 完善系统设置机器可读合同
|
2026-09-15 13:11:29 +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
|
d6509f092c
|
chore(plugin): 技能表目录登记补进生成脚本并补迁移往返验证
技能文档 skills/database-operation/SKILL.md 的核心表清单是
scripts/generate_agent_skill_docs.py 里 DATABASE_TABLE_GUIDES 的生成物,
前面两笔改动却是手改产物登记 plugininstance,任何人重跑生成器都会把它弄丢。
把条目补进字典,再用生成器重出该文档。
同时补上 agentinvocation:官方 v3 已有该表但字典里没有,生成器因此直接抛
ValueError,不补就根本跑不起来。它的说明照抄文档里现有的那份手写文案,
避免登记动作反而把已有描述改瘦。
迁移测试原本只按单个 revision 直接调 upgrade(),绕过了 Alembic 自己的版本
解析与记账,链接错的 down_revision、少写的 downgrade、重复升级时的重复建表
都测不出来。新增用例改走 alembic.command,在落盘的临时库上从官方 head
b2d4f6a8c1e3 升到链尾 487f7e681955 再降回去,验证配置与描述符确实落到
plugininstance、旧 plugin.* 键就地移除而 PluginInstances 键按回滚依据保留。
|
2026-09-12 19:48:57 -04: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 |
|
Aqr-K
|
4dbb8b8204
|
feat(plugin): 插件配置与实例描述符迁入独立表
插件配置此前寄存在 systemconfig 的 plugin.<实例ID> 单键下,实例描述符则整份挤在
PluginInstances 这一个 JSON 键里,两者都不成立:
- plugin.<ID> 是裸字符串 key,而仓库规则本身禁止用裸字符串做 SystemConfig key,
只允许先定义 SystemConfigKey 枚举项;插件 ID 由用户安装决定,永远枚举不出常量。
条目数随安装量增长,混在系统设置表里会把主程序自己的设置项淹掉。
- 那个键存的其实是实例 ID,表里没有任何一列说得出它属于哪个插件,想列出某个插件
的全部实例配置只能靠字符串前缀去猜。
- 实例描述符整份读出再整份写回,改一个分身要重写全部分身。
改为 plugininstance 一实例一行:instance_id 与 source_plugin_id 构成身份,本体与
分身由两者是否相等派生而不设模式列——模式列会是这个等式的冗余副本,两者一旦失步
同一行就会在不同读取口被判成不同角色。展示信息与业务参数同存一行,属于同一个
生命周期,分表只会让建分身、删分身退化成两张表之间的协调问题。
读写路由落在 SystemConfigOper.get/set/delete,而不是在各个调用方各改一处:第三方
插件可能直接用 self.systemconfig.get("plugin.xxx") 读写自己的配置,只改
PluginConfigStore 与 _PluginBase.get_config/update_config 必然漏掉它们。路由只做
前缀识别,插入、更新与空本体行回收都委托 PluginInstanceOper,不在配置层重抄一遍。
PluginInstances 旧键迁移后不删,留作回滚依据,并以
SystemConfigKey.PluginInstancesImported 标志防止重复导入;判据不能是「表当前为空」,
否则用户把分身全部删光后,下次启动会把它们整批导回来。
迁移链:b2d4f6a8c1e3 -> 281965691a20(3.0.34 建表并搬描述符)
-> c4e1a7b9d2f6(3.0.35 加 config_data 并搬 plugin.* 配置)。
依赖基线与启动模块数随两个新模块重算,架构文档与数据库技能表目录同步登记新表。
|
2026-09-12 17:39:36 -04:00 |
|
jxxghp
|
06ed22c584
|
feat(agent): improve browser-assisted site cookie login
|
2026-09-11 14:31:01 +08:00 |
|
jxxghp
|
ae1187bd3f
|
feat(module): add dynamic module switches and catalogs
|
2026-09-11 10:31:53 +08:00 |
|
jxxghp
|
0f8aa4dfa9
|
fix(agent): return operation input contracts on errors
|
2026-09-11 08:07:54 +08:00 |
|
jxxghp
|
f5bc72ff44
|
fix(agent): load split skill docs through read_skill
|
2026-09-11 07:50:18 +08:00 |
|
jxxghp
|
b4cf40d46a
|
Merge remote-tracking branch 'origin/v3' into codex/agent-evaluation-20260909
# Conflicts:
# skills/moviepilot-api/api/download.md
|
2026-09-11 07:32:54 +08:00 |
|
jxxghp
|
c5d5698e04
|
feat(agent): complete moviepilot api contracts
|
2026-09-11 07:21:05 +08:00 |
|
jxxghp
|
8c0746172a
|
docs(agent): make download contract self contained
|
2026-09-11 07:13:46 +08:00 |
|
jxxghp
|
1eda214dfc
|
docs(agent): clarify common API contracts
|
2026-09-11 06:53:44 +08:00 |
|
jxxghp
|
1a1aa59838
|
docs(architecture): move refactor documents
|
2026-09-11 06:20:59 +08:00 |
|
jxxghp
|
d096a1380d
|
docs(agent): split moviepilot api skill contracts
|
2026-09-10 23:00:16 +08:00 |
|
jxxghp
|
f383a8a5a3
|
feat(agent): 接入媒体自动分类策略 API
|
2026-09-10 22:36:50 +08:00 |
|
jxxghp
|
21e154d6d2
|
feat(agent): deliver browser screenshots as model-visible images
|
2026-09-10 02:17:01 +08:00 |
|
jxxghp
|
c92483d2a8
|
feat(agent): stream terminal output with resumable cursors
|
2026-09-10 00:29:09 +08:00 |
|
jxxghp
|
c3db7531f8
|
fix(agent): report command outcomes and clean up cancelled runs
|
2026-09-09 23:06:28 +08:00 |
|
jxxghp
|
54a7367462
|
fix(transfer): report durable submission outcomes per file
|
2026-09-09 20:54:20 +08:00 |
|
jxxghp
|
5fa5b414aa
|
feat(agent): harden tool outcomes, recovery and discovery
|
2026-09-09 19:55:21 +08:00 |
|
jxxghp
|
a69c9073cb
|
feat(transfer): implement recovery commands for discarding corrupt tasks
|
2026-09-08 23:15:38 +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 |
|
jxxghp
|
ca627a4f00
|
fix: release plugin media sources from built-in declarations
|
2026-09-08 10:00:33 +08:00 |
|
jxxghp
|
8255df4df4
|
fix(subscribe): remove cumulative search delays and resume pending sites
|
2026-09-08 08:58:35 +08:00 |
|
jxxghp
|
b85aa5e31b
|
feat(subscription): add search_interval and last_search fields for subscription management
|
2026-09-08 07:12:21 +08:00 |
|
yanjunpu
|
e267a18476
|
Merge remote-tracking branch 'origin/v3' into codex/manual-source-classification
# Conflicts:
# tests/fixtures/architecture/dependency-baseline.json
|
2026-09-07 23:50:34 +08:00 |
|
yanjunpu
|
0570eb24fc
|
Merge remote-tracking branch 'origin/v3' into codex/manual-source-classification
|
2026-09-07 23:27:11 +08:00 |
|
jxxghp
|
7ccb1d9dee
|
feat(classification): provide source-aware condition dictionaries
|
2026-09-07 23:21:25 +08:00 |
|
jxxghp
|
b40eda2617
|
fix(transfer): preserve durable retry for failed manual history
|
2026-09-07 23:17:00 +08:00 |
|
thsrite
|
d04b721f84
|
feat(mediaserver): 新增 MediaVault 自建媒体库模块
通过 MediaVault 管理端口的原生接口接入自建媒体库,凭据为管理面板的长效 API Key:
- 媒体库列表、条目分页遍历、条目详情与总数
- 按标题/年份/媒体身份判断电影与剧集存在性,季集齐全度与季集条目 ID
- 数量统计、最近入库、继续观看、封面与背景图直链、播放地址
- 入库后按目标路径命中媒体库并排队后台扫描,未命中时回退全库扫描
- 用 MediaVault 账号完成 MoviePilot 用户认证
MediaVault 无音乐库也不外发 Webhook,get_music 与 webhook_parser 不实现;
图片直链自带 API Key,无需 mediaserver_image_cookies。
同时把 mediavault 接入 mediaserver-operation Agent Skill 的 provider 清单。
|
2026-09-07 13:49:10 +08:00 |
|
yanjunpu
|
2361470af4
|
feat(download): classify existing source locations
|
2026-09-07 00:33:44 +08:00 |
|
jxxghp
|
a01a941c11
|
fix: 对齐音乐备选来源匹配并校验录音版本证据
|
2026-09-06 04:06:00 +08:00 |
|
jxxghp
|
976cecce8f
|
fix: 对齐音乐候选识别和缓存匹配规则
|
2026-09-06 02:21:03 +08:00 |
|
jxxghp
|
916619f2e2
|
fix: 对齐音乐识别词并补齐版本和专辑匹配证据
|
2026-09-06 01:28:47 +08:00 |
|
jxxghp
|
fba0b6ae67
|
refactor: 统一音乐与影视的识别搜索匹配流程
|
2026-09-06 00:48:00 +08:00 |
|
jxxghp
|
f00853de2a
|
feat(api): expose frontend-safe management capabilities
|
2026-09-05 15:11:02 +08:00 |
|
jxxghp
|
adae5bd878
|
fix(api): restore full plugin catalog by default
|
2026-09-04 10:47:02 +08:00 |
|
InfinityPacer
|
68880dbbf1
|
优化订阅执行治理与规模性能 (#6557)
* feat(subscription): govern concurrent search and match execution
* refactor(subscription): consume complete candidate snapshots
* refactor(subscription): remove download submission ledger
* feat(subscription): stagger fallback searches without site gaps
* refactor(subscription): remove unused retry capability
* test(subscription): verify complete scale execution
* fix(subscription): surface site search failures
* test(subscription): verify site pressure through search
* test(subscription): use static facade imports
* fix(subscription): preserve completed downloads on shutdown
* fix(subscription): classify execution expiry as failure
* fix(subscription): preserve fallback search staggering
* test(subscription): stabilize unfinished wrapper gate
* fix(subscription): settle expired search returns
* style(subscription): normalize governance imports
* fix(subscription): align governance type contracts
* docs(architecture): sync mypy debt metric
* docs(architecture): sync startup module counts
|
2026-09-03 11:26:24 +08:00 |
|
jxxghp
|
c20515971a
|
fix: restore multi-exception syntax
|
2026-09-02 20:22:57 +08:00 |
|
jxxghp
|
e57288b5ea
|
refactor(subscribe): satisfy global governance gates
|
2026-09-01 17:09:55 +08:00 |
|
jxxghp
|
2f7f2da300
|
fix(agent): preserve collection totals in truncated results
|
2026-09-01 10:49:22 +08:00 |
|
jxxghp
|
d512f528be
|
refactor(api): make collection pagination explicit
|
2026-09-01 09:13:56 +08:00 |
|
jxxghp
|
a73714e5e7
|
feat(agent): add compatible collection pagination
|
2026-09-01 07:43:55 +08:00 |
|
jxxghp
|
6d4d7331d1
|
refactor: complete agent skill API contracts
|
2026-09-01 01:19:45 +08:00 |
|
jxxghp
|
632363730a
|
feat(agent): expose self-describing service operations
|
2026-08-31 20:45:33 +08:00 |
|