hotplex 核心架构设计文档
hotplex 是一个高性能的 AI 智能体运行时 (Agent Runtime),旨在将原本“单次运行”的 AI CLI 工具(如 Claude Code, OpenCode)转化为生产就绪的长生命周期交互服务。它的核心哲学是“利用胜于构建 (Leverage vs Build)”,通过维护持久化的、具备安全围栏的全双工进程池,彻底消灭 Headless 模式下的冷启动代价,实现毫秒级的指令响应。
1. 物理布局与清洁架构 (Physical Layout)
HotPlex 遵循分层架构与严格的可见性规则,将公开 SDK 与内部执行细节、协议适配器完全隔离。
1.1 目录结构(实测)
- 根目录 (
/):SDK 的主要入口。包含hotplex.go(公开别名) 以及client.go。 engine/:公开的执行运行器 (Engine)。编排 Prompt 执行、安全 WAF 审计及事件分发。provider/:不同 AI CLI 智能体的抽象层。包含Provider接口及claude-code、opencode的具体实现。types/:基础数据结构 (Config,StreamMessage,UsageStats)。event/:统一事件协议与回调定义 (Callback,EventWithMeta)。internal/engine/:核心执行引擎。管理SessionPool(进程复用) 与Session(I/O 管道与状态管理)。internal/security/:基于正则的指令级 WAF (Detector)。internal/sys/:跨平台进程组管理 (PGID) 与信号处理的底层实现。internal/server/:协议适配层。包含hotplex_ws.go(WebSocket) 与opencode_http.go(REST/SSE)。internal/strutil/:字符串处理工具。
1.2 设计原则
- 公开层薄,私有层厚:根包
hotplex仅提供最小且稳定的 API 表面。 - 策略模式 (Provider):将引擎与特定 AI 工具解耦。
provider.Provider允许在不改变执行逻辑的情况下切换后端。 - IO 驱动状态机:
internal/engine使用 IO 信号标记而非固定延时来管理进程状态(启动中、就绪、忙碌、死亡)。
2. 核心系统组件
2.1 引擎运行器 (engine/runner.go)
- Engine 单例:用户的主要接口 (
NewEngine,Execute)。 - 安全注入:动态将全局
EngineOptions(如AllowedTools)注入下游会话。 - 确定性会话 ID:使用 UUID v5 将业务对话 ID 映射为持久会话,确保高上下文缓存命中率。
2.2 适配层 (provider/)
将多样的 CLI 协议标准化为统一的 "HotPlex 事件流":
- Provider 接口:处理 CLI 参数构建、输入负载格式化与事件解析。
- 工厂与注册表:
ProviderFactory管理实例创建,ProviderRegistry缓存活跃实例以供复用。
2.3 会话管理器 (internal/engine/pool.go)
- 热连结 (Hot-Multiplexing):
SessionPool维护活跃进程表。对同一 SessionID 的重复请求将跳过“冷启动” (fork),直接进行“热执行” (stdin 注入)。 - 优雅 GC:使用
cleanupLoop根据IdleTimeout定期清理空闲进程。
2.4 安全与系统隔离 (internal/security/, internal/sys/)
- 正则 WAF:
Detector在指令落入底层进程前进行最后的违规扫描(如rm -rf /)。 - PGID 强隔离:确保智能体及其产生的任何子进程(如构建脚本)都被分配唯一的进程组 ID。终止时通过
SIGKILL整个进程组,彻底杜绝孤儿进程。
2.5 事件钩子与可观测性 (hooks/, telemetry/)
- Webhooks 与审计: 旁路异步向外部系统 (Slack, Webhooks) 广播负载事件,不阻断核心热执行链路。
- 追踪与指标: 推送原生 OpenTelemetry 分布式追踪,并暴露
/metrics接口供 Prometheus 采集。
3. 会话生命周期与数据流
mermaid
sequenceDiagram
participant Client as "客户端 (WebSocket/SDK)"
participant Server as "internal/server"
participant Engine as "engine.Engine"
participant Hooks as "事件钩子与遥测"
participant Pool as "internal/engine.SessionPool"
participant Provider as "provider.Provider"
participant Proc as "CLI 进程 (OS)"
Client->>Server: 发送请求 (WS 消息 / POST)
Server->>Engine: Execute(Config, Prompt)
Engine->>Engine: 安全审计 (Detector)
Engine->>Hooks: 启动 Trace Span
Engine->>Pool: 获取或创建会话 (ID)
alt 冷启动 (不在池中)
Pool->>Provider: 构建 CLI 参数/环境变量
Pool->>Proc: fork() 并分配 PGID
Pool->>Proc: 注入上下文/系统提示词
end
Engine->>Proc: 写入 stdin (JSON 负载)
loop 流式归一化
Proc-->>Provider: 原始工具特定输出
Provider-->>Engine: 归一化 ProviderEvent
Engine-->>Hooks: 触发事件 (Webhook/通知)
Engine-->>Server: 公开 EventWithMeta
Server-->>Client: WebSocket/SSE 事件
end
Engine->>Pool: Touch(ID) 更新心跳
Engine->>Hooks: 结束 Trace 并写入指标4. 功能矩阵
核心能力
- [x] 具备
internal/隔离的清洁架构 - [x] 基于策略模式的 Provider 机制 (Claude Code, OpenCode)
- [x] 弹性的会话热复用 (Hot-Multiplexing)
- [x] 跨平台 PGID 管理 (Windows Job Objects / Unix PGID)
- [x] 基于正则的安全 WAF
- [x] 双协议网关:原生 WebSocket 与 OpenCode 兼容的 REST/SSE API
- [x] 事件钩子 (Event Hooks):支持 Webhook 及多种自定义审计通知接收器
- [x] 可观测性:原生集成 OpenTelemetry 追踪与 Prometheus 性能指标 (
/metrics)
规划增强
- L2/L3 级隔离:集成 Linux Namespace (PID/Net) 与 WASM 沙箱
- 多智能体总线:在单一命名空间下编排多个专业化智能体