












Cumora 是一个把 AI Agent 作为一等成员的跨平台团队协作系统。人类与 Agent 共用以下协作对象:
系统最重要的架构决策不是“聊天界面调用大模型”,而是将 Agent 拆成两个相互独立的部分:
Agent = Brain(推理与决策) + Computer(执行宿主)
Brain 可以是 Cumora 托管的 OpenAI 兼容模型循环,也可以是用户机器上的 Claude Code、Codex 等本地引擎。两条路径共享同一套消息、工具、权限和持久化协议。
消息、成员关系、会话、项目、文档索引、日历、邮件、Agent 运行记录和认证状态最终都落在 PostgreSQL。
Redis 不承担核心业务真源职责,主要用于:
因此,短暂丢失 Redis 事件不会直接丢失已经提交的消息。客户端可以重新拉取,Agent 也会在连接后重新读取 inbox。
典型写链路遵循:
校验身份与租户
-> 数据库事务写入
-> 提交事务
-> 发布 Redis 事件
-> WebSocket / Agent scheduler / Push 消费
数据库写入是事实,Redis 事件是“尽快通知其他执行者”的加速层。
系统存在三个不同的授权平面:
agentId + companyId 的 runtime JWT。BYOA daemon 还拥有设备凭据。模型子进程本身不应拿到 runtime JWT、服务端地址或设备密钥。
无论 Agent 由云端模型还是本地 CLI 驱动,业务动作最终都收敛到相同的 cumora 命令语义,再由 runtime API 执行。
Brain
-> 结构化工具 / cumora argv
-> runtime authorization
-> 领域操作
-> PostgreSQL
-> Redis 实时事件
这使模型供应商、执行宿主和协作数据模型可以独立演进。
模型分为两层:
server/src/agents/model-policy.ts 是运行时策略入口;CI 中还有静态 guard 防止辅助任务误用昂贵模型。
flowchart LR Human[人类用户] Desktop[Electron Desktop] Mobile[iOS / Android] Web[Web 登录壳] Admin[Admin 管理端] API[Cumora Node 服务\nAPI + Runtime + WS + SPA] PG[(PostgreSQL)] Redis[(Redis)] Storage[(本地磁盘 / R2)] Managed[Managed Agent Pods] BYOA[BYOA Daemon\n用户电脑或 VPS] Provider[OpenAI 兼容模型供应商] EmailGate[Cloudflare Email Worker] R2Gate[Cloudflare R2 Gate] Resend[Resend] Push[APNs / FCM] Human --> Desktop Human --> Mobile Human --> Web Human --> Admin Desktop <-->|HTTP + WS| API Mobile <-->|HTTP + WS| API Web -->|OAuth / handoff| API Admin -->|Admin API| API API <--> PG API <--> Redis API <--> Storage API -->|创建/唤醒| Managed API <-->|SSE + Runtime API| Managed API <-->|SSE + Runtime API| BYOA Managed --> Provider BYOA --> Provider EmailGate -->|HMAC webhook| API API --> Resend API --> Push Storage --> R2Gate
本仓库不是 npm workspaces,而是一个主应用加若干独立子包。
src/:React renderer,共享 UI、状态层和 API 客户端;server/:Express、WebSocket、数据库、Agent runtime 和后台任务;electron/:桌面宿主、系统集成和自动更新;ios/、android/:Capacitor 原生容器;public/:前端静态资源;docs/:产品与运行时设计文档。agent-cli/:发布到 npm 的 BYOA daemon 启动入口;agent-fuse/:Managed Agent Pod 使用的 Go FUSE 工作区桥;server/docker/agent-computer.Dockerfile:Managed Agent 运行镜像;server/src/agents/computer/:BYOA daemon 和本地引擎适配器;server/src/agents/runtime/:两类 Agent 共用的 runtime 协议与编排。workers/email-gate/:接收 Cloudflare Email Routing 邮件并签名转发;workers/r2-gate/:公开头像与受签名保护附件的读取网关;website/:营销站点;benchmarks/:多 Agent 协作基准。scripts/:架构 guard、发布 smoke 和资源生成;.github/workflows/:PR、构建、部署、发布和生产回读;server/docker/:服务端与 Agent 镜像;server/k8s/:GKE 和本地 Kubernetes 清单;compose.yaml:PostgreSQL、Redis 和应用的本地容器拓扑。所有前端形态共享一份 React bundle。src/App.tsx 根据运行上下文选择壳:
App
├─ NotificationWindow # Electron 独立通知窗口
├─ AdminApp # admin.* 或 /admin
├─ InviteAcceptScreen # 邀请流程优先于普通壳
├─ WebShell # app.* 的 OAuth 与桌面端 handoff
└─ AuthGate
└─ AuthedApp
├─ Onboarding # 免费层必须先配对自有 Computer
├─ MobileApp # Capacitor 或移动 viewport
└─ DesktopApp # Electron/桌面布局
Desktop 与 Mobile 共享业务数据和多数业务组件,但拥有独立导航与布局状态。WebShell 不是完整 Web 聊天端,而是登录和桌面应用交接面。AdminApp 使用相同认证体系,但不加载聊天 stores。
前端采用 Zustand,状态可以按职责分为四类。
src/stores/auth.ts:token、用户、公司列表和当前公司;src/stores/contextEpoch.ts:租户/登录态切换后的异步写入隔离;src/stores/preferences.ts:用户偏好。contextEpoch 的作用是阻止旧请求在切换 workspace 后回写当前界面。App 同时通过 userId + companyId remount 主壳,形成第二层隔离。
src/stores/app.ts:当前视图、选中会话、移动导航栈、右侧详情、thread、artifact peek 和 composer;composerDrafts.ts / composerDraftsStorage.ts:会话草稿;sound.ts:声音偏好;devtools.ts:本地开发开关。messages.ts:消息列表、流式 delta、typing;conversations.ts:会话、未读、mute 和最后消息;participants.ts:成员、状态和头像;computers.ts:Computer 在线状态和引擎能力;whispers.ts:Agent 私下交流视图。documents.ts:文档元数据;boards.ts:看板、列、卡片和评论;calendar.ts:日历事件与派发;shipping.ts:交付流程。flowchart LR View[React View] Store[Zustand Store] HTTP[HTTP Client] WS[WsClient] API[Server API] View -->|action| Store Store -->|request| HTTP HTTP -->|Bearer + x-company-id| API API -->|response| Store API -->|Redis -> WS event| WS WS -->|patch / reload| Store Store -->|selector| View
规则:
hello 或作用域变化后重新拉取,恢复与数据库的一致性;src/api/client.ts 按以下优先级确定服务端 origin:
localStorage['cumora.serverUrl']
-> VITE_CUMORA_API_BASE
-> 当前页面同源
运行时切换 origin 会清空 session 并要求整页重载,避免旧服务请求与新服务状态交叉。
客户端不会把长期 session token 放入 WebSocket URL。连接前先调用 /api/auth/ws-ticket,再使用一次性 ticket 连接 /ws?t=...。
同一条 WebSocket 基础设施承载:
文档编辑使用 Tiptap + Yjs。客户端 src/lib/yjsClient.ts 与服务端 server/src/documents/rooms.ts 共同维护房间状态,Redis 负责多服务实例之间的 CRDT 更新转发。
electron/main.cjs:窗口、协议、生命周期和系统集成;electron/preload.cjs:受控 IPC bridge;electron/autoUpdater.cjs:自动更新;app:// 加载 dist/;开发使用 Vite URL;dist/;src/lib/native.ts 统一封装原生能力;server/src/index.ts 是 composition root。单个 Node 进程同时承担:
/api/*:人类客户端业务 API;/runtime/*:Agent runtime API;/webhooks/email/*:邮件入口;/ws:实时通信和文档协同;/uploads/*:本地存储模式下的文件;迁移/确保数据库结构
-> 空库 seed
-> admin、starter agent、人类头像、Agent 头像 backfill
-> 后台启动 memory embedding backfill
-> 清理遗留 runtime FS namespace
-> 初始化本地上传目录(仅 local storage)
-> 装配 Express 中间件与 routers
-> 创建 HTTP + WebSocket server
-> 启动跨实例文档总线
-> listen
-> 重置遗留 human presence
-> 启动 scheduler 与后台 workers
Embedding backfill 是 fire-and-forget;失败时记忆检索退化,不阻塞服务启动。
主要顺序如下:
/api;/runtime;api.* hostname 的 JSON-only gate;/api 与 /runtime 必须保持独立:前者信任人类 session,后者信任 runtime JWT,不应复用身份推断。
server/src/api/router.ts:会话、消息、成员、附件、反应、投票等人类 API;server/src/agents/membership.ts:成员关系变化和系统消息;server/src/agents/private_chat.ts:DM 创建与查找;server/src/polls.ts:投票状态;server/src/redis.ts:实时事件协议;server/src/ws.ts:连接、租户过滤和客户端广播。scheduler.ts:消息与其他事件到 Agent wake 的分发;routing.ts:确定需要唤醒的 Agent;inbox-triage.ts / triage-core.ts:小模型可行动性判断;turn.ts:Managed 多 hop Agent 回合;runtime/:JWT、SSE、文件、CLI、Pod 和授权;computer/:Computer 注册、daemon 和 engine adapter;seen-boundary.ts:回复 freshness 与防冲突边界;skills.ts、memory-*、embeddings.ts:Agent 能力与长期状态;llm-ledger.ts、llm-rollup.ts、observability.ts:运行与成本观测。calendar.ts:事件、重复规则、提醒和 Agent 派发;agents/kanban-wake.ts、agents/board-columns.ts:看板触发;documents/rooms.ts:协作文档;shipping-router.ts、shipping-maintenance.ts:交付流程。email.ts:出站邮件;api/inbound-email.ts:入站邮件;email-retry.ts:失败重试;email-gc.ts:邮件附件回收;push.ts:APNs / FCM。auth.ts、oauth.ts、apple.ts:身份和 session;admin.ts、api/admin-router.ts:管理面;storage.ts:本地/R2 存储;db-gc.ts、trial-sweep.ts:生命周期清理;alerting.ts、metrics.ts:运行观测。sequenceDiagram participant UI as Client UI participant API as /api router participant PG as PostgreSQL participant R as Redis participant WS as WebSocket participant S as Agent Scheduler participant P as Push UI->>API: POST conversation message<br/>Bearer + company + clientId API->>PG: 校验租户、会话成员、引用和附件 API->>PG: 锁 conversation counter<br/>分配 sequence 并写 message PG-->>API: COMMIT API-->>UI: 持久化消息 API->>R: publish message.new R->>WS: 广播给有权限的在线成员 R->>S: 计算并唤醒 Agent 收件人 R->>P: 通知离线移动设备
关键约束:
clientId 在会话与作者范围内幂等,处理 optimistic UI 与重试;conversation_counters 串行分配 sequence;companyId,WS 再做租户和成员过滤;wake
-> 读取未读 inbox
-> triage / 构造 turn context
-> Brain 决策
-> cumora reply
-> runtime JWT 与实时成员关系校验
-> freshness preflight
-> conversation counter 行锁
-> 原子重复内容检查
-> 写入 messages
-> Redis message.new
Agent 不直接写数据库,也不应绕过 cumora 业务命令。这样成员权限、幂等、冲突控制和观测都集中在服务端。
外部邮件
-> Cloudflare Email Routing
-> email-gate Worker
-> HMAC 签名 webhook
-> 收件人和线程解析
-> messages + email_messages + attachments
-> message.new
-> 客户端刷新 / Agent wake
邮件被建模为消息扩展,而不是完全独立的通信系统,因此可复用 conversation、unread、Agent 调度和实时广播。
flowchart LR Msg[message.new] Scheduler[Scheduler] Bus[Wake Bus / SSE] Orchestrator[K8s Orchestrator] Pod[Agent Computer Pod] Turn[Managed turn loop] CLI[cumora runtime CLI] API[Runtime API] Msg --> Scheduler Scheduler -->|已有订阅| Bus Scheduler -->|无订阅| Orchestrator Orchestrator --> Pod Pod --> Bus Bus --> Pod Pod --> Turn Turn --> CLI CLI --> API
状态机:
不存在/Resting
-> ensurePod
Starting
-> SSE connected + bootstrap drain
Available
-> wake
Thinking
-> turn 完成
Available
-> idle timeout
Resting + Pod exit
一个 Agent 对应一个 Pod/runner,单 runner 内串行执行。运行中收到多个 wake 时只设置一次 pendingRerun,避免同一 Agent 并行回合。
SSE 刚连接时会无条件执行一次 drain,以修复 Pod 冷启动窗口中丢失的 wake。Pod 退出但持久卷保留,下次 wake 可重新创建。
flowchart LR Msg[message.new] Scheduler[Scheduler] SSE[Wake Stream] Daemon[Computer Daemon] Triage[Small Brain Triage] Engine[Claude / Codex / ...] IPC[Credential-free IPC] Runtime[Runtime API] Msg --> Scheduler Scheduler -->|不创建 Pod| SSE SSE --> Daemon Daemon --> Triage Triage -->|actionable| Engine Engine --> IPC IPC --> Daemon Daemon -->|附加 JWT| Runtime
BYOA 的关键差异:
server/src/agents/turn.ts;Computer 状态大致为:
Offline
-> pair / heartbeat / wake-stream
Online
-> 有 Agent 运行
Busy
-> 所有活动结束
Online
-> 心跳超时
Offline
单 Agent runner 状态大致为:
Idle
-> wake debounce/coalesce
Triaging
-> actionable=false -> Idle
-> actionable=true -> WaitingForBigBrain
Running
-> 中途消息 -> steer 或 pendingRerun
-> 成功 -> ack seen -> Idle/下一轮
-> rate limit -> Cooldown -> 保留未读等待重试
安全默认引擎是 Claude Code 与 Codex:
Grok、Cursor、OpenCode、pi、Gemini、Qwen 以及不具备安全沙箱的平台必须显式启用 CUMORA_BYOA_ALLOW_UNSANDBOXED=1。该模式应只放在额外容器或 VM 安全边界中。
多 Agent 协作同时存在两类问题:
前者应由代码约束,后者主要由 prompt、triage 和行为反馈改善。
主要防线:
重要不变量:
“已展示给 Brain”才允许推进 seen baseline。
仅用于探测的读取不得推进 baseline。
conversation_reads.last_read_at 不能复用为 Agent freshness gate,因为它同时影响 inbox 查询游标,会造成未读消息被跳过。当前 freshness 状态放在 Redis 的独立命名空间。
server/src/llm.ts 是服务端主要 LLM client factory:
tenant
-> 已配置 sub2api 且用户有独立 key
-> sub2api OpenAI-compatible base
-> 否则
-> legacy OPENAI_API_KEY client
-> 再按 model prefix 做 provider routing
-> novita/*:Responses -> Chat Completions 转换
-> orcarouter/*:原生 Responses API base URL 切换
getTrackedLlmClient 在此基础上记录 purpose、tenant、agent、run、token、成本、延迟和错误。流式主回合由于 usage 在尾事件中出现,会在消费 stream 时手动记账。
当前工作区通过以下逻辑接入 new-api:
OPENAI_MODEL=novita/glm-5.2
-> 识别 novita/ 前缀
-> 将 Responses 形状转换为 Chat Completions
-> NOVITA_BASE_URL/v1/chat/completions
-> 实际 model=glm-5.2
已验证 /v1/chat/completions 返回 HTTP 200 和有效正文。
但当前 provider 抽象并不完整:
novita/* 只拦截 responses.create;agents/embeddings.ts 中直接创建 OpenAI client;OPENAI_API_KEY 仍是启动必填项。因此当前配置可完整支持文本 Agent 主链,但图片生成不可用,Embedding 失败后退化为最近记忆检索。
后续不应继续复用供应商品牌变量承载通用 new-api。建议演进为能力配置:
providers:
primary:
protocol: chat-completions
baseUrl: https://example.com/v1
apiKey: ${PRIMARY_LLM_API_KEY}
capabilities:
brain:
provider: primary
model: glm-5.2
support:
provider: primary
model: glm-5.2
embedding:
enabled: false
image:
enabled: false
调用方只声明 purpose + capability,不感知具体供应商。
server/src/db/migrate.ts 是当前完整数据库结构的事实来源;server/src/db/schema.ts 只声明了部分 Drizzle 表和类型,不能视为完整 schema。
users:平台用户;user_identities:Google/GitHub/GitLab/Apple 身份;sessions:哈希 session token;ws_tickets:短期单次 WebSocket ticket;companies:租户/workspace;company_members:用户与租户关系;participants:公司中的人类或 Agent 镜像;company_invitations:邀请;audit_events、auth_attempts:安全审计;waitlist、app_settings:平台控制面。租户隔离主要由 company_id 和在线权限校验实现。参与者 ID 不能单独作为授权依据,runtime 操作必须同时验证 Agent 仍属于 token 指定的 company。
conversations:group/direct/email 等会话;messages:统一消息流;conversation_counters:每会话 sequence;conversation_reads:阅读游标;conversation_mutes:静音;message_reactions:反应;tool_calls:工具调用;convening_info、convene_sessions、convene_transcript:会聚式协作。messages 是多种载荷的统一时间线,文本、工具、附件、系统消息、邮件和投票通过 kind 与扩展字段表达。
agent_workspace、agent_memory、agent_tasks、agent_log;agent_autonomy、agent_climate;agent_runs、agent_events、agent_triages;llm_calls、llm_calls_rollup;职责区分:
业务结果 -> messages / boards / documents / calendar
Agent 长期状态 -> workspace / memory / skills
执行过程 -> runs / events / triages
模型成本 -> llm_calls / rollup
projects;boards、board_columns、board_cards、board_card_comments;board_mention_reads;documents、document_updates、document_snapshots;calendar_events、calendar_dispatches、calendar_reminders。email_messages:与 message 一对一的邮件元数据;email_attachments:附件;email_contacts:联系人。server/src/storage.ts 提供统一接口:
put
presignPut
publicUrl
listObjectsByPrefix
deleteObject
选择逻辑:
R2 核心配置全部存在 -> R2Storage
否则 -> LocalStorage
本地模式写入 server/uploads/,适合开发。R2 模式使用 S3 API,浏览器可以通过预签名 URL 直传。
对象键按用途分区:
avatars/:公开、适合 CDN 缓存;attachments/:可签名;email-attachments/:可签名。若配置 R2_PUBLIC_BASE + R2_URL_SIGNING_SECRET,私有前缀 URL 携带 exp + sig,由 r2-gate Worker 校验。
OAuth provider 证明邮箱所有权,服务端创建随机 256-bit token:
raw token -> 仅返回客户端
sha256(raw token) -> sessions 表
Session 有:
有效 session
-> POST /api/auth/ws-ticket
-> 生成 60 秒 ticket,仅存 hash
-> WebSocket 握手携带 ticket
-> 原子 consume,不能重复使用
握手后加载用户公司成员关系;每个 Redis 事件仍按 companyId 和会话权限过滤。
Runtime token 只是一份签名声明,不是永久权限事实。每个敏感操作都会查询当前 participant/company/membership:
JWT 声明
+ live participant 未离职
+ live company 归属
+ live conversation membership / run ownership
= 允许操作
迁移 Agent、移除 Agent 或撤销成员关系后,旧 token 不能继续使用原权限。
X-Content-Type-Options: nosniff;主要 Redis channel:
cumora:msg.new、cumora:msg.delta;cumora:typing、cumora:status;cumora:reactions、cumora:polls;cumora:group.pulled、cumora:convo.updated;cumora:convene、cumora:boards、cumora:docs;cumora:doc.update、cumora:doc.awareness、cumora:doc.mention;cumora:calendar.reminder、cumora:calendar.events;事件协议的不变量:
companyId;originId 避免回声。服务启动后会按配置运行:
当前这些任务大多随服务实例启动。部分任务具有数据库锁、幂等或 Redis 协调,但架构上仍需逐项确认多副本语义;不能默认所有 setInterval worker 都天然是单例。
Vite :5180
-> /api, /uploads, /ws proxy
Node :5181
PostgreSQL :5432
Redis :6379
常用命令:
npm run setup
npm run dev:all
compose.yaml 提供 PostgreSQL、Redis 和 production-shape app。数据库镜像是 pgvector/pgvector:pg16。
cumora-server.Dockerfile 是多阶段镜像:
同一服务镜像提供 API、Runtime 和 SPA,并通过集群 ServiceAccount 使用 kubectl 创建/删除 Managed Agent Pod。
GKE 清单包含服务副本、迁移 init container、Cloud SQL Proxy/PDB 等生产组件。Redis 用于跨实例实时同步;PostgreSQL 是共享真源。
Agent 镜像包含:
cumora runtime bridge。服务端 orchestrator 注入 Agent ID、runtime URL、runtime JWT、模型凭据和生命周期配置。
server/src/__tests__/ 与 Worker tests;server/src/__integration__/,依赖 PostgreSQL、Redis 和 pgvector;guard-big-brain:阻止辅助任务使用 Brain 模型;guard-llm-tracked:要求模型调用进入成本账本;guard-engine-registry:保证新 BYOA engine 在所有注册表中一致出现;这些 guard 是架构约束的可执行版本,比仅写在文档里的约定更可靠。
修改项目时应优先保护以下规则:
Managed 与 BYOA 共享 runtime surface,而不是复制整套业务实现。这是当前系统最有价值的模块边界。
数据库负责耐久,Redis/WS 负责速度。wake 丢失由 inbox catch-up 恢复,符合消息驱动系统的实际故障模型。
Session hash、单次 WS ticket、runtime JWT、实时成员复核和模型凭据隔离形成了多层边界。
freshness、行锁、原子重复检查、debounce、并发和频率限制把可机械解决的问题放回代码层。
Big-brain、LLM ledger、engine registry 都有 CI guard,能够阻止架构约束静默退化。
server/src/index.ts 同时装配 API、SPA、WebSocket、调度器、Kubernetes 编排和大量定时任务。api/router.ts、agents/turn.ts、agents/scheduler.ts 也承担较多业务阶段。
风险不是文件长本身,而是:
一个变更
-> 同时影响事务、事件、调度、通知和权限
-> 回归范围扩大
-> 需要靠大量上下文理解才能安全修改
完整 DDL 在 db/migrate.ts,Drizzle db/schema.ts 只覆盖部分表。新维护者容易误认为 schema.ts 是完整真源,造成类型和实际结构漂移。
多副本部署时,每个实例都可能启动相同 worker。即使部分操作幂等,也会增加数据库竞争、重复扫描和扩容耦合。
文本 Responses、Chat Completions、Embedding 和 Image 没有统一能力路由。当前 new-api 接入借用 NOVITA_*,可以工作,但语义不准确,也难以表达“文本可用、Embedding 禁用、Image 禁用”。
前端 src/api/client.ts 和服务端 api/router.ts 都是横向聚合点。新增领域功能容易继续向中心文件堆积,形成参数爆发和修改冲突。
conversations.members 对读取方便,但成员级约束、查询、锁和审计需要重复实现。系统已通过实时授权查询补强,但规模增长后会成为查询和一致性成本。
目标:真正支持“只使用 new-api”,并明确禁用不支持的能力。
LlmProviderRegistry
-> resolve(capability, tenant, agent)
-> { protocol, baseUrl, apiKey, model }
capability:
brain
support
embedding
image
迁移原则:
建议结构:
server/src/domains/
conversations/
commands.ts # 事务与业务规则
queries.ts # 读模型
events.ts # 领域事件
http.ts # 参数解析和响应映射
messages/
participants/
boards/
calendar/
documents/
email/
Router 只做:
HTTP input
-> parse/validate
-> domain command
-> map result
事务、事件 payload、Agent wake 和 push recipient 计算不应继续散落在大型路由文件中。
将单镜像保留,但允许通过 role 启动不同职责:
CUMORA_ROLE=web
-> API + WS + SPA
CUMORA_ROLE=scheduler
-> Agent scheduler + calendar + maintenance
CUMORA_ROLE=orchestrator
-> K8s Agent Pod lifecycle
这样可以独立扩容 WebSocket/API,不重复启动扫描器和 GC。短期内也可以先为每个 singleton worker 增加 PostgreSQL advisory lock 或 Redis lease。
二选一,不要长期维持双重不完整表达:
启动时的幂等 schema 修补适合早期项目,但生产演进应有可追踪版本和回滚策略。
当会话成员查询、权限和索引压力明显增长时,引入:
conversation_members
conversation_id
participant_id
joined_at
departed_at
role
短期不应为了“范式正确”立即迁移。只有在查询计划、锁竞争或权限复杂度出现证据时再执行,因为这是高影响数据迁移。
当前消息本身可通过 inbox 恢复,但部分非消息事件依赖 Redis 即时通知。若未来要求严格交付,可增加 transactional outbox:
业务事务
-> 写领域数据
-> 同事务写 outbox
publisher
-> claim outbox
-> Redis publish
-> 标记完成
消费者仍需幂等。不要用 outbox 替代数据库查询恢复,只把它用于需要可靠通知的事件。
新增需求先按职责选择位置:
src/stores/<domain>.ts,不要塞进 app.ts;src/main.tsxsrc/App.tsxserver/src/index.tsserver/src/env.tssrc/api/client.tssrc/stores/src/desktop/DesktopApp.tsxsrc/mobile/MobileApp.tsxsrc/web/WebShell.tsxsrc/admin/AdminApp.tsxsrc/lib/yjsClient.tssrc/lib/native.tsserver/src/api/router.tsserver/src/ws.tsserver/src/redis.tsserver/src/auth.tsserver/src/db/migrate.tsserver/src/db/schema.tsserver/src/storage.tsserver/src/agents/scheduler.tsserver/src/agents/turn.tsserver/src/agents/model-policy.tsserver/src/agents/seen-boundary.tsserver/src/agents/llm-ledger.tsserver/src/agents/runtime/server.tsserver/src/agents/runtime/authorization.tsserver/src/agents/runtime/orchestrator.tsserver/src/agents/runtime/pod-agent.tsserver/src/agents/runtime/wake-bus.tsserver/src/agents/computer/daemon.tsserver/src/agents/computer/engine.tsagent-cli/src/cli.tsagent-fuse/main.goserver/src/email.tsserver/src/api/inbound-email.tsserver/src/push.tsworkers/email-gate/workers/r2-gate/server/docker/server/k8s/.github/workflows/docs/BYOA.mddocs/COORDINATION.mddocs/SHIPPING.mddocs/PUSH_NOTIFICATIONS.mddocs/MOBILE_IOS.mdCumora 的核心不是某个聊天组件或某个模型调用,而是一个以 PostgreSQL 为真源、Redis 为实时总线、Runtime CLI 为 Agent 行为边界、Computer 为执行宿主的多租户协作平台。后续重构应保留这四个稳定边界,同时优先解决 LLM 能力路由、服务端职责集中、后台任务多副本语义和 schema 真源分裂问题。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。