主题
会话管理
关掉终端不等于丢掉上下文。每次会话都自动落盘,可以随时接着上次继续, 也可以回退到某一轮之前重来。
这页讲两件不同的事,别混:恢复会话(找回对话)和回退(撤销已经做出的改动)。
快速上手
接着最近那次继续:
bash
sid-code -c不记得是哪次了,打开选择器挑:
bash
sid-code -r想先扫一眼有哪些会话,不进 TUI:
bash
sid-code --list-sessions真实输出(本机 56 个会话时):
text
共 56 个会话:
索引 | 消息数 | 时间 | 名称
-----|--------|------|------
# 1 | 19 | 3d | # Commit: 生成提交信息并提交 基于当前 git 变更生成规范 commit message
# 3 | 1 | 3d | hi
# 5 | 12 | 3d | 帮我从develop切个新分支然后把c191579551695da7cdd5c24917575794名字默认取首条消息前若干字符,所以会出现一堆 hi。要好认就自己命名(见下)。
详细说明
恢复会话的几种方式
| 参数 | 行为 |
|---|---|
-c / --continue | 继续最近一次会话,不问 |
-r / --resume | 不带值 → 打开交互式选择器(可搜索);带值 → 按 ID/索引恢复,命中不了就把这个值当搜索词进选择器 |
--browse-sessions | 打开 TUI 会话浏览器 |
--fork-session | 恢复时分叉:新 id,源会话一字不动 |
--session-id <uuid> | 指定会话 UUID(须合法 UUID;和 -c / -r 同用必须配 --fork-session) |
-n, --name <name> | 给会话起个显示名,--list-sessions 里好认 |
--no-session-persistence | 这次不落盘(一次性试探、不想留痕时用) |
-r 的按值恢复很好用,索引直接给数字:
bash
sid-code -r 5什么时候该 --fork-session:想从上次的上下文出发试一个新方向,但不希望把原会话 搞乱。分叉后两条线各自独立,原会话还能照常 -c 回去。
会话里也能分叉,/fork 会打印出重启命令。
会话存在哪、留多久
存储位置是 ~/.sid-code/sessions/<项目目录派生的键>/<session-id>.jsonl, 一行一条事件(JSON Lines)。同一个项目的会话归在一个子目录下,所以 -c 在不同项目里continue 到的是各自最近的那次,不会串台。
清理策略默认值:
| 项 | 默认 |
|---|---|
| 启用 | 是 |
| 最长保留 | 30 天 |
| 最多保留数 | 50 个 |
| 最短保留(防误删) | 1 天 |
要改就写 ~/.sid-code/settings.json 的 sessionRetention 段(字段类型见 settings.json 字段)。手动触发一次清理:
bash
sid-code --cleanup-sessions真实输出:
text
开始清理过期会话...
配置: maxAge=30d, maxCount=50
清理完成:
扫描: 63 个
删除: 13 个
跳过: 50 个
失败: 0 个删单个:sid-code --delete-session <id>。
回退:撤销已经改出去的东西
恢复会话解决"找回对话",回退解决"它改错了,我要退回去"。
最快的入口是连按两次 Esc,打开回退选择器,列出最近的用户输入点 (最多保留 30 个),选一个然后挑模式:
| 模式 | 对话 | 文件 |
|---|---|---|
| 仅对话 | 截断回那一轮之前 | 不动 |
| 仅代码 | 保留 | 回滚到那轮的快照 |
| 两者 | 截断 | 回滚 |
"仅代码"是最常用的一档:上下文留着(还知道刚才讨论了什么),只把文件改动撤掉重试。
等价的斜杠命令是 /rewind(别名 /checkpoint)。
更细粒度:checkpoint
文件快照默认开启,每轮改动前留一份。
text
/checkpoints 看快照历史(最近 10 条)
/restore <快照ID> 恢复到指定快照
/undo 撤销最近一次文件修改
/undo src/a.ts 只回滚这一个文件/undo 和 Esc Esc 的"仅代码"档区别:/undo 退一步,回退选择器可以直接跳回好几轮前。
会话里还能做什么
| 命令 | 作用 |
|---|---|
/rename | 重命名当前会话(不带参数就让它按上下文自动起名) |
/status | 会话状态概览 |
/stats | 当前会话统计 |
/insights | 会话分析报告(模型/成本/token/工具/异常) |
/trace | 把轨迹嚼碎成结构化摘要,排查"它当时到底干了什么" |
/export | 导出对话到剪贴板或文件 |
/ps | 列出后台任务和活跃会话 |
/status 与 /stats:一眼概览 vs 会话统计
这两个都给你看当前会话状态,但侧重不同(src/command/commands/status/status.ts、 src/command/builtins.ts:880):
| 命令 | 回答什么 | 形态 |
|---|---|---|
/status | "现在是什么配置"——模型、推理强度、provider、工作目录、上下文占用百分比、激活的 Skills、MCP 连接数 | 纯文本一屏 |
/stats | "这次干了多少活"——对话轮数、消息总数、累计 token、API 请求次数、预估费用、会话时长、Git 操作计数 | 无参弹统计面板;/stats text 出纯文本 |
/status 的真实输出长这样(字段按当前配置动态拼,拿不到的项降级为 -):
text
会话状态:
模型: deepseek-v3.1
推理强度: high
Provider: openai
Fallback 模型: deepseek-v3
会话 ID: 20260728-164317-a1b2c3d4
工作目录: /Users/you/project
消息数: 12
上下文: ~18,432 / 131,072 tokens(已用 14%,剩余 ~112,640)
提示: /context 查看分类 token 拆解
MCP 服务器: 1/2 已连接,共 8 个工具几个细节:
- 推理强度后面会标注「(当前模型不支持切换)」如果模型没有 effort 能力(如 o-series 内置推理)
- 上下文那行的百分比是按当前模型的真实窗口算的,换模型会变
- 激活的 Skills 只在有才显示,MCP 服务器只在连了才显示——不会出现空行噪音
/stats 默认弹结构化统计面板(交互式)。加 text 参数走纯文本,适合脚本化场景:
text
会话统计
─────────────────────
对话轮数:4
消息总数:12
Token 用量:输入 101287 / 输出 210
API 请求:4 次
预估费用:$0.0529
会话时长:0.4 分钟
Git 操作:3 次(commit 1 / push 1 / add 1)最后一行 Git 操作统计有计数才显示——没做过 git 操作的会话不会出现这行。 /stats 的费用和 token 与 /cost 同源(都取自 SessionState),但 /stats 更精简、 /cost 更详细(含缓存命中、辅助调用拆分)。想看成本细节去成本与用量。
常见问题
-c 恢复到的不是我想的那次。-c 只认"最近一次",而且是按当前项目目录分桶的。跨项目或者中间插过别的会话, 就用 -r 挑,或者先 --list-sessions 看清楚。
--session-id 报错说要配 --fork-session。 指定 UUID 又同时要求 continue/resume 是矛盾的——恢复一个已有会话却给它一个新 id,只有"分叉"这一种合理解释,所以必须显式写出来。
会话列表里一堆 hi、# Commit: ... 分不清。 名字默认取首条消息。起名两种办法:启动时 -n "重构认证",或者会话里 /rename。
上周的会话找不到了。 默认只留 30 天 / 50 个。要留更久就调 sessionRetention.maxAge 和 maxCount。 注意 maxCount 也会削——50 个满了,哪怕没到 30 天也会删掉最旧的。
回退选择器里没有我要的那一轮。 回退点上限 30 个,长会话里更早的轮次不在列表。这种情况走 /checkpoints 看文件 快照,或者靠 git 本身。
回退了文件但对话还提着旧内容。 那是"仅代码"档的设计:上下文故意留着好让模型知道刚才试过什么。要一起清就选"两者"。
相关
- 交互模式与键位 ——
EscEsc及其它键位 - 上下文与压缩 —— 长会话变慢变贵怎么办
- CLI 参数与子命令 —— 全部会话相关参数
- settings.json 字段 ——
sessionRetention/checkpoint字段类型与默认值