jxxghp
83243d2418
fix: 限制插件生命周期准入并保留慢钩子所有权 ( #7268 )
2026-11-01 22:22:04 +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
DDSRem
2de976f6b3
Merge pull request #7050 from DDSRem-Dev/codex-comment-migration
...
docs: 统一全项目中文注释和结构化契约说明
2026-10-17 19:26:29 +08:00
jxxghp
ca15f05038
refactor(types): govern plugin lifecycle configuration
2026-10-16 15:15:17 +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
jxxghp
d7db4cfc0b
fix(plugin): serialize package swaps with imports ( #6939 )
2026-10-10 07:42:37 +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
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
Aqr-K
9955698b1a
fix(plugin): 加载入口补生命周期锁,手工重载带上分身 ( #6679 )
2026-09-14 07:01: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
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
71147c1d96
feat(classification): support multi-source media rules
2026-09-03 11:51:18 +08:00
Aqr-K
d7c5955031
fix(plugin): 插件自有数据库释放与销毁全程容错,并修正建表去重与 schema 命名
...
release/destroy 统一经 _close_handle 先清线程局部会话再 dispose,两步失败都
只记日志:单个插件的连接池故障不再让 close_database 跳过宿主同步与异步引擎的
释放,release_all_databases 也逐插件隔离。按模型建表对 __table__ 去重,单表
继承的父子类一并声明时不再对同一张表建两次。
卸载编排先删插件数据、后停插件,停机钩子里的 get_database() 会把刚销毁的库
重新建出来:注册表记下已销毁的插件标识,其后的 release 改为再次销毁并清除
标记,ensure 则撤销标记,宿主编排代码不动。PostgreSQL schema 名在归一改写过
标识或超长时追加插件标识哈希并截到 63 字节,My-Plugin、My_Plugin 与
my_plugin 不再折叠到同一个 schema 而在卸载时互相 DROP。
start 的失败分支释放已经建立、却进不了运行态的句柄,整体停止把只登记在
_classes 里的插件一并释放。声明的迁移目录不存在时在建句柄之前抛
FileNotFoundError,不再留下空库;SQLite 迁移 URL 改由引擎渲染;
_get_sqlite_engine 的连接参数下沉到实际使用它的异步分支。
2026-09-02 02:14:19 -04:00
Aqr-K
f4c5549a37
feat(plugin): 接线插件自有数据库生命周期
...
新增 app/runtime/extensions/plugin/database.py 运行时端口(零 app.db 依赖),
PluginLifecycle.start 在 init_plugin 之后建库、_finalize 只释放不销毁;
PluginConfigStore.delete_data 在删除宿主业务数据后销毁插件自有库;
组合根 app/startup/initializers/plugins.py 把端口装配到 db 层实现。
覆盖 start→ensure / stop·reload·remove→release / delete_data→destroy
三条接线与失败策略。
2026-09-02 02:14:19 -04:00
InfinityPacer
7c81fb357f
fix(plugin): 收敛市场安装与运行态错误处理 ( #6470 )
2026-08-26 18:00:49 +08:00
jxxghp
7f09927c47
refactor: own shutdown lifecycle boundaries
2026-08-23 20:20:26 +08:00
jxxghp
1a71e4809f
feat: wire host database and extension metrics
2026-08-22 13:22:33 +08:00
InfinityPacer
b9bbc8913c
fix: 完善插件恢复与运行态收敛 ( #6376 )
2026-08-21 18:09:29 +08:00
jxxghp
8472bcff43
refactor: 收口 V3 分层架构与插件兼容边界
2026-08-18 13:22:02 +08:00