外观
Nexo IM — MVP 需求文档
范围:仅覆盖第一个 MVP(单聊跑通),远期愿景与后续分期不在本文档展开
1. 背景与目标
Nexo 是 lamolabs 团队自用(dogfooding)的 AI 原生工作 IM。远期愿景一句话:聊天中产生点子 → 唤起 AI 澄清成结构化需求 → 建临时群协作 → agent 服务实现 → 验收后自动解散群组,形成工作流闭环。
本 MVP 的唯一目标:把 IM 地基跑通——团队 5 人能用它完成日常单聊(收发消息、换人聊天)。一切 AI 能力从 MVP2 开始,不属于本期。
2. 用户与使用场景
- 用户:lamolabs 团队成员,共 5 人,预置账号,不开放注册
- 场景:工作日常沟通;PC 客户端(nexo-im-pc)常驻使用
- 服务端:nexo-im-api(Hono + PostgreSQL + WebSocket,工程骨架已就绪)
3. 功能需求
P0(缺一不可)
FR-1 账号与登录
- 预置 5 个团队账号(用户名 + 密码),登录成功后获得会话凭证
- 登录失败给出明确提示;不做开放注册、找回密码(密码由管理员重置)
- 同一账号可在多台设备同时登录,新登录不挤掉已在线的设备
FR-2 登录设备管理
- 「登录设备」列表展示本账号当前全部已登录设备:设备名称与类型、登录时间、最近活跃时间;当前设备标注「本机」
- 可对列表中任一设备执行「退出登录」:该设备凭证立即失效(≤ 5s 生效),其界面自动断开并回到登录页,提示「你的账号已在其他设备上退出登录」;退出「本机」等同于当前设备登出
- 同账号多端消息一致:新消息实时下发到该账号所有在线设备;历史消息以服务端为准,各端读到的内容与顺序一致
- 设备连续 30 天未活跃,其凭证自动失效并从列表移除
FR-3 会话列表与换人聊天
- 展示团队成员列表,点击任一成员即可发起/进入单聊
- 已有会话按最近一条消息时间倒序排列
- 点击切换会话,聊天窗口正确切换上下文
FR-4 文本消息收发
- 会话内发送文本消息;对方在线时通过 WebSocket 实时收到
- 对方离线时消息落库,其重新上线后能完整拉到错过的消息
- 消息发送有成功/失败反馈,失败可重发
FR-5 历史消息
- 进入会话拉取最近一页消息,向上滚动分页加载更早消息
- 同一会话内消息顺序稳定(刷新、重连后顺序不变)
P1(重要,资源不足可顺延)
FR-6 未读数:会话列表展示各会话未读条数,进入会话后清零(各端独立计算,不做多端同步) FR-7 在线状态:成员列表/会话中显示对方在线、离线状态(任一设备在线即视为在线)
4. 明确不做(Out of Scope)
- 群聊(后续与"临时群组"一并设计)
- 图片、文件、语音、视频消息
- 消息撤回、编辑、引用回复、表情回应、@提及
- 消息搜索
- 移动端 App、离线推送(本期多端在线只覆盖 PC 客户端)
- 多端已读状态同步(未读数各端独立计算)、扫码登录与新设备登录确认
- 全部 AI 能力(需求澄清、建群、agent 实现等,自 MVP2 起分期引入)
- 端到端加密(团队内部自用,暂不需要)
5. 非功能需求
- 消息持久化于 PostgreSQL,服务重启不丢失已确认送达的消息
- 正常网络下消息端到端延迟 ≤ 1s
- 规模按 5 人设计,不设高并发指标;服务端单实例部署即可
- 客户端断线后自动重连,重连后自动补齐断线期间的消息
6. 验收标准(端到端场景)
- [ ] A 用预置账号登录成功;错误密码被明确拒绝
- [ ] A 在成员列表点击 B 发起会话,发送消息,B 端 1s 内实时收到
- [ ] B 回复后 A 实时收到,双方看到的消息顺序完全一致
- [ ] A 切到 C 聊天再切回 B,两个会话上下文互不串扰(换人聊天)
- [ ] B 离线期间 A 持续发消息,B 重新登录后完整收到
- [ ] 客户端刷新/重启后历史消息完整、顺序不变,向上翻页可加载更早消息
- [ ] 同账号在第二台设备登录后两端都能正常收发,新消息两端都收得到
- [ ] 「登录设备」列出这 2 台设备(本机有标记);退出其中一台后该端 5s 内回到登录页并给出提示,另一台不受影响
- [ ] (P1)未读数正确累计与清零;(P1)在线状态正确变化
7. 约束与说明
- 本文档只定义"做什么";消息协议、表结构、seq 设计等属技术方案,另行评审
- 需求文档中"用户"一律指 lamolabs 团队 5 名成员
- MVP 验收人:团队全员试用一周,日常沟通可完全替代现用工具即视为达成目标