问题描述
当前 DivineSense 的普通模式、极客模式和进化模式存在会话上下文割裂问题:
| 维度 |
普通模式 |
极客模式 |
进化模式 |
| 会话存储 |
conversation_context 表 |
CC CLI 内存 (~/.claude/sessions/) |
CC CLI 内存 |
| SessionID 来源 |
DivineSense 后端生成 |
UUID v5 映射 |
短 UUID |
| 历史管理 |
DivineSense session.Service |
CC CLI 自动管理 |
CC CLI 自动管理 |
| 前端显示 |
✅ 完整同步 |
⚠️ 仅显示流式输出 |
⚠️ 仅显示流式输出 |
| 跨模式共享 |
❌ 与 CC 隔离 |
❌ 与普通模式隔离 |
❌ 与其他模式隔离 |
具体表现
- 用户体验割裂:普通模式切换到极客模式 → 上下文丢失
- 数据模型割裂:Geek/Evolution 会话内容不出现在
ai_conversation 表中
- 代理能力割裂:灰灰/时巧无法访问 Geek/Evolution 产生的上下文
解决方案:会话嵌套模型
核心概念
┌─────────────────────────────────────────────────────────────────┐
│ 母会话 (Normal Mode) │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ User: "帮我分析这段代码的性能问题" │ │
│ │ Assistant: "好的,切换到极客模式深入分析..." │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────────┐ │ │
│ │ │ 🔄 子会话 │ │ │
│ │ │ CC Session: divinesense:conversation:{uuid} │ │ │
│ │ │ │ │ │
│ │ │ Q1: "分析 data_pipeline.go" │ │ │
│ │ │ Q2: "检查内存泄漏" │ │ │
│ │ │ Q3: "生成优化代码" │ │ │
│ │ │ │ │ │
│ │ │ 💭 CC 思考中... │ │ │
│ │ │ │ │ │
│ │ │ 📝 A1: [完整 CC 响应...] │ │ │
│ │ │ • 发现 3 个性能瓶颈 │ │ │
│ │ │ • [下载 optimized_pipeline.go] │ │ │
│ │ │ │ │ │
│ │ │ Q4: "再优化一下" │ │ │
│ │ │ 💭 CC 思考中... │ │ │
│ │ │ 📝 A2: [第二波响应] │ │ │
│ │ └──────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ User: "把优化后的代码应用到项目中" │
│ Assistant: "好的..." │
└─────────────────────────────────────────────────────────────────┘
设计原则
- 追加式输入 - 子会话支持多 Q 累加 → 单 A 响应
- 完整保存 - Q&A 完整保存到
ai_message,不生成摘要
- 可追溯性 - 保留
cc_session_id,开发者可本地查看详情
- 不限制 - 追加的 Q 数量不限制,历史保留
技术方案
数据模型
-- 扩展 ai_conversation 表
ALTER TABLE ai_conversation ADD COLUMN parent_conversation_id INTEGER REFERENCES ai_conversation(id);
ALTER TABLE ai_conversation ADD COLUMN session_mode VARCHAR(20) DEFAULT 'normal'; -- 'normal'|'geek'|'evolution'
ALTER TABLE ai_conversation ADD COLUMN cc_session_id VARCHAR(64);
CREATE INDEX idx_conversation_parent ON ai_conversation(parent_conversation_id);
CREATE INDEX idx_conversation_mode ON ai_conversation(session_mode);
保存内容:
- ✅ 完整 Q&A(每条作为
ai_message 保存)
- ✅ cc_session_id(用于本地追溯)
- ❌ CC CLI 原始会话内容(避免重复)
前端类型定义
export interface SubsessionMetadata {
id: string;
mode: 'geek' | 'evolution';
ccSessionId: string;
parentConversationId: string;
status: 'active' | 'idle' | 'closed';
enteredAt: number;
lastActivityAt: number;
pendingInputs: SubsessionInput[]; // 追加的指令列表
}
export interface SubsessionInput {
id: string;
content: string;
timestamp: number;
status: 'queued' | 'processing' | 'completed';
}
后端改造
GeekParrot / EvolutionParrot 新增方法:
// EnterSubsession 进入子会话模式(启动持久会话)
func (p *GeekParrot) EnterSubsession(ctx context.Context, cfg CCRunnerConfig) (*Session, error)
// AppendInput 追加用户输入(线程安全,直接写入 Stdin)
func (p *GeekParrot) AppendInput(ctx context.Context, input string) error
// streamLoop 持续读取 CC 输出
func (p *GeekParrot) streamLoop(sess *Session, conversationID int64)
事件流
新增事件类型:
subsession_enter → 进入子会话
subsession_exit → 退出子会话
实现阶段
| 阶段 |
内容 |
| P1 |
数据库迁移 + Store 接口 |
| P2 |
GeekParrot 持久会话改造 |
| P3 |
EvolutionParrot 持久会话改造 |
| P4 |
后端 Chat Handler 扩展 |
| P5 |
前端类型 + Context |
| P6 |
前端 SubsessionPanel 组件 |
| P7 |
集成测试 + 文档 |
参考资料
- CC Runner 异步架构:
docs/specs/cc_runner_async_arch.md
- 会话服务:
plugin/ai/session/interface.go
- SessionManager:
plugin/ai/agent/session_manager.go
- 前端类型:
web/src/types/aichat.ts
问题描述
当前 DivineSense 的普通模式、极客模式和进化模式存在会话上下文割裂问题:
conversation_context表~/.claude/sessions/)session.Service具体表现
ai_conversation表中解决方案:会话嵌套模型
核心概念
设计原则
ai_message,不生成摘要cc_session_id,开发者可本地查看详情技术方案
数据模型
保存内容:
ai_message保存)前端类型定义
后端改造
GeekParrot / EvolutionParrot 新增方法:
事件流
新增事件类型:
subsession_enter→ 进入子会话subsession_exit→ 退出子会话实现阶段
参考资料
docs/specs/cc_runner_async_arch.mdplugin/ai/session/interface.goplugin/ai/agent/session_manager.goweb/src/types/aichat.ts