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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions