状态管理

📎 引用文件

本文引用的文件 - agent.ts - agent.ts(类型定义) - agent.test.ts

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件为 Vibe-Trading 研究页面的前端状态管理系统提供完整文档,聚焦于基于 Zustand 的 agent store。内容涵盖: - Store 架构与职责边界 - 消息、会话、工具调用、活动状态机、流式文本更新机制 - 缓存策略、内存优化、状态同步 - 状态迁移与版本兼容性建议 - 调试与监控方法 - 状态变更追踪与性能分析工具使用指南

项目结构

研究页面状态管理位于前端 stores 目录,核心实现为单一 store 模块,配合类型定义与测试用例共同构成完整的状态契约与行为保障。

graph TB subgraph "前端" A["stores/agent.ts"] B["types/agent.ts"] C["stores/__tests__/agent.test.ts"] end A --> B C --> A C --> B

图表来源 - agent.ts:1-336 - agent.ts(类型定义):1-82 - agent.test.ts:1-445

章节来源 - agent.ts:1-336 - agent.ts(类型定义):1-82 - agent.test.ts:1-445

核心组件

关键能力概览 - 消息与会话:addMessage、loadHistory、switchSession、setSessionId、sessionLoading - 流式文本:appendDelta、clearStreaming、reasoningTail - 工具调用:addToolCall、updateToolCall、updateRunningToolCall、updateOldestRunningToolCall - 活动状态机:startActivity、setActivityState、clearActivity、deriveActivityVerb - Swarm 状态:upsertSwarmStatus、updateSwarmStatus - SSE 连接:setSseStatus - 缓存:cacheSession、getCachedSession

章节来源 - agent.ts:60-114 - agent.ts:119-336 - agent.ts(类型定义):1-82

架构总览

下图展示 agent store 的核心数据模型与主要方法之间的关系,体现“消息—工具调用—活动状态—Swarm 状态”的联动关系。

classDiagram class AgentState { +messages +sessionId +status +streamingText +reasoningTail +toolCalls +activity +swarmRuns +sseStatus +sseRetryAttempt +sessionLoading +addMessage() +appendDelta() +setStatus() +setSessionId() +loadHistory() +addToolCall() +updateToolCall() +updateRunningToolCall() +updateOldestRunningToolCall() +startActivity() +setActivityState() +clearActivity() +upsertSwarmStatus() +updateSwarmStatus() +cacheSession() +getCachedSession() +setReasoningTail() +clearStreaming() +clearStreamingSession() +setSseStatus() +switchSession() +setSessionLoading() +reset() } class ToolCallEntry { +id +tool +arguments +status +preview +elapsed_ms +elapsed_s +progress +timestamp } class SwarmRunStatus { +runId +preset +status +currentLayer +totalLayers +startedAt +completedAt +agents } AgentState --> ToolCallEntry : "维护列表" AgentState --> SwarmRunStatus : "维护映射"

图表来源 - agent.ts:60-114 - agent.ts:119-336 - agent.ts(类型定义):40-82

详细组件分析

活动状态机设计

活动状态机用于表达一次“尝试”的生命周期,从思考到工作再到结束,支持终止态的时间冻结与可替换 attemptId。

flowchart TD Start(["开始"]) --> Think["thinking"] Think --> Work{"收到工具调用?"} Work --> |是| Working["working<br/>verb=deriveActivityVerb(tool)"] Work --> |否| Responding["responding"] Working --> UpdateSteps["更新 steps 与 verb"] UpdateSteps --> Terminal{"进入终止态?"} Terminal --> |是| End["stopped/timeout/failed/done<br/>记录 endedAt"] Terminal --> |否| Working Responding --> End

图表来源 - agent.ts:6-44 - agent.ts:167-250

章节来源 - agent.ts:6-44 - agent.ts:167-250 - agent.test.ts:208-266

工具调用状态跟踪

