Repository navigation
ClawProxyHub v1.2.0
ClawProxyHub v1.2.0
Lua 插件运行时版。新增脚本插件宿主 LuaHost(社区零 Go、零编译写 Lua 插件),并强化网关鉴权/恢复/超时体系、统一 SDK 传输层、插件 KV store 隔离持久化。
概览
- LuaHost 运行时:Lua 插件宿主(
hosts/luahost,独立 module),沙箱化 gopher-lua VM;社区作者只写main.lua - 分发与加载:pack 识别
runtime=lua;核心-tags luahost_embed内置注入;P1 共享单份 + P0 启动刷新 + 手动上传替换 - 系统设置「插件」板块:Lua 启用 / 隔离 / 更新三配置;插件卡片 Go/Lua 运行时徽章
- 插件 KV store:按插件名隔离 + 持久化到 DB(迁移 000014)
- 网关强化:O(1) 鉴权、凭据恢复链、首帧/首字双超时、超窗自动截断
- SDK 统一传输层:HTTP/SSE 出站统一 + 日志铺底
明细
LuaHost 运行时(hosts/luahost)
- 通用 go-plugin 宿主:把 ClawPlugin 契约翻成 Lua 调用——proto ↔ table 双向映射(snake_case 对齐)、
stream对象 typed 方法(message_start/content_delta/reasoning_delta/tool_call_delta/message_finish/failed) - 宿主能力
cph.*:http(request 回{body,status,headers},请求未完成 raise;stream 支持format="openai"宿主解析 SSE 驱动 stream 对象)、json/hash(md5/sha256/hmac_sha256/base64url)/time(now/sleep)/random(uuid/hex)/log(落核心 runlog)/openai.chat_body(信封→OpenAI body) - 约定函数(
return M,函数挂为字段):handshake(声明 capabilities/auth_methods,与 Go 插件 Handshake 同构;缺失回退 manifest.json)/chat(req, stream)/models/login/refresh/profile - 沙箱:白名单标准库(base/table/string/math)+ 剔除
dofile/load/print/collectgarbage;沙箱化require("lib.*")(仅插件目录、禁路径逃逸、模块缓存);一切出站只经cph.* - VM 复用池;所有 RPC 顶层
recover()(Go 侧 panic 转错误不崩进程,stderr 打[luahost] panic in X()) - 独立 module:依赖
sdk+ 纯 Gogopher-lua(交叉编译零痛)
分发与加载(P1 + P0)
- pack:双目录扫描(
plugins/+plugins-lua/);plugins-lua/即盖runtime="lua"+entry,protocol_version由 SDK 盖——作者 manifest 只写 name/version/author/label/icon;lua 产平台无关 zip(跳过 go build);市场 index.json 带runtime - 加载(方案 A):核心按
manifest.runtime=="lua"分流,启动共享 LuaHost(data/hosts/luahost-<os>-<arch>+--dir <插件目录>),manager 全程零改动(照标准 go-plugin 处理) - P1 共享单份:一份 LuaHost 服务所有 lua 插件(磁盘一份、每插件一进程=隔离不丢);
pack -install旧式逐插件拷贝仍兼容(回退) - P0 升级刷新:
ensureLuahost按 sha256 比对,核心升级带来新内置 LuaHost 时开机自动刷新共享文件;.manual标记(手动上传)跳过自动刷新 - go:embed:
-tags luahost_embed把internal/plugin/luahost.bin编进核心(默认 stub,装 lua 插件被拒并提示);Dockerfile 已带两步构建 - Start 取名:由插件目录取插件名(共享后 binPath 落 data/hosts,不能从二进制路径推名)——与 store 隔离命名空间对齐
系统设置「插件」板块(web + internal/admin)
- Lua 启用
plugin.lua_enabled(默认开):关闭则安装网关拒装 lua 插件(installZip单点读包内 manifest.runtime,市场/上传两路径覆盖) - Lua 隔离
plugin.lua_isolation:本版锁定为开(UI disabled + 服务端强制 true;共享运行态后续版本) - Lua 更新:手动更新(上传 LuaHost 二进制 → 停 lua 插件 → 覆盖共享运行时 → 打
.manual→ 拉起)/ 检查更新(占位禁用) - Go/Lua 运行时徽章:市场卡 + 已装卡(
MarketEntry/pluginView加runtime,取自落盘 manifest——决策 A:不动 proto、protocol_version 保持 2)
插件 KV store(internal/plugin)
- 按插件名隔离:
HostService加plugin字段 +forPlugin(name)派生(manager 从插件目录取名注入) - 持久化:迁移 000014
plugin_stores(PK plugin+key);StoreGet(Find 避免命中不到日志噪声)/StorePut(UPSERT);卸载级联清理;重启不丢
网关强化(internal/gateway)
- O(1) 鉴权:
keys.key_lookup确定性查找列(sha256(raw)),命中免全表解密 - 凭据恢复链:401 → 刷新同账号后重试;线性重试(
gateway.max_retries上限) - 首帧/首字双超时:
first_event_timeout(等首事件,探测上游/代理挂死)+first_token_timeout(首事件→首个内容 token,容纳推理),路由级可覆盖全局(迁移 000013 拆分旧timeout_seconds) - 输入超窗自动截断:
gateway.context_truncate_*(开关/阈值/估算系数)
SDK 统一传输层(sdk)
sdk/http.go出站 request/stream 统一:敏感头打码(api-key/authorization/cookie…,保留前后 4 字符)、debug 级全量入库、Host.LogFields结构化字段
其他
- 内部计划文档移出仓库(
docs/入.gitignore,不入库)
升级说明
- 新增 migration 000014(
plugin_stores):启动自动执行,无手工步骤 - 带 Lua 支持的核心需两步构建:先
go build -C hosts/luahost -o internal/plugin/luahost.bin .,再go build -tags luahost_embed ./cmd/cph(Dockerfile 已含);不带 tag 的核心为 stub——lua 插件仍能跑(共享文件在data/hosts/时),但从市场装新 lua 插件会被拒 - 插件仓(submodule):autoclaw(lua)与 pack 改动在插件仓,需单独提交/发布后回核心 bump 指针
- 如需引用本版本核心,把插件
go.mod依赖升到github.com/ShadowSmallBaby/ClawProxyHub v1.2.0