Files
Fabric/PLAN.md

6.2 KiB
Raw Blame History

Fabric 项目规划 v0.1

1. 项目目标

Fabric:一个可自部署的类 Discord 聊天系统,核心目标是提供稳定、低摩擦的沟通渠道。

MVP 成功标准

  • 支持多人频道聊天 + 私聊
  • 支持基础权限与审计日志
  • 提供 Docker Compose 一键部署
  • 单机可稳定服务 50~200 并发在线MVP 目标)

2. 项目定位(一句话)

一个可自部署、类 Discord 的实时聊天系统;本体保持平台中立,通过插件生态对接外部系统。

3. MVP 必要功能

  1. 账号与组织
    • 用户注册/登录(由中心服务负责)
    • Guild 归属到某个中心服务(非全局单体)
  2. 聊天模型(明确范围)
    • Guild工作区
    • Channel公开/私有频道)
    • DM1v1 私聊)
    • 消息回复、编辑、删除、@提及
    • 附件、表情、引用
    • 不做 Thread明确排除
    • 不做已读回执(明确排除)
  3. 实时通信
    • WebSocket 实时消息推送
    • 在线状态、输入中、消息同步
    • 客户端检测到消息序号断片时,通过 API 按 range 回补
  4. 插件友好设计(本体中立)
    • 本体不内置 OpenClaw 专属逻辑
    • 提供稳定事件模型(消息创建/编辑/删除、成员事件、权限变更)
    • 提供清晰 API 边界(鉴权、幂等、分页、速率限制、错误码)
    • 为外部插件保留扩展点Webhook、Bot Token、Outbound 回调)
  5. 权限与审计
    • 当前策略:所有用户无权限差别,均可增删改查 guild/channel/dm/聊天记录
    • 审计日志保留时间/大小由每个 guild 自行配置

4. 建议技术栈v0.1

  • APINestJSREST + WS
  • RealtimeWebSocket Gateway
  • DBPostgreSQL
  • Cache/QueueRedis会话态 + 异步任务)
  • StorageMinIO附件
  • DeployDocker Composeapp + pg + redis + minio

4.1 部署与边界模型(新增决策)

  • 采用“两套后端”模型:
    • 中心服务Identity Hub:管理用户身份与登录态
    • Guild 服务Guild Node:管理 Guild/Channel/DM/消息数据
  • 一个中心服务可挂载多个 Guild 服务
  • 不同中心服务彼此完全独立A 的用户无法登录 B
  • 一个 Guild 服务只能注册到一个中心服务
  • Guild 服务注册时需证明持有中心服务 secret共享密钥握手

5. 模块拆分(对应仓库)

  • Fabric.Backend
    • Auth/WorkspaceGuild
    • Chat CoreChannel、DM、消息不含 Thread
    • Integration SurfaceWebhook、Bot Token、扩展回调
    • Permission & Audit
  • Fabric.Frontend
    • 工作区/频道 UI
    • 消息流、输入框、回复/编辑/删除/@
    • 平台中立 UI不内置 OpenClaw 专属交互)
  • Fabric.OpenclawPlugin
    • OpenClaw 侧适配与路由配置
    • 会话映射、回执状态、错误处理
    • 工具调用卡片与审批流approve/reject
    • Webhook + Gateway 双模式MVP 先做 Webhook
  • Fabric.Desktop
    • Desktop 客户端壳(后续)
  • Fabric.Android
    • Android 客户端壳(后续)

6. 里程碑6 周参考)

OpenClaw 集成能力仅在 Fabric.OpenclawPlugin 实现Fabric 本体不承担 OpenClaw 专属逻辑。

Week 1需求冻结 + 架构设计

  • PRD 冻结
  • 架构图、数据模型、接口草案

Week 2基础业务 API

  • 登录注册、工作区、频道、消息 REST API
  • 基础前端页面(频道列表 + 消息流)

Week 3实时通信

  • WebSocket 推送
  • 在线状态、输入中、消息同步

Week 4插件集成Fabric.OpenclawPlugin

  • Agent 绑定配置
  • 消息路由与回写
  • 工具状态卡片running/success/error
  • approve/reject 审批流

Week 5权限与运维

  • 角色权限admin/member
  • 审计日志
  • 健康检查、日志聚合、Compose 完善

Week 6稳定性与发布

  • 压测与性能调优
  • Bug 修复
  • MVP 发布文档与部署指南

7. 仓库组织

  • Fabric(主仓库)
    • 挂载子模块:
      • Fabric.OpenclawPlugin
      • Fabric.Backend
      • Fabric.Frontend
      • Fabric.Desktop
      • Fabric.Android

7.1 消息编号与顺序语义(已定)

  • 每个 Guild 服务为其管理的每个 Channel/DM 独立分配递增消息序号 seq(从 1 开始)
  • 消息主键使用 message_idUUID/ULID 均可),排序与断片检测以 seq 为准
  • 服务端返回消息默认按 seq ASC
  • 客户端允许短暂乱序显示,但收到 seq 断片时必须触发 range 回补
  • 回补接口:GET /channels/:id/messages?seq_from=<a>&seq_to=<b>DM 同理)
  • 一致性目标:同一 Channel/DM 的最终可见顺序与服务端 seq 一致

7.2 插件扩展契约 v1已定

本契约为平台中立能力,Fabric.OpenclawPlugin 只是其中一个实现方。

A) 出站事件Fabric -> Plugin

  • 采用 Webhook POSTMVP
  • 事件信封固定字段:
    • event_id(全局唯一)
    • event_type(如 message.created / message.updated / message.deleted
    • occurred_atISO 时间)
    • guild_id / channel_id / actor_id
    • data(事件载荷)
  • 鉴权:X-Fabric-SignatureHMAC-SHA256密钥为每个插件独立 secret
  • 幂等:消费端以 event_id 去重

B) 入站调用Plugin -> Fabric

  • 使用 Bot TokenBearer访问 Fabric API
  • 写接口支持 Idempotency-Key,重复提交返回同一结果
  • 标准错误码:
    • 400 参数错误
    • 401/403 鉴权或权限失败
    • 404 资源不存在
    • 409 冲突(如 seq 窗口不匹配)
    • 429 限流
    • 5xx 服务端错误

C) 重试与限流

  • Webhook 非 2xx 视为失败指数退避重试1s / 2s / 4s / 8s / 16s最多 5 次)
  • API 限流采用令牌桶,返回 429 + Retry-After

8. 当前状态

  • 所有仓库已创建为 Public
  • Fabric.* 已作为子模块挂载到 Fabric
  • 本体保持平台中立:不包含 OpenClaw 专属业务逻辑
  • OpenClaw 相关能力集中在 Fabric.OpenclawPlugin
  • 已确定Guild 可分布在不同服务器;中心服务/ Guild 服务双层架构
  • 已确定:消息顺序一致性细则、插件扩展契约 v1
  • 本文件为第一版规划,后续按里程碑持续细化