OCOpenCowork
Get startedInstallChannelsAgentsCapabilitiesSkillsModelsPlatformsOpsReferenceHelp

状态管理

OpenCowork 基于 Zustand 的状态分层、持久化和边界划分。

状态管理 / State Management

OpenCowork 的渲染进程使用 Zustand + Immer 组织状态。总体思路是:

  • 业务实体尽量和 SQLite 对齐
  • 运行时状态留在内存或本地持久化 store
  • 外部连接和配置通过专门 store 管理
  • 复杂状态按域拆分,而不是堆在一个全局 store 里

核心 store / Core stores

Store作用持久化
chat-store项目、会话、消息、模式、工作目录、活动会话SQLite + IPC
agent-storeAgent loop、工具调用、审批、子代理、usage本地持久化
task-store会话级任务面板 / StepsSQLite
plan-storePlan Mode 的计划文件与状态SQLite
team-storeTeam Runtime、成员、任务、消息本地持久化 + runtime JSON
provider-storeprovider / model / auth 配置配置存储
settings-store全局设置、代理、语言、Web 搜索、工作目录settings.json
app-plugin-store图像、浏览器、桌面控制插件配置配置存储
channel-store消息平台插件实例、自动回复状态本地持久化
mcp-storeMCP server 配置与连接状态本地持久化 + mcp-servers.json
cron-storeCron jobs、run history、日志SQLite
ssh-storeSSH groups、connections、远程上下文本地持久化 + SQLite
resources-storeagents / commands / prompts / skills catalogIPC + filesystem
goal-storeSession goal / budget / progressSQLite

辅助 store / Supporting stores

还有一些专门的状态 store,用来承载局部 UI 或辅助流程:

  • ui-store:界面布局、右侧面板、浏览器面板、预览面板、模式切换
  • notify-store:通知窗口状态
  • terminal-store:终端会话状态
  • git-store:Git 相关状态
  • draw-store / image-edit-store:生成与编辑图像状态
  • translate-store:翻译工作流状态
  • background-session-store:后台会话状态
  • input-draft-store:输入框草稿
  • quota-store:用量或额度提示

持久化方式 / Persistence

常见组合有三种:

  1. SQLite:适合会话、消息、任务、计划、Cron、SSH、Wiki、Goal 这类可查询业务数据。
  2. ipcStorage / configStorage:适合配置类、跨窗口同步类状态。
  3. 纯内存:适合短生命周期 UI 状态。
create<State>()(
  persist(
    immer((set, get) => ({ /* ... */ })),
    {
      name: 'store-name',
      storage: createJSONStorage(() => ipcStorage)
    }
  )
)

状态边界 / State boundaries

边界原则
会话实体chat-store 和数据库同步,避免单纯靠内存
运行态agent-store 保留流式文本、工具调用、审批与子代理状态
外部连接channel / MCP / SSH 各有独立 store
配置settings-storeprovider-storeapp-plugin-storechannel-store
视图ui-store 处理布局和面板,不承担业务逻辑

你在代码里会看到什么 / What to expect in code

  • Store 通常只做单一职责。
  • 复杂动作会分成 load / update / clear / sync 几组方法。
  • 很多 store 会用 IPC 做“写入后落盘”,但不会阻塞 UI。
  • 业务层尽量依赖 store 暴露的方法,而不是直接读写底层存储。

On this page