# dsh-pending-session 常见问题(FAQ) > 适用范围:dsh-pending-session(BUILD 0.1.0-r33)· 配合 `@deepseek-ai/dsh 0.2.0-rc.2` > 主文档见同目录的 [README.md](README.md)。 > [!CAUTION] > **这个插件带「真删除」,而且作用于每一条会话行 —— 不只是待执行。** > 装好之后,任何会话行(普通对话、待执行、归档里的行)的「…」菜单里都会多一项「删除会话」; > 它清掉的是会话日志 + 投影缓存 + 工作区记账,**不是归档、不可恢复**。用之前先看下面「[删除与归档](#删除与归档)」那一组。 ## 目录 - [安装与生效](#安装与生效) - [什么样的会话会变成「待执行」](#什么样的会话会变成待执行) - [编辑、重命名、排序](#编辑重命名排序) - [发送与转正](#发送与转正) - [删除与归档](#删除与归档) - [数据、隐私与本地残留](#数据隐私与本地残留) - [排障](#排障) --- ## 安装与生效 **Q:装了插件,侧边栏一点变化都没有?** A:先**重启一次 dsh**。插件的宿主半边(真删除用的端点)只在 dsh 启动时加载;不重启的话删除只会退化成归档,其余界面部分正常。浏览器半边(client.js)改完会热更新,宿主半边不会。 **Q:支持哪个版本的 dsh?** A:`package.json` 里的 `peerDependencies` 声明为 `@deepseek-ai/dsh 0.2.0-rc.2`。兼容性只认这一条 —— `engines` 里的自定义字段 npm 完全不校验,写了也没用。 **Q:这是官方插件吗?安全吗?** A:第三方插件,MIT,作者 nvjaasouid。它是本机插件:**不请求任何外部地址**,唯一的网络调用是向 dsh 自己的删除端点发一个同源 POST。删除端点又只接受「本机回环 + 同源 + `application/json` + 合法会话 id 形状」的请求,并且拒绝删除正在运行的会话。 **Q:怎么确认当前页面跑的是哪个版本?** A:浏览器开发者工具里看 localStorage 键 `dsh-pending-session.build`,值就是 BUILD 串(例如 `0.1.0-r33`)。 --- ## 什么样的会话会变成「待执行」 **Q:什么会话会被登记成「待执行」?** A:只有**空白会话**(还没发送过任何消息,对应原生「新会话」界面)并且**草稿合格**(非空白文本,或任意附件)。已经有消息的普通对话永远不会被登记。 **Q:判定「空白」用的是什么?会不会把我正常对话误判成待执行?** A:两路证据:宿主的 `sessionListMetadata` 空白投影(事件驱动,权威)+ 列表行的 `blank` 标记。宿主投影明确说「非空白」就绝不登记;两条证据都拿不到时按「非空白」处理 —— 宁可漏记,也不误建。 **Q:为什么我明明没发送,只是切了个会话,新会话就留下来了?** A:这正是插件的用途:原生 dsh 会把这种空白会话藏起来,插件把它显示成侧边栏条目,草稿文本与附件都在,点进去继续写就行。 **Q:我能同时有几条待执行?** A:任意多条。待执行之间、以及待执行与正常会话之间互不影响。 **Q:为什么点「新会话」没有回到那个带草稿的旧会话?** A:插件对「带草稿的活动新会话」做了 cwd 隔离,让原生「新会话」按钮总是开一张干净的空白会话;那条带草稿的会话以「待执行」条目存在,点条目才回到它。 **Q:插件更新前留下的、没有条目的空白会话草稿会丢吗?** A:不会。插件会「收养」这类孤儿空白会话:只要宿主说它还是空白、原生草稿存储里确实有合格文本,就会自动补一条待执行条目(诊断日志里记 `adopt`)。 **Q:关掉 dsh 时正在写的新会话,草稿还在吗?** A:在。退出前会把当时活动新会话的合格草稿落盘,下次启动时接管成待执行条目;启动瞬间会话列表还没就绪时会挂起重试,不会因为「还没就绪」就把它丢掉。 --- ## 编辑、重命名、排序 **Q:待执行的时间为什么一直不变?** A:这是设计:待执行的时间 = **创建时间**(第一次离开该会话的时刻)。只查看、只编辑草稿都不会改时间,也不会改它在列表里的位置;转正之后才按「最近一次发送」排序。 **Q:怎么重命名待执行?** A:两条路都行、且都生效:① dsh 原生重命名(行菜单里的重命名,或双击行标题);② 点进条目后输入框上方横幅里的重命名按钮。条目名会跟随宿主标题变化。 **Q:条目名为什么显示「待执行」而不是会话标题?** A:对没有真实标题的空白会话,侧边栏那一行的标题由插件按条目名投影(默认就是「待执行」,你改过名的就显示你改的名字)。 **Q:能调整排序规则吗?** A:不能,插件不提供配置项:待执行按创建时间、普通会话按最近发送时间,混在一起排序。 --- ## 发送与转正 **Q:在待执行里点了发送,会发生什么?** A:条目立刻毕业成普通对话:按发送时间置顶、侧边栏标记消失。如果你给它改过名字,这个名字会被保留为会话标题(延迟改名,尽量落在自动命名之后)。 **Q:转正以后,条目里存的附件字节会被清掉吗?** A:会。转正即毕业,条目和镜像为它缓存的字节都会从本地回收,不会一直留在 IndexedDB 里。 **Q:我把草稿删到只剩空格再离开呢?** A:条目会被自动收走 —— 但**只做归档,不删数据**,在「归档会话」里还能找回来。 --- ## 删除与归档 **Q:删除和归档有什么区别?** A:删除是**真删除**:清掉会话目录(会话日志)、投影缓存(含聚合索引里的对应行)、工作区记账,**不可恢复**。归档只是从默认视图里收起,条目和草稿都保留,能在「归档会话」里找回并恢复。 **Q:删除按钮在哪?** A:任意会话行(不限于待执行)的「…」菜单里的「删除会话」/「删除待执行」。批量删除、批量归档不在本插件范围内。 **Q:点删除后提示「会话仍被 DSH 进程持有」?** A:说明那个会话正被主视图持有(通常是**你当前正在看的那个会话**)。插件会先自动切到别的会话,并在约 5 秒窗口内轮询本地引用计数;还拿不到就拒绝删除 —— 宁可少删一次,也绝不带着「会话还在用」的风险去动文件。按提示先切到其他会话再删,或重启 dsh 后删。 **Q:正在运行(agent 还在输出)的会话能删吗?** A:不能。客户端和宿主端点各拦一道,都会拒绝,并如实说明原因。先停止它再删。 **Q:删了却提示「⚠️ 宿主删除端点不可用,已按归档处理」?** A:说明这次没真删,只做了系统原生归档(会话还在,可在归档会话里找回)。最常见的原因是**装了插件但没重启 dsh**;重启后再删一次即可。这个提示是刻意设计的:归档绝不会被报成「删除成功」。 **Q:为什么升级插件后,删除会提示「另一个 dsh 窗口正在管理待执行」?** A:同时开多个 dsh 窗口时,只有最新打开的那个窗口持有「待执行」的管理权(所有权令牌),避免多个窗口各写一份注册表互相覆盖。真删除这种破坏性动作只在持有管理权的窗口里执行 —— 请到那个窗口操作。 **Q:有一行显示在「未分组」,点开报 `ENOENT`,删也删不掉?** A:这是「僵尸行」:会话存储被外部删掉了,但工作区记账还留着它的引用。点删除时插件会先确认**会话目录(两种拼写)/ 单会话投影缓存 / 聚合索引**三处都没有该会话任何数据,然后把悬空记账摘掉,这一行才会真正消失(诊断日志记 `delete-stale-pruned`)。只要三处里还有一处有数据,就绝不摘记账 —— 那会让活着的会话掉进「未分组」。 **Q:从别的机器(局域网 / 隧道)访问 dsh 时,删除为什么不生效?** A:删除端点**只接受本机回环来源**(`127.0.0.1` / `::1`)。从别的机器访问时请求会被 403 拒绝,插件随即退回归档并提示「已按归档处理」。这是刻意的安全边界,不是故障。 **Q:删掉的会话还能恢复吗?** A:不能。插件不提供回收站;删除的就是会话日志本身。需要保留的请用归档。 **Q:删除会连带删掉我的附件吗?** A:不会。附件目录(`/attachments`)是内容寻址的共享存储,可能被别的会话引用,插件**从不**碰它,只删该会话自己的日志/缓存/记账。 --- ## 数据、隐私与本地残留 **Q:插件把数据存在哪?** A:本地,都在你自己的机器上:草稿文本、名称账本、所有权令牌、诊断日志在浏览器 localStorage;附件字节在浏览器 IndexedDB(库名 `dsh-pending-session`);宿主侧只做删除与会话记账清理,不读取对话内容。 **Q:插件会记录我的聊天内容或会话名吗?** A:不会。诊断日志(`dsh.pending-session.journal.v1`)只记操作类型、会话 id、名字**长度**和 BUILD,从不写名字原文、也不写草稿文本(历史版本写过的会话名会在载入时统一剥掉)。 **Q:卸载插件后,我的草稿还在吗?** A:在浏览器本地留着,重装会被捡回。想彻底清干净就手动删掉这些键: - `dsh.pending-session.registry.v1`、`dsh.pending-session.names.v1` —— 待执行条目与名称/时间账本 - `dsh.pending-session.active.v1` —— 退出时活动新会话的草稿镜像;`dsh.conversation.<会话id>` —— 被改写过 `draft` 的原生草稿键 - `dsh.pending-session.journal.v1` —— 取证日志;`dsh.pending-session.owner.v1`、`dsh.pending-session.build` —— 所有权令牌与版本探针 - IndexedDB 数据库 `dsh-pending-session`(对象存储 `attachments`)—— 附件字节 **Q:插件会动 dsh 的检索索引吗?** A:不处理。DSH 的 session-query sqlite 索引(`application_id=1146308689` / `user_version=8`,表 `persisted_sessions` + fts5 `persisted_docs`)是派生读模型,由会话日志重建;日志删掉后 dsh 自己会收敛。将来若它变成权威存储,删除路径必须另行清理。 **Q:有附件没保存下来,横幅提示「⚠️ 有 N 个附件过大未保存」?** A:单个附件超过 64MB 时,字节不写进本地缓存(只保留一个占位项),条目照常建立;重新打开条目时只恢复其余附件。发送前请自己确认那个大附件是否需要重新添加。 --- ## 排障 **Q:出了怪事,哪里能看到插件干了什么?** A:localStorage 键 `dsh.pending-session.journal.v1`(最近 300 条)。里面是按操作记的流水:`boot` / `create` / `update` / `rename` / `delete` / `delete-prep` / `delete-stale-pruned` / `archive-fallback` / `skip-non-blank` / `adopt` 等。它不含任何用户内容,可以直接贴出来排查。 **Q:journal 里为什么有 `skip-non-blank`?** A:那是「这个会话不是空白会话,跳过镜像」的记录。为避免在普通对话里每敲一个键就写一次日志(会把 300 条环形容量挤满),同一个会话只记第一条。 **Q:删除被拒绝的原因码怎么看?** A:确认框里的括号就是原因码:`held`(宿主仍持有,后面会附 `mainView×1` 之类的引用来源)、`running`(正在运行)、`not-owner`(别的窗口在管)、`no-storage`(磁盘上找不到存储)、`storage-error`(读写出错)、`disposed`(插件刚被卸载/热更新)、`archive` / `archive-error` / `missing-seam`(删除端点不可用,退回归档的结果)。 **Q:控制台里有 `[dsh-pending-session] 0.1.0-r33 xxx:` 开头的警告?** A:这是插件的一次性告警(同一个 key 只喊一次),带 BUILD 串便于对照版本。常见的有:客户端服务未就绪、插槽注册失败、会话列表投影安装失败、附件字节回收失败。把这些告警连同版本号一起反馈即可。 **Q:跑测试怎么跑?** A:在仓库里 `npm test`(等价 `node tests/sim.mjs`,同时驱动 `tests/host-delete.mjs`)。**npm 包里不含 `tests/`,所以装出来的包跑不了测试**,要在仓库里跑。