jkooe
|
a515eb2e63
|
chore(release): v2.0.0
|
2026-10-10 12:14:02 +08:00 |
|
jkooe
|
5e08a2768b
|
chore(release): v1.6.0
|
2026-10-07 01:44:21 +08:00 |
|
jkooe
|
7037c7ff94
|
chore(release): v1.5.0
|
2026-10-07 01:00:25 +08:00 |
|
jkooe
|
3ff8e86fe8
|
chore(release): v1.4.3
|
2026-10-05 11:35:53 +08:00 |
|
jkooe
|
6c650244bf
|
chore(release): v1.4.2
|
2026-10-05 02:51:31 +08:00 |
|
jkooe
|
4106ada876
|
chore(release): v1.4.1
|
2026-10-05 02:46:37 +08:00 |
|
jkooe
|
50ac4b9646
|
chore(release): v1.4.0
|
2026-10-05 02:42:56 +08:00 |
|
jkooe
|
159ae2bf6f
|
chore(release): v1.3.0
|
2026-10-05 02:26:21 +08:00 |
|
jkooe
|
3cbac53308
|
chore(release): v1.2.1
|
2026-10-05 00:26:36 +08:00 |
|
jkooe
|
303cbc7436
|
chore(release): v1.2.0
|
2026-10-05 00:19:29 +08:00 |
|
jkooe
|
cd774ae0a6
|
feat(E3c): Hub 侧按控制端授权(多令牌 + 按设备白/黑名单 + 注册准入)
## 背景
Hub 原先只有**一个**令牌:任何持有者都能接入任意设备,无法区分「谁在控制哪台机器」。
E3 的权限隔离因此只做到能力级(被控端 ACL),Hub 侧仍是全通。
## 实现(apps/hub/src/authz.ts,纯函数便于单测)
- 多令牌:每个令牌 = 一个控制端身份,可独立指定 allow_nodes / deny_nodes(glob)
- 判定顺序 deny -> allow -> 默认拒绝;未配置 allow_nodes 时默认放行(兼容)
- 顶层 token 视为主令牌(放行全部),旧配置零改动
- 前缀式滚动令牌:value 以 * 结尾时按前缀匹配(轮换期间可灰度)
- 注册准入:node_allowlist 非空时只有匹配的 node_id 能注册,防止他人借令牌挂靠节点
- 列表按身份过滤:控制端只看得到自己被授权的设备
- 越权接入返回新错误码 E_NODE_FORBIDDEN
## 职责边界(重要)
Hub 只做「能否连到某设备」的接入过滤;连上之后的**能力级**授权仍由被控端 ACL
按 client_id 裁决。两层各自独立,Hub 不参与能力决策 —— 保持 Hub 不可信假设。
## 测试
- 单测 79 -> 89(新增 Hub 授权 10 例:主令牌兼容 / 未知令牌 / 前缀轮换 /
deny 优先 / glob 白名单 / 默认放行 / 注册准入 / 旧配置兼容 / 列表过滤 / glob 转义)
- e2e:Hub 用例新增受限令牌访问未授权设备 -> 断言 E_NODE_FORBIDDEN 且错误信息含授权原因
|
2026-09-29 14:38:53 +08:00 |
|
jkooe
|
66c44f6822
|
feat(E3): Hub 并发多控制端 + 设备分组(阶段 E 全部完成)
## E3a 并发多控制端(Hub 槽位池)
过去:一个被控端只有一条 Hub 连接 -> 同时只能一个控制端(否则 E_NODE_BUSY)。
现在:
- Hub 侧 agents 表改为「node_id -> 槽位池」,每个槽位服务一个控制端:
有空闲槽位直接配对;不足且未达上限则向被控端请求扩容(need_slot,3s 超时);
仍不满足才返回 E_NODE_BUSY。新增配置 max_slots_per_node(默认 3,设 1 即退回独占语义)
- 被控端侧 hub-mode 重写为槽位池:常备 2 条连接(warm_slots 可调),
并在某槽位被占用(收到 hello)时预热下一条直到 max_slots
—— 复用既有协议信号,不新增控制消息;每条槽位独立重连与退避
- Hub 列表视图聚合为「一节点一行」并带 slots / paired_slots
- e2e 新增并发用例:两个控制端同时握手 + 交替并发调用,均成功(旧版会失败)
## E3b 设备分组
- 客户端配置新增 groups(组名 -> 设备名数组;成员可写 @其它组名,最多展开 3 层防环)
- CLI:nodeagent group add|remove|list;fanout --nodes @组名 按组并发下发
- 真机验证:group add 本机 win -> fanout system.info --nodes @本机 正常
## E3c 权限隔离(部分完成)
- 能力级隔离沿用被控端 ACL(按 client_id,已含 allow/deny/glob/生效时段/IP 白黑名单/按能力限速)
- Hub 侧「按设备/按控制端授权」尚未实现(当前 Hub 视角为单一令牌),已记入路线图待办
## 测试
- 单测 73 -> 79(新增设备分组 6 例:展开 / 嵌套 / 去重 / 未知 / 兼容旧配置 / 环引用收敛)
- e2e 21/21(含扩展后的 Hub 并发双控制端用例)
|
2026-09-29 14:33:01 +08:00 |
|
jkooe
|
daa39e67f4
|
fix: 修复项目分析指出的 5 项问题
P0 · 真 bug:
1. MCP 无法走 Hub:ensureClient 漏传 hub 字段 → 补齐(与 CLI 对齐)
2. Hub 启动提示有误:打印 --hub 但 CLI 认 --hub-token/--hub-node → 更正文案
P1 · 功能完整性与安全缺口:
3. app.list 补商店/UWP 应用来源(Get-AppxPackage),不再漏装商店软件
4. psk 模式支持能力级 ACL(此前仅 ed25519 生效,持钥即全通)
—— 配置 ACL 的 psk 设备现在按调用方授权;未配置 ACL 的行为不变
5. MCP 设备选择:新增 na_nodes / na_use(会话级切换,不影响 CLI 默认)+ 补 na_fs_stat
6. 审计查询支持轮转文件(audit.log.1/2/...),历史记录不再丢失
验证:构建 + 类型检查全绿;E2E 21/21;
冒烟确认 psk-ACL 授权/拒绝正确、MCP 工具列表含全部 18 个工具
|
2026-09-27 16:38:37 +08:00 |
|
jkooe
|
3d03945448
|
feat(v6): Hub 中转 —— 跨网段 / 公网接入
新增 apps/hub(中转节点):
- 被控端主动外连注册(/hub/agent),控制端接入配对(/hub/client)
- 配对后双向字节透传 —— Hub 不解析内容、不持有设备密钥
- Hub 令牌鉴权;list 可查在线设备
- 连接语义:控制端断开仅解绑(被控端保持在线);被控端掉线连带关闭控制端
- 同一被控端同一时刻仅服务一个控制端(占用返回 E_NODE_BUSY)
被控端:
- 新增 hub 配置;启用后不监听本地端口,改为主动外连 Hub(穿 NAT)+ 指数退避重连
- 重构抽出 createAgentCore(),监听模式与 Hub 模式共用同一套鉴权/ACL/能力分发
控制端:
- NodeProfile 新增 hub 字段;toWsUrl 自动附 /hub/client 路径
- client 支持 Hub 配对(控制面消息与 RPC 分离)
修复(Hub 场景暴露):
- cmdConnect 漏传 hub 字段,导致跳过配对直接发 RPC
- Hub unpair 过激进:控制端断开时把被控端也踢下线
- 安全:被控端 hello 时重置认证态与授权(Hub 下同一连接被多控制端复用)
验证:本地 E2E 21/21;构建 + 类型检查全绿;冒烟确认 info/exec 穿透 Hub 且多次接入保持在线
|
2026-09-27 15:04:05 +08:00 |
|