Skip to content

[feat] 会话嵌套模型 - 母会话与子会话(Geek/Evolution)的统一架构 #57

@hrygo

Description

@hrygo

问题描述

当前 DivineSense 的普通模式、极客模式和进化模式存在会话上下文割裂问题:

维度 普通模式 极客模式 进化模式
会话存储 conversation_context CC CLI 内存 (~/.claude/sessions/) CC CLI 内存
SessionID 来源 DivineSense 后端生成 UUID v5 映射 短 UUID
历史管理 DivineSense session.Service CC CLI 自动管理 CC CLI 自动管理
前端显示 ✅ 完整同步 ⚠️ 仅显示流式输出 ⚠️ 仅显示流式输出
跨模式共享 ❌ 与 CC 隔离 ❌ 与普通模式隔离 ❌ 与其他模式隔离

具体表现

  1. 用户体验割裂:普通模式切换到极客模式 → 上下文丢失
  2. 数据模型割裂:Geek/Evolution 会话内容不出现在 ai_conversation 表中
  3. 代理能力割裂:灰灰/时巧无法访问 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: "好的..."                                             │
└─────────────────────────────────────────────────────────────────┘

设计原则

  1. 追加式输入 - 子会话支持多 Q 累加 → 单 A 响应
  2. 完整保存 - Q&A 完整保存到 ai_message,不生成摘要
  3. 可追溯性 - 保留 cc_session_id,开发者可本地查看详情
  4. 不限制 - 追加的 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions