重构:核心迁移至 oss/core + NBPF 多重签名加密 + NIR 编译器 + README 全面升级

- 核心功能从 store/ 迁移至 oss/core/ 框架层
- 实现 NBPF 包格式:多重签名(Ed25519+RSA-PSS+HMAC)+ 多重加密(AES-256-GCM)
- 实现 NIR 编译器:基于 compile()+marshal 的跨平台中间表示
- 新增 nebula nbpf CLI 命令组(pack/unpack/verify/sign/keygen)
- 新增 19 个 NBPF 测试用例,覆盖全链路
- 彻底重写 README,大型项目标准框架风格,所有图表使用 SVG
- 更新 LICENSE 版权声明
- 清理旧版 store 插件目录(已迁移至 oss/core)
This commit is contained in:
Falck
2026-05-05 07:29:43 +08:00
parent 4441a968db
commit 3a096f59a9
184 changed files with 5715 additions and 10066 deletions

View File

@@ -1,22 +0,0 @@
"""插件基础类"""
from abc import ABC, abstractmethod
from typing import Any, Optional
class Plugin(ABC):
"""插件基类"""
@abstractmethod
def init(self, deps: Optional[dict] = None):
"""初始化插件"""
pass
@abstractmethod
def start(self):
"""启动插件"""
pass
@abstractmethod
def stop(self):
"""停止插件"""
pass

View File

@@ -1,3 +1,7 @@
import ast
# 启发式能力扫描:通过 AST 分析插件源码,基于命名约定和导入推断插件提供的能力
# 这是一种轻量级的静态分析,不执行任何代码,仅用于快速发现插件可能提供的能力
def scan_capabilities(plugin_dir):
capabilities: set[str] = set()
main_file = plugin_dir / "main.py"

View File

@@ -1,7 +1,7 @@
"""插件管理器 - 只加载 plugin-loader其他所有插件由 plugin-loader 插件自行管理"""
"""插件管理器 - 直接使用框架层的 Core Engine"""
from typing import Any, Optional
from oss.plugin.loader import PluginLoader
from oss.core.engine import PluginManager as CorePluginManager
# 深度隐藏的成就系统导入
try:
@@ -13,32 +13,20 @@ except ImportError:
class PluginManager:
"""极简插件管理器
遵循「最小化核心框架」设计哲学:
- 核心框架只负责加载 plugin-loader 插件
- 所有其他插件HTTP、WebSocket、Dashboard 等)都由 plugin-loader 插件扫描和加载
- store/NebulaShell/ 是唯一的插件来源
直接使用框架层的 CorePluginManager原 Core 插件功能)
- 不再通过插件加载器加载 Core
- 所有核心功能直接集成在 oss.core.engine 中
"""
def __init__(self):
self.loader = PluginLoader()
self.plugin_loader: Optional[Any] = None
self.core = CorePluginManager()
def load(self):
"""加载 plugin-loader 核心插件
plugin-loader 插件会负责:
1. 扫描 store/NebulaShell/ 目录
2. 加载所有启用的插件
3. 处理依赖关系
4. 执行 PL 注入机制
"""
# 只加载 plugin-loader其他所有插件都由它来管理
pl_info = self.loader.load_core_plugin("plugin-loader")
if pl_info:
self.plugin_loader = pl_info["instance"]
# 隐藏成就:深海潜水员 - 当加载插件管理器时解锁
"""加载所有插件(由 CorePluginManager 管理)"""
self.core.load_all()
# 隐藏成就:深海潜水员
if _ACHIEVEMENTS_ENABLED:
try:
validator = get_validator()
@@ -47,48 +35,48 @@ class PluginManager:
pass
def start(self):
"""启动 plugin-loader,它会初始化并启动所有其他插件"""
"""启动 Core,它会初始化并启动所有其他插件"""
import time
start_time = time.time()
if self.plugin_loader:
# plugin-loader.init() 会扫描并加载 store/ 中的所有插件
self.plugin_loader.init()
# plugin-loader.start() 会按依赖顺序启动所有插件
self.plugin_loader.start()
self.core.init_and_start_all()
# 启动 HTTP 服务
self.core.start_http_server()
# 启动防篡改监控
self.core.start_tamper_monitor()
# 计算启动时间并检查速度成就
elapsed_ms = (time.time() - start_time) * 1000
if _ACHIEVEMENTS_ENABLED:
try:
validator = get_validator()
validator.check_startup_speed(elapsed_ms)
# 检查插件数量成就
if hasattr(self.plugin_loader, 'manager') and hasattr(self.plugin_loader.manager, 'plugins'):
plugin_count = len(self.plugin_loader.manager.plugins)
validator.check_plugin_count(plugin_count)
plugin_count = len(self.core.plugins)
validator.check_plugin_count(plugin_count)
except Exception:
pass
def stop(self):
"""停止所有插件(由 plugin-loader 统一管理)"""
if self.plugin_loader:
"""停止所有插件"""
try:
self.core.stop_tamper_monitor()
self.core.stop_http_server()
self.core.stop_all()
except KeyboardInterrupt:
print("[PluginManager] 用户中断停止过程")
except Exception as e:
import traceback
print(f"[PluginManager] 停止插件时出错:{type(e).__name__}: {e}")
traceback.print_exc()
# 隐藏成就:崩溃幸存者
if _ACHIEVEMENTS_ENABLED:
try:
self.plugin_loader.stop()
except KeyboardInterrupt:
print("[PluginManager] 用户中断停止过程")
except Exception as e:
import traceback
print(f"[PluginManager] 停止插件时出错:{type(e).__name__}: {e}")
traceback.print_exc()
# 隐藏成就:崩溃幸存者 - 如果正常停止则不解锁,只有异常停止才可能解锁
# 这里我们记录停止事件,用于将来可能的连续运行成就
if _ACHIEVEMENTS_ENABLED:
try:
validator = get_validator()
# 记录会话结束
validator.track_progress("session_end")
except Exception:
pass
validator = get_validator()
validator.track_progress("session_end")
except Exception:
pass