会话与消息管理
OpenCowork 的 project/session/message 模型和持久化结构。
会话与消息管理 / Sessions & Messages
OpenCowork 使用的是 project → session 的结构,而不是单纯的“聊天列表”。这样做是为了把工作目录、SSH、插件和模型绑定到真实工作上下文里。
业务模型 / Data model
Project
interface Project {
id: string
name: string
workingFolder?: string
sshConnectionId?: string
pluginId?: string
pinned: boolean
createdAt: number
updatedAt: number
}Session
interface Session {
id: string
title: string
mode: 'chat' | 'clarify' | 'cowork' | 'code' | 'acp'
projectId: string
workingFolder?: string
messageCount: number
pluginId?: string
sshConnectionId?: string
providerId?: string
modelId?: string
planId?: string
pinned: boolean
createdAt: number
updatedAt: number
}Message
interface Message {
id: string
sessionId: string
role: 'user' | 'assistant' | 'tool'
content: string | ContentBlock[]
usage?: string
sortOrder: number
createdAt: number
}模式 / Modes
| 模式 | 含义 |
|---|---|
chat | 轻量对话 |
clarify | 先问清楚,再进入计划 |
cowork | 通用协作 |
code | 代码修改与本地执行 |
acp | 架构控制与委派执行 |
消息内容 / Message content
消息内容不是只有纯文本,content 可以是一个 block 数组:
textthinkingtool_usetool_resultimageimage_erroragent_error
这就是为什么聊天窗口能同时展示文本、思考、工具调用和图片。
持久化 / Persistence
会话和消息最终落在 SQLite 中:
sessionsmessages
其中 messages.meta 会保存压缩边界、摘要等辅助信息,messages.sort_order 保证流式写入顺序稳定。
UI store 的作用 / UI store responsibilities
chat-store 负责:
- 项目和会话列表
- 当前活动会话
- 会话模式切换
- 工作目录与 SSH 上下文
- 从数据库加载历史消息
project 为什么重要 / Why projects matter
Project 不只是“分组”标签,它实际上承载了:
- 工作目录
- SSH 目标
- 消息平台上下文
- 关联会话集合
- pinned 状态
这让 OpenCowork 能把“一个代码仓库 / 一个远程主机 / 一个插件聊天空间”当成真正的工作单元。