Skip to content

系统 review round 1 — 可靠性/安全/Runtime/测试·CI·文档 findings #261

Description

@s2agi

对 anet 全系统做了一轮 4 维并行 review(架构可靠性 / 安全 / Runtime 支持 / 测试·CI·文档)。下面按优先级合并后的 findings。

注意:feishu/IM 实现代码在 feat/feishu-docker-compose / feat/179-feishu-agent-sdk-channel 分支(生产部署用的那套),不在当前 main;相关行号以那分支为准。

🔴 P0

1. Feishu worker 死了不重启(生产已复现)

agent-node/src/cli.ts:2750 connectFeishuchild.on("exit")warn(),不重 fork。worker 只在启动时 fork 一次(cli.ts:3053),SIGTERM/crash 后桥接静默挂掉永不恢复

  • 配套:shutdown()cli.ts:3049)不 kill 子进程 → 重启后两个 WS 连接 → 重复推送/双回复。
  • docker/feishu/docker-compose.yml 无 healthcheck + agent-node 是 PID1 → worker 死了容器仍显示 Up(绿),编排层误报健康,故障因此"静默"。
  • :exit handler 改成带退避(1→30s)+shutdown-aware 的 supervised 重 fork(抄同文件 connectSSE 的重连循环);shutdown 时 kill 子进程;compose 加 healthcheck 断言 bridge liveness。

2. Hub 默认管理员凭证(公网暴露时 P0)

anet hub start 自动 bootstrap 众所周知的默认 admin 凭证(bin/cli.ts:3066),弱密码路径允许 ≥4 字符(server/src/auth.ts:43)。默认 HOST=127.0.0.1 缓解,但项目明确把 hub 反代到公网(<hub-domain>)。一旦可达,一次 login 即拿 admin token → 全控(读所有 network / 重置任意密码 / 列用户);登录锁不管用——已知默认只需一次。

  • :随机生成 bootstrap 密码 + 首次登录强制改密;或存在默认密码 admin 时拒绝绑定非 loopback。

🟠 P1

  • claude-agent-sdk 不识别 429/配额cli.ts:1252-1331):isAuthError 只配 401/403,不含 429/rate_limit/quota。上游限流时 SDK 静默退避,唯一兜底是 300s×retry 墙钟 → agent 静默最多 ~15min 才回通用超时;更糟:空 result + subtype=success 被当 "任务完成" 假成功(cli.ts:1292)。正是 M3 配额那次现象。修:加 429/quota 分类 + 空 result 当软失败。
  • codex-sdk(新节点默认 runtime)无 turn 超时cli.ts:1375-1483):runStreamed for-await 无墙钟守卫,上游 hang → turn 永挂、agent 永久沉默;stdio 路径同样。修:套 claude 那套 AbortController/timeout。
  • Telegram channel fail-opencli.ts:2238):空 allowFrom = 放行所有人,消息原文直进 think(),节点默认带 dangerouslySkipPermissions+Bash → 等效 RCE/注入。配置 churn 清空 allowFrom 会静默把锁死 channel 翻成全开。修:空 allowFrom fail-closed(除非显式 ["*"])+ 无 allowlist 大声告警。
  • 密码哈希无 saltserver/src/db.ts:686):sha256("anet:"+pw) 静态前缀无 salt 无 KDF;DB 泄露则离线爆破 trivial。修:迁 bcrypt/scrypt/argon2(Bun.password)。
  • 无发布 CI gate:只有 e2e-docker.yml+qa.yml,无 release workflow → Docker tarball smoke / PINNED 版本审计 / 向导 real-TTY 测全靠手工——正是历次 release-gate 漏的那类。修:加 release.yml gate。
  • IM bridge 主线零测试channel/commhub-channel.ts(494 行 SSE 桥)无测试;feishu bridge 唯一测试在未合并的 feat/179。修:加契约测试 + feishu 测试随 179 合入。
  • 飞书文档:能用的指南被困在未合并分支:正确完整的 feishu-quickstart.md(权限/事件订阅 WebSocket 模式/订阅 im.message.receive_v1/发布版本)只在 origin/docs/179-...;而线上 channels.md 还写飞书"暂未排期/未构建"。这是用户卡几小时的根因之一——能救命的文档存在但看不到。修:179 合并时移进 docs-site/guide/feishu.md(ZH+EN)+侧边栏,删 channels.md 的"未构建"。
  • WSClient 无应用层 livenessim/feishu/adapter.ts:131):start() 一次性置 connected=true,lark 内部重连耗尽后仍 true、dead socket 看着健康;stop() 关不掉 socket(只能杀进程)。修:watchdog 消费 health(),stale 就退出 worker 让 P0 supervisor 重 fork。

🟡 P2(精简)

  • config.json token 无 0o600 写(bin/cli.ts:268,494)。
  • /api/license/activate 无鉴权 + DELETE+insert(index.ts:577)。
  • CI 只跑 3 个 server 测试(scripts/qa.sh),其余 server + 全部 agent-node 测试不进 CI。
  • e2e-docker.yml 的 PR paths 漏 channel/** + .github/workflows/**
  • claude runtime 无 per-vendor vision 能力门(deepseek 无 vision 时静默喂图)。
  • 无 mid-turn 心跳,hang 和长任务在 Dashboard 无法区分。
  • 飞书 TTL 后晚到回复静默丢失(bridge.ts:189)。

下一步

团队整理派工:P0 两条最先(worker supervisor + 默认凭证),P1 按 runtime→安全→CI→docs。round 2 可深挖 dashboard / commhub-server 内部 + grok runtime。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions