feat: 插件管理 — 导入安装 + 统计面板

新增 API:
- GET /api/plugins/stats — 统计 (总计/已启用/已停用/安装失败)
- POST /api/plugins/import — ZIP上传 或 Git clone 安装
  - 自动 pip install -r requirements.txt (子进程隔离)
  - 自动加载插件 (isolated 模式, 崩溃不影响框架)
  - 安装失败记录到 _IMPORT_FAILS

前端:
- 横版统计卡片 (总数/启用/停用/失败)
- ZIP 上传按钮 + Git URL 输入
- 安装状态实时反馈

安全:
- 所有端点 panel_auth 保护
- 子进程安装 (pip/git), 超时120s
- 仅接受 .zip 文件
- 目录冲突检测

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
qinglong
2026-06-13 18:39:38 +08:00
parent a2bd6486a0
commit b2021a45ce
5 changed files with 418 additions and 38 deletions
+88
View File
@@ -350,5 +350,93 @@
"framework.command.execute"
],
"timestamp": 28375.089465424
},
"47fa9916": {
"plugin_name": "example_plugin",
"permissions": [
"plugin.example.read",
"plugin.example.write",
"plugin.example.execute",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 28527.781918439
},
"6b69ef4a": {
"plugin_name": "sentinel",
"permissions": [
"plugin.sentinel.read",
"plugin.sentinel.write",
"plugin.network.access",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 28527.793469637
},
"5521ab41": {
"plugin_name": "example_plugin",
"permissions": [
"plugin.example.read",
"plugin.example.write",
"plugin.example.execute",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 29038.232790171
},
"7da234f7": {
"plugin_name": "sentinel",
"permissions": [
"plugin.sentinel.read",
"plugin.sentinel.write",
"plugin.network.access",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 29038.243362099
},
"08edc191": {
"plugin_name": "example_plugin",
"permissions": [
"plugin.example.read",
"plugin.example.write",
"plugin.example.execute",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 29064.774713547
},
"afbc57ca": {
"plugin_name": "sentinel",
"permissions": [
"plugin.sentinel.read",
"plugin.sentinel.write",
"plugin.network.access",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 29064.880357453
},
"8b057650": {
"plugin_name": "example_plugin",
"permissions": [
"plugin.example.read",
"plugin.example.write",
"plugin.example.execute",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 29119.623393265
},
"46de40e2": {
"plugin_name": "sentinel",
"permissions": [
"plugin.sentinel.read",
"plugin.sentinel.write",
"plugin.network.access",
"framework.event.subscribe",
"framework.command.execute"
],
"timestamp": 29119.62760988
}
}
+1 -1
View File
@@ -101,7 +101,7 @@ commands:
permissions:
- framework.command.test
source: internal
last_updated: 28375.06993407
last_updated: 29119.596258526
plugin_commands:
example_plugin:
echo: *id001
+1 -1
View File
@@ -1,5 +1,5 @@
http_port: 4200
last_updated: 28375.086802768
last_updated: 29119.62443889
plugin_routes:
example_plugin:
- methods: