第五节 会话
会话(Session)是一次连贯的对话上下文。
5.1 持久化
AVL Code 会把每一条消息持续追加到本地,断电、关机、重启都不会丢。每条消息都有时间戳与作者标识;工具调用、计划修改、审批结果也会以独立卡片形式记录,整条会话可作为完整的工程审计材料。
5.2 会话操作
- 新建:会话标签栏 → 新建,或快捷键
⌘N/Ctrl+N。同一个工作区内最多只保留一条空白草稿:反复点 +、按 ⌘N、发/new都复用同一条,未发出第一条消息前不会进侧栏,避免堆出一串"新会话 1 / 2 / 3 …"幽灵草稿。 - 切换:点击标签页,或在微信里
/s <短id>,或在 命令面板(Cmd+K) 里搜会话标题。 - 重命名:标签页右键 → 重命名。
- 智能命名:未被手动改过名的会话,收到第一条 AI 回复后会自动让 LLM 起一个简短标题(默认开启,可在 设置 → 上下文 关掉);手动改过名的会话永久豁免,不再被自动覆盖。重命名对话框里也有「智能命名」按钮,可随时点一下重新建议。
- 归档:标签页右键 → 归档。归档后从主列表消失,可在 会话档案 里恢复。
- 导出 / 分享:标签页右键 → 分享,可保存截图、保存 HTML、复制为 Markdown;「导出会话 (.zsession)」则把整条会话打包成可迁移的归档文件。导出的 HTML 与界面显示一致:跟随极简密度档(灰阶细行 + 同类调用合并计数,失败照常计入)、子代理以卡片呈现、用户消息气泡按来源分色。
- 复制为新会话:以本会话为起点新建分支,原会话不变。
右键即可唤起菜单:会话条目与上方两处标题栏的 ⋯ 菜单都可用鼠标右键直接唤起,不必瞄准 ⋯ 按钮;菜单贴近窗口底部时不再被裁切,右键也不会连带选中条目文字。
5.2.1 用户消息时间戳
自己发出的消息左侧有一个时间戳标签,点击在三种格式间循环:
| 格式 | 例 |
|---|---|
| 相对时间 | 刚才、3 分钟前 |
| 会话内偏移 | +1m23s(相对首条消息) |
| 绝对时间 | 14:32 |
不同会话各自记忆,互不影响。
5.3 消息组成
一条对话由若干"消息卡片"组成:
- 用户消息
- 助手回复(流式渲染,可中途打断)
- 工具调用(可折叠卡片,包含入参摘要、耗时、结果)
- 计划 / 待办更新(结构化展示,可独立修改)
5.3.1 代码块:语法高亮 + 一键复制
对话里的 fenced 代码块(```)渲染为带 header 的代码卡:
- 语法高亮:基于 highlight.js(lib/common),按语言着色;未知语言走朴素转义,不影响呈现。
- 语言标签:右上角显示该代码块的语言名(如
python/go/tsx)。 - 「复制」按钮:右上角一键把整段代码复制到剪贴板,不用手动框选;成功时按钮短暂变成「✓ 已复制」反馈。
- 行号 grid 保活:跨行 syntax span 内部按源行拆分后逐行配对,行号列与代码列始终对齐,不会因高亮而错位。
5.4 消息流控制
- 助手运行中,输入框右侧的发送键变成 停止 按钮 — 按下会同步终止主助手与所有派生子任务。
- 中途如果你想到补充内容,直接按 Enter 入队 — 这条会在当前自然结束后合并发出,不会打断当前回合。
- 助手输出的工具调用卡片可以单独点开 / 折叠 / 复制结果。
- 输入框按 ↑ / ↓ 可回溯历史输入,执行过的
/斜杠命令也纳入历史(以规范化的/<名> <参数>形式),便于再次取用或改写。
5.4.1 复述意图:开工前先跟你对一遍目标
为避免「一上来就跑偏」,AVL Code 会在会话的第一条消息上做一道轻量确认:AI 先复述一遍它理解的目标、说说打算怎么做(多 Agent 模式下还会给一份「先拆任务 → 并行派子 Agent → 交还你验收」的分阶段计划),等你点头再动手。该功能默认开启,可在 设置 → 智能体 → 自省 关闭(开关:复述意图)。
- 确认就在消息流里完成,不是弹窗,样式和普通消息一致。
- 默认 60 秒后自动开始;鼠标悬停在确认条上会暂停倒计时,给你足够时间看。
- 确认条上有三个选择:
- 确认开始 — 采纳 AI 的复述直接开干;
- 修改 — 当场把复述改一改再发,目标和计划都能改;
- 保留我的本意 — 不采纳 AI 的复述,直接用你最初那条消息继续。
- 点「取消」会把你最初那条消息原样放回输入框,不会丢,便于你补充或重写后再发。
- 只在该问的时候问:仅对你亲手输入的首条消息触发(自动 / 程序触发的不算),且只在这条开场消息比较短(30 字以内)或比较简单时才弹;写得够长够清楚(多行、带编号列表、或顿号 / 逗号等分隔符多于 3 个)就直接开干、不打扰。
- 想对某条消息手动重新对一遍意图:在该消息的操作菜单选「分析意图并从这里重新开始」即可(无视上面的触发条件,强制复述一次并从这里重开);会先隐藏重启点之后的消息、把确认条放在其下方,便于你看清影响范围。
- 选择统计:确认 / 修改 / 保留本意 / 超时自动开始 / 取消各自的次数与字数会被记录,在 设置 → 智能体 → 自省 以表格呈现,便于你回看这道确认到底帮没帮上忙。
5.5 "正在生成"区块的视觉细节
- Token 数变化加滚动动效:流式过来的 token 计数不再硬跳,约 0.4 秒平滑插值到目标值;变化期间数字短暂变品牌蓝并微微上抬。系统设置「减少动画」时自动跳变不抖。
- 耗时按分级显示:60 秒以内仍是
5s/12s这样的简短表达;超过 1 分钟自动升级为1m 30s;超过 1 小时升级为2h 15m 30s。短任务零变化,只在长任务时升级单位。 - 上下文占用圆环按占用分档变色:显示当前上下文窗口占用比例的圆环会随占用分档变色 —— 达到 75% 变黄、达到 90% 变红,更醒目地提示已接近上下文上限(该续跑 / 折叠了)。
5.5.0 消息密度(正常 / 极简)
设置 → 通用 → 消息密度 提供两档(落盘字段 message_density,默认 detailed);Header 快捷菜单「显示」分组的「信息量」滑块可一键切换,无需进设置页:
| 档位 | 行为 |
|---|---|
正常(detailed,默认) |
完整卡片 + 参数预览 / argsSummary,零回归 |
极简(compact) |
无卡片、灰阶细行、最小 chrome;只压缩过程渲染,你的提问与 AI 的正文回复照常完整显示;不再压缩行高 |
极简档下,过程内容自动归并计数:
- 连续工具调用结果合并成一行,带计数。
- 多段思考 + 工具调用合并成 「思考 N 次 · 工具 M 个」(数量变化带 pop 动效)。
- 还在执行、暂时没结果的工具调用合并成 「N 次工具调用尝试」。
- 汇总行里如果有失败,用浅红色标出 — 不刺眼但看得见。
切换档位时滚动位置稳定、不抖动;旧的「收敛」档(collapsed)自动迁移到「极简」。
5.6 滚动与跟随
- 生成期间默认自动跟随底部。
- 一旦你向上滚动查看历史,「跳转底部」按钮出现 = 视为你主动滚走,自动跟随停止。
- 生成中拖滚动条回看不再被钉住:AI 正在流式输出时,想往上拖动滚动条回看前文,过去常被自动跟随同帧拽回底部、像「拖不动」;现在主动上拖会同步松开自动跟随,让你正常上滚查看,需要时再回到底部继续跟最新输出。
- 你点「跳转底部」或自己手动回到底部时,跟随自然恢复。
- 已堵住滚轮事件与流式 chunk 同帧的微秒级竞态,不会再被反复打断。
- 整列表高频抖动修复:之前某些情况下消息列表会上下快速抖动 / 跳动 — 根因是个别消息的高度被反复重测。现在把已渲染过的高度缓存下来(包括高度为 0 的情况),列表不再来回弹跳,滚动更稳。
- 「跳转底部」一次到位:之前要点好几次才能真正到底;现在改为持续校准直到内容高度(scrollHeight)稳定,一次就能稳稳停在底部,长会话首次打开也不会出现「按钮按了像没反应」的多点情况。
- 快速重复点「发送」不再重发:加了同步的在途拦截,连点也只发一条。
5.6.2 长会话分页按需加载
打开很长的会话时先显示最近一段,往上滚动再分段加载更早的消息:
- 滚到顶端继续上滚 → 自动加载上一页,多页加载时居中显示进度提示。
- 底层做了行偏移索引(O(range) 不再 O(scan-from-line-1))+ 多页之间按帧让步 + 去重,长会话的首次打开与上下滚动明显更快、更跟手。
- 会话目录的跳转对尚未加载进窗口的更早消息也能正确定位(自动先加载到该位置再滚过去)。
- 超大消息默认不再"显示折叠":之前为了性能会把过长的单条消息折叠成摘要,现在默认完整展开,要折叠请到设置调整。
5.6.0 会话目录与一键跳转
会话标题左侧新增会话导航按钮(List 图标),鼠标点击展开一个目录 popover:
- 列出本会话每条用户提问 — 每条取「首个非空行」作为标题,自动折叠多余空白,超长截到 120 字符(带 …)。
- 点击某条 → 平滑滚动到该消息并关闭 popover。
- 高亮当前所在条(纯灰阶,朴素专业风)— 按当前视口内可见的用户消息实时判定,滚动时跟随刷新,末条也能正确选中,不再总停在第一条。
- 关闭方式:
Esc/ 点 popover 外 / 窗口 resize。 - 虚拟化安全:按
data-message-id定位(占位消息也带该属性且占正确高度),长会话也定位准确。 - 仅在会话里有用户提问可跳转时才显示,空会话不出现。
- 用浏览器 Popover API(
popover=manual+ top layer)渲染,不依赖 z-index,不会被弹窗 / 抽屉等遮挡。
5.5.1 会话状态条:随窗口宽度换形态
文件变更 / 记忆 / 待办 / 计划 / 目标 / 引导 / 结果草稿 / 附加资料 / 建议任务 / 自检门禁 等状态条会按窗口宽度自动选择呈现形态:
- 窄屏 — 输入框上方横排:多条并列在输入框上方,宽度不够时自动换行(优先填满紧贴输入框的那行、再往上叠),各条间距收拢,非底行的标签还原成完整药丸,不再被挤出屏幕或相互遮挡。点开为向上弹出的浮层。
- 宽屏 — 消息区右上的纵向状态栈:窗口够宽时,这些条目改为在消息区右上纵向排列,不再占用输入框上方的空间。点开为右侧堆叠抽屉:不加遮罩、不挤压正文,以整个状态栈为锚,切换不同条目时抽屉位置保持稳定,并会按两侧可用空间自动选择向左或向右展开。窗口特别宽时抽屉槽位固定预留,开合抽屉不会让正文左右跳动。
信息量设为「极简」时恒用输入框上方的横排形态。切换形态只改变位置,不改变正文宽度。
5.6.1 会话附加目录:让 AI 临时访问工作区之外的文件夹
输入框「+」菜单新增两项:
| 入口 | 权限 |
|---|---|
| 附加目录(只读) | AI 可读取该目录下文件、列举、搜索;不能修改 |
| 附加目录(读写) | 在只读基础上额外允许写 / 删 / 创建 |
典型用法:让 AI 参考另一个项目的代码、把产出写到指定目录、跨工程协作等。
附加前有确认对话框,明确说明授予的是只读还是读写权限;附加后出现 「附加路径」条(窄屏在输入框上方、宽屏在消息区右上,见 §5.5.1),展示当前会话的附加目录,可随时移除。
作用域与安全:
- 附加只对当前会话生效,其它会话不受影响。
- 随会话保存,重启后依然有效(后台自动重新生效,无需重新附加)。
- 放宽的只有文件读写口径(读 / 写 / 搜索 / 列举),其余安全策略不变。
- 附加目录下的搜索结果用绝对路径标注,来源一目了然。
- 会话身份由系统在调用链里注入,AI 自己无法伪造身份去冒用别的会话的附加权限。
统一的「附加资料」入口:会话附加的目录 / 文件与工作区的样本 / 附件已合并到同一个「附加资料」条统一管理,附加进度等状态实时可感知。两类语义清晰、各自处置:会话附加的项移除只是解挂、不删原文件;工作区样本 / 附件的删除走行内二次确认,不易误删。文件有变更会自动刷新(AI 改完文件后无需手动重载),目录按多层树状呈现看得更清楚,并自动忽略 macOS 的特殊文件(如
.DS_Store、__MACOSX/等)。本地工作区文件加入附加资料时状态显示为「已就绪」(不再用「上传 / 已上传」误导本地文件)——「上传」只留给真正外发的场景(如提交反馈、上传检测);范围(scope)徽标也改为可读性更好的靛蓝配色。
5.7 消息内链接与文件路径可点
AI 回复里的链接和文件路径现在都能点:
- 工作区内的文件路径 → 点开后用系统文件管理器(Finder / 资源管理器)定位并选中该文件。
- 外部链接 → 用默认浏览器打开。
- 反引号内联代码里的路径(如
`src/main.go`)同样可点,与普通链接共用一套识别与定位逻辑;普通内联代码不受影响。 - 代码引用可点跳转(接地证据可核对):AI 回答里引用的代码位置、以及工具结果里的「
文件:行」现在都能点 — 带行号的工作区文件,点「查看」会打开源码预览并滚动到该行,不必自己去翻。这让code.search/code.ask等给出的文件:行证据「看得见、可核对」。 - 点击后就地弹出轻量浮动小工具条(主动作「查看 / 打开」+「复制」),非模态 — 点别处 / 滚动 / 按 Esc 即关。
- 工具条用浏览器 Popover API 渲染在顶层,从「关于」「发布说明」「更新」等弹窗里点链接也不会被遮挡。
- 路径识别更精准:只把带常见扩展名的字符串(如
src/main.go、README.md)认作可点路径;纯目录、无扩展名 / 未知扩展名的片段(如a/b、/etc/hosts)不再被误标为可点。 - 仅 AI 回复生效:你自己发的消息里链接 / 路径不再可点,避免误触;只有助手回复里的链接和路径才会被识别与提供工具条。
- 安全:危险协议(非
http(s))链接被拦截不放行;文件定位有工作区纵深校验,不会越界到工作区外。
5.7.1 文件预览抽屉
消息流里点文件链接,弹出的工具条在「查看 / 打开」「复制」旁多了 「预览」 按钮,就地看内容不必切到编辑器。
- 支持的文件类型远不止 Markdown:常见源码(Go / TypeScript / Python / Rust / Java / C·C++ / Ruby / PHP / Swift / Kotlin 等)、配置(YAML / TOML / JSON / INI / .env)、前端(HTML / CSS / Svelte / Vue / Astro)、脚本(sh / bash / ps1 / bat)、文本与数据(md / txt / csv / tsv / xml / sql / diff)、图片与常见二进制(png / jpg / svg / pdf / zip 等),以及
Dockerfile、Makefile、go.mod、.gitignore这类没有扩展名的常见文件名。 - 源码带语法高亮,与消息流里的代码块同一套配色;正文特别大时(超过约 256 KB)不再着色,但行号与定位照常可用。文件路径前会按格式显示对应图标,一眼分辨类型。
- 二进制文件以十六进制转储呈现(十六进制 + 字符对照,最多 64 KiB),不再显示成乱码。远程工作区的二进制文件取不到原始字节,此时会明确说明而不是给出假内容。
- 可预览的范围:先在工作区内查找,找不到再匹配当前会话附加的目录 / 文件 —— 附加进来的文件同样能预览。不能预览的路径不会显示「预览」按钮,避免点了没反应。
- 呈现形态按窗口宽度自动选择:外侧空间足够时常驻为右侧侧栏(不收窄正文);空间不足时退回浮层抽屉(宽
min(820px, 94vw)、不加遮罩),此时正文靠左侧留白避让,同样不被收窄。 - 在文件内查找:抽屉里可直接搜当前文件内容,命中处高亮,显示「第几处 / 共几处」,用「上一处 / 下一处」逐个跳转,可切换是否区分大小写。命中过多时只标出前若干处并给出提示。
- 大小:预览正文上限 1 MiB(超出自动截断并标注),适合速览;要保全文请用「另存为」。
- 「另存为」按钮(抽屉头部):调系统保存对话框,用 64 MiB 大上限读取源文件保全文,写到你指定的位置;取消等于无操作。
- 代码块里单独一条文件路径(文件存在时)也能点开预览:渲染时异步校验该路径是否存在,存在才升级为可点,避免点到不存在的文件。
按 ↑ 在输入历史里回溯时,输入框左上角显示当前位置 N/N(最新 = 总数,最旧 = 1/N),不再"按了几次 ↑ 自己也不知道翻到哪了"。草稿态 / 空历史 / 越界一律不显示。
回溯到某条历史后直接键入或粘贴 → 自动离开历史态,改后内容当作最新草稿:之前在历史态修改会让人误以为"这条历史被改了",本版明确语义 — 编辑即新草稿,原历史不动;再按 ↑ 仍先把当前草稿存起来,编辑内容不丢。
5.9 跨端接管
如果你已经绑定了微信通道:
- 手机上
/s <短id>即可继续未完成的桌面会话。 - 桌面端会话也可以接管手机端发起的会话。
- 同一会话同时只允许一端"持有",另一端会自动同步显示。
详见第十九节「随行通讯」。
