问题描述
当前对话历史侧边栏的分组功能存在两个核心限制,在对话数量较多时尤为突出:
1. 文件夹不支持嵌套
分组是单层扁平结构。当对话累积到几百个时,所有分组都堆在同一层,无法按层级组织。例如:
工作/项目A/Operit ← 想这样,但做不到
工作/项目A/其他项目
工作/项目B
个人/学习
个人/日常
只能靠命名约定来假装层级:
工作-项目A-Operit ← 用命名前缀区分,文件夹列表越来越长
工作-项目A-其他项目
工作-项目B
个人-学习
个人-日常
2. 文件夹不支持独立排序
文件夹没有独立的排序能力。文件夹的显示顺序取决于其内部第一个对话的 displayOrder,用户无法直接拖拽一个文件夹来调整它在列表中的位置——只能通过调整文件夹内部对话的顺序来间接影响。文件夹一多,这个限制就变得很麻烦。
期望行为
- 文件夹嵌套:支持创建多层级的文件夹结构,用户可以在文件夹内创建子文件夹
- 文件夹独立排序:文件夹有独立的排序,用户可以拖拽文件夹本身来调整它在列表中的位置
- 对话跨文件夹拖拽:对话可以在不同文件夹之间拖拽移动,改变归属
- 文件夹折叠/展开:每层文件夹支持折叠/展开(当前已有此功能,嵌套后应保持)
- 搜索适配:搜索时匹配所有层级的文件夹名,匹配到的对话显示完整路径上下文
当前实现现状
代码层面,目前的分组功能基于 chats 表的 group 字段(String? 类型),是一个纯文本标签。文件夹没有独立的数据实体,也没有排序字段——文件夹仅作为 chat 记录上的分组标签存在。
UI 层通过 groupBy { it.group } 产生单层分组,HistoryListItem 只有三种类型(CharacterHeader、Header、Item),没有嵌套层级的概念。
使用场景
- 400+ 对话需要按"工作/个人"分类,各分类下再按项目分层
- 开发者使用 Operit 管理多个项目,每个项目有"讨论"、"代码审查"、"Bug 跟踪"等子分类
- 同一个项目下不同模块的对话需要分开管理,但又不希望它们散落在扁平列表里
注意事项
- 与现有的角色卡绑定模式(BY_CHARACTER_CARD)兼容——文件夹应在角色卡绑定上下文中工作
- 对话分支功能(parentChatId)不受影响——这是独立的对话版本管理机制
- 现有备份/导出功能需要考虑文件夹层级信息的保存和恢复
问题描述
当前对话历史侧边栏的分组功能存在两个核心限制,在对话数量较多时尤为突出:
1. 文件夹不支持嵌套
分组是单层扁平结构。当对话累积到几百个时,所有分组都堆在同一层,无法按层级组织。例如:
只能靠命名约定来假装层级:
2. 文件夹不支持独立排序
文件夹没有独立的排序能力。文件夹的显示顺序取决于其内部第一个对话的 displayOrder,用户无法直接拖拽一个文件夹来调整它在列表中的位置——只能通过调整文件夹内部对话的顺序来间接影响。文件夹一多,这个限制就变得很麻烦。
期望行为
当前实现现状
代码层面,目前的分组功能基于 chats 表的 group 字段(String? 类型),是一个纯文本标签。文件夹没有独立的数据实体,也没有排序字段——文件夹仅作为 chat 记录上的分组标签存在。
UI 层通过 groupBy { it.group } 产生单层分组,HistoryListItem 只有三种类型(CharacterHeader、Header、Item),没有嵌套层级的概念。
使用场景
注意事项