sequenceDiagram participant UI as "UI" participant Store as "AgentStore" UI->>Store : addToolCall(entry) Store-->>UI : toolCalls 增加, activity 更新 UI->>Store : updateRunningToolCall(callId, tool, patch) alt 存在 matching callId Store-->>UI : 更新对应条目 else 不存在 callId Store-->>UI : 按工具名找到最早 running 条目并更新 end UI->>Store : updateToolCall(id, patch) Store-->>UI : 按 id 精准更新

图表来源 - agent.ts:167-222 - agent.ts(类型定义):60-82

章节来源 - agent.ts:167-222 - agent.test.ts:116-206

流式文本更新机制

sequenceDiagram participant Client as "客户端" participant Store as "AgentStore" Client->>Store : setStatus("streaming") Store-->>Client : 记录 streamingSessionId loop 接收流式片段 Client->>Store : appendDelta(delta) Store-->>Client : streamingText 增长 end Client->>Store : clearStreaming() Store-->>Client : 清空 streamingText/reasoningTail

图表来源 - agent.ts:133-148 - agent.ts:299-305

章节来源 - agent.ts:133-148 - agent.ts:299-305 - agent.test.ts:49-99

会话状态持久化与缓存策略

flowchart TD A["切换会话"] --> B{"是否传入 msgs?"} B --> |否| C["清空 messages/toolCalls/activity/swarmRuns<br/>设置 sessionLoading=true"] B --> |是| D["加载 msgs<br/>恢复 swarmRuns(来自缓存)"] C --> E["渲染加载态"] D --> F["渲染历史"] G["缓存会话"] --> H["写入 _sessionCache/_swarmSessionCache"] H --> I{"超过上限?"} I --> |是| J["淘汰最旧键"] I --> |否| K["完成"]

图表来源 - agent.ts:282-323 - agent.test.ts:305-361

章节来源 - agent.ts:282-323 - agent.test.ts:305-361

Swarm 状态管理与消息占位

sequenceDiagram participant Backend as "后端事件" participant Store as "AgentStore" Backend->>Store : upsertSwarmStatus(status) alt 已存在占位消息 Store-->>Backend : 仅更新 swarmRuns else 不存在 Store-->>Backend : 插入 swarm_status 占位消息 end Backend->>Store : updateSwarmStatus(runId, updater) Store-->>Backend : 原子更新 swarmRuns[runId]

图表来源 - agent.ts:251-280 - agent.test.ts:269-303

章节来源 - agent.ts:251-280 - agent.test.ts:269-303

SSE 连接状态

章节来源 - agent.ts:76-78 - agent.ts:304-305 - agent.test.ts:363-375

依赖关系分析

graph LR Types["types/agent.ts"] --> Store["stores/agent.ts"] Tests["stores/__tests__/agent.test.ts"] --> Store Tests --> Types

图表来源 - agent.ts:1-3 - agent.ts(类型定义):1-82 - agent.test.ts:1-8

章节来源 - agent.ts:1-3 - agent.ts(类型定义):1-82 - agent.test.ts:1-8

性能考量

[本节为通用性能指导,不直接分析具体代码行]

故障排查指南

章节来源 - agent.test.ts:116-206 - agent.test.ts:208-266 - agent.test.ts:49-99 - agent.test.ts:305-361

结论

该状态管理方案以单一 Zustand store 为核心,围绕“消息—工具调用—活动状态—Swarm 状态”构建高内聚、低耦合的前端状态层。通过明确的类型契约、完善的测试覆盖、合理的缓存与流式更新策略,实现了稳定的会话体验与良好的性能表现。建议在后续演进中继续遵循不可变更新原则,逐步引入更细粒度的选择器与性能监控,以支撑更大规模的研究工作流。

[本节为总结性内容,不直接分析具体代码行]

附录

状态迁移与版本兼容性建议

[本节为通用实践建议,不直接分析具体代码行]

调试与监控方法

[本节为通用实践建议,不直接分析具体代码行]

状态变更追踪与性能分析工具使用指南

[本节为通用实践建议,不直接分析具体代码行]