🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

辅助对话 daidashi/dsh-side-chat

DeepSeek Harness
daidashi9 天前有提交已提供中文文档扫描:含敏感能力

把当前会话分叉成右侧栏独立子会话,随时追问

32.2/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add daidashi/dsh-side-chat
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 4 处,展示前 4 条)
  • 读取本地文件
    lib/sidecar.js:20
    const parsed = JSON.parse(await readFile(FILE, 'utf8'));
  • 写入本地文件
    lib/sidecar.js:32
    await mkdir(dirname(FILE), { recursive: true });
  • 写入本地文件
    lib/sidecar.js:34
    await writeFile(tmp, JSON.stringify(index, null, 2), 'utf8');
  • 写入本地文件
    lib/sidecar.js:35
    await rename(tmp, FILE);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-preset-registry@deepseek-ai/dsh-session@deepseek-ai/dsh-typert-protocol
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-side-chat 为 DeepSeek Harness Desktop 提供「辅助对话」:把当前会话 fork 成一个独立、持久化的子会话,停靠在右侧栏标签里运行,主会话保持可交互。 父会话 ──在最后一个已完成的回合处 fork──▶ 子会话(JSONL) │ │ └── 开始页「辅助对话」卡片 ──▶ 右侧栏标签 ──┘ 内嵌对话 + 输入框 设计来源 本插件的辅助对话交互模仿了 ZCode 的「辅助对话」设计:从主会话 fork 出独立会话、停靠右侧栏、关闭即归档、划词提问。ZCode 是独立的商业产品,本项目与 ZCode 无隶属或背书关系,也未复制其代码或资源。 The side-conversation UX is modeled on ZCode's 辅助对话. ZCode is a separate commercial product; this project is not affiliated with or endorsed by it, and no ZCode code or assets are copied. 功能 - 真 fork,真持久化。
展开完整文档(README 剩余 1 节)
dsh-side-chat

为 DeepSeek Harness Desktop 提供「辅助对话」:把当前会话 fork 成一个独立、持久化的子会话,停靠在右侧栏标签里运行,主会话保持可交互。

父会话 ──在最后一个已完成的回合处 fork──▶ 子会话(JSONL) │ │ └── 开始页「辅助对话」卡片 ──▶ 右侧栏标签 ──┘ 内嵌对话 + 输入框

设计来源

本插件的辅助对话交互模仿了 ZCode 的「辅助对话」设计:从主会话 fork 出独立会话、停靠右侧栏、关闭即归档、划词提问。ZCode 是独立的商业产品,本项目与 ZCode 无隶属或背书关系,也未复制其代码或资源。

The side-conversation UX is modeled on ZCode's 辅助对话. ZCode is a separate commercial product; this project is not affiliated with or endorsed by it, and no ZCode code or assets are copied.

功能

- 真 fork,真持久化。 子会话是用 agents.create({ seed, inheritedEventCount, meta }) 创建的普通 Session,会写自己的 session.v4.jsonl.zstd,之后可以继续恢复。
- 继承父会话。 preset、工具、模型路由、权限/沙箱策略,以及模型可见的完整历史都会继承。子会话独立提问、独立执行工具。
- 只对模型可见的边界。 切点之后追加一条 user 角色消息:「以上对话仅供参考;不要自动继续父会话的工作;只有在本辅助对话中明确要求时才修改工作区。」模型能看到它,标签的转录里看不到。
- 主入口是开始页。 卡片排在右侧栏开始页(guide 标签)自带的 工作区文件 / 新建终端 / 浏览器 之后,order: 40。最初原型里的会话头部按钮已移除;v1 只保留这一张卡片作为主入口。
- 用右侧栏,不另开窗口。 标签复用官方 dock(多标签、双栏、浮动、全屏、按会话持久化布局)和官方对话界面(conversation.content,variant: "embedded"),因此输入框、流式输出、工具卡、审批和提问都是真的。
- 继承的历史不进标签。 资源地址里带着边界 seq,标签的 session binding 经过 seq 过滤,转录从第一个新回合开始。
- 划词提问浮条。 在主对话正文里选中文字,会浮出 添加到当前任务 和 在辅助对话中提问;选区以 Markdown 引用块的形式追加到目标草稿,按会话限制条数与长度,并按原文去重。不会创建任何附件。

环境要求

- DSH Desktop 0.2.1-rc.3(Electron),带 DSH 内核。本插件只支持 DSH 后端;v1 不支持 Claude 和 Codex 后端。
- 插件安装在 ~/.dsh/profiles/desktop,从不修改 app.asar 或安装目录。

构建与安装

cd dsh-side-chat
npm install --no-save --legacy-peer-deps esbuild@0.25.9
npm run build # 生成 client/client.js
node scripts/install.mjs # 打包、复制到 ~/.dsh/profiles/desktop,并注册依赖

install.mjs 还会把包打成 ~/.dsh/plugin-packages/dsh-side-chat.tgz,并把这个 tarball 注册为 profile 依赖。这个依赖不是可选项:profile 里的 pnpm install 会清掉依赖树之外的包(把它移到 node_modules/.ignored);而用 link: 会装成符号链接, Node 会从本仓库解析 host 半的 peer 依赖,导致 host row 永远起不来。

重启 DeepSeek Harness Desktop。host 半会打印 dsh-side-chat: host half loaded;client 半会暴露 window.__dshSideChat 供检查。

开发回路

- 只改 client:npm run build,把 client/client.js 复制进 profile,然后重启应用。host 运行期间覆盖 bundle 可能让客户端模块表残留旧 revision 并返回 404,完整重启最可靠。
- 改 host:复制 lib/.js 并重启应用(host 是子进程)。
- 不需要构建 monorepo,也不需要 dev:web。
- scripts/cdp-.mjs 是仅供开发的辅助脚本:它们连接本机以 --remote-debugging-port=9222 启动的 Desktop(http://127.0.0.1:9222)。这些脚本不在发布包里,安装和使用插件都不需要它们。

使用

1. 打开一个至少完成过一轮对话的会话。
2. 打开右侧栏的开始页(guide 标签)。四张卡片依次是 工作区文件 → 新建终端 → 浏览器 → 辅助对话。
3. 点击辅助对话。卡片先 fork,再把开始页替换成新的辅助对话标签。
4. 在标签里提问。辅助对话能看到父会话历史,但看不到正在跑的那一轮(切点取最近的已完成回合)。
5. 栏位窄时用 dock 的全屏控件;在主页打开会在主栏打开同一个子会话。
6. 用标签的 ×、面板的关闭按钮,或焦点在面板内时按 Ctrl+W 关闭。这类显式关闭会归档子会话:它从左栏和工作区分组里消失,正在跑的回合被停止,JSONL 仍留在磁盘上(unarchiveSession 可恢复)。折叠右栏、切换主会话、重新加载布局、退出应用都不会归档。

再次点击卡片会新建另一个辅助对话。同一个会话的 fork 正在进行时卡片是禁用的,所以双击只会创建一个子会话。fork 失败时(例如会话还没有已完成的回合),卡片恢复可点,并在描述和 tooltip 里显示失败原因。

卡片会显示真实的快捷键 chip。在本机这个 Desktop 构建里,原计划的 Ctrl+Alt+B 已经被右侧栏开关占用(desktop: 用 primary+alt,只有 web 绑定是 primary+shift),因此插件退回到第一个空闲绑定:Ctrl+Shift+B。如果所有候选都冲突,卡片不画 chip,而不是显示一个假的。

开始页入口任务与验收

入口部分与 fork/标签实现是两个独立任务:

- 在 sidebarRightTabs.register({ guide: [{ id: 'open', order: 40, ... }] }) 里注册入口,使其排在 files(10)、terminal(20)、browser(30)之后。
- 通过 ctx.slots.inject('sidebar.right.tab.guide.entry', ...) 替换官方 EntryBox,key: 'dsh-side-chat'(guide 槽以标签类型的 id 为 key)。
- 卡片沿用 GuideBody 的度量(380 px 宽、最小高 56 px、padding 14/20、gap 14 px、--dsw-radius-xl、layer-1 背景、0.5 px 边框),分支图标 26 px,标题 14 px,描述 11 px。
- 点击走 useTabInfo().tab.actions.openResource(address, { replaceTab: true });快捷键走 sidebarRight.commandTarget 和 openResourceIn,避免和全局选中的会话竞争。

验收:

- 开始页按 文件 → 终端 → 浏览器 → 辅助对话 的顺序显示四张卡片。
- 卡片尺寸、圆角、背景、边框、图标、标题/描述字号和快捷键 chip 与官方卡片一致。
- 点击后开始页被替换为辅助对话标签,子会话是真实、已持久化的 fork,边界消息已落盘。
- 快速点两次只产生一个 fork。
- fork 失败后开始页仍可用,卡片可再次点击。
- 重启后新会话的右侧栏默认仍停在开始页,卡片行为不变。

生命周期:显式关闭即归档,其余操作不归档

归档走 dock 自己的 closeIn → removeAfterCleanup → close handler → closeTab 序列,通过 sidebarRight.registerCloseHandler('sidechat', handler) 注册:

- 触发(仅这些):标签的 ×、面板的关闭按钮(包括浮动面板的 关闭)、焦点在右侧栏内时的 Ctrl+W(page.close 会解析到当前聚焦的 dock 目标)。handler 用同一个 parseSideChatAddress 从 tab.contentId 取子会话 id,绝不取「最后一个子会话」。
- 不触发:折叠右栏(setExpanded(false) / closeRightbar)、切换主会话、卸载/重挂载标签正文(包括 keepMounted: false)、重启后恢复布局、窗口最小化或失焦。归档没有挂在 useEffect cleanup 或会话切换回调上。
- handler 同步执行且不允许抛错:解析包在 try/catch 里,归档用 queueMicrotask 排到标签移除之后,即使归档出问题,标签也能正常关掉。这里一旦抛错,× 就关不掉标签。
- 归档调用 ctx.workspaces.archiveSession(childId, { stopActivity: true })。不带 stopActivity 时运行中的子会话会被以 workspace/session-active 拒绝;带上之后 host 先持久化归档集,再发 workspace/session-stop,正在跑的回合、子智能体、任务和定时计划都会停下,不会之后被唤醒。
- 错误处理:session/not-found 只记日志、不做标记,如果只是暂时查不到,下次启动还能重试;已归档的 id 幂等返回;其他失败弹一次非阻塞 toast,标签保持关闭。任何情况都不会重新打开面板。
- 插件自己不调用 release();dock 的 TabDomain abort 和资源释放在 close handler / commit 之后自然发生。
- dock 的 closeTab 在关掉最后一个停靠标签时会把右栏收回到折叠状态,和关闭任何最后一个标签的行为一致。重新展开右栏,用标签栏的加号控件找回开始页。

崩溃与强退。 这些路径不会执行 close handler。启动时(1.5 s,12 s 再试一次)插件通过 sidebarRight.openTabs 读取已持久化的布局,并兜底扫描原始 dsh.sidebar-right.v1. 值里的辅助对话地址。~/.dsh/storages/side-chat.json 里没有任何布局引用的子会话会被 stopActivity: true 归档;有引用的保留,这正是重启恢复的正常路径。已归档的 id 记在 localStorage['dsh.side-chat.v1.archived'],避免对账和用户手动 unarchive 打架。

面板外的 Ctrl+W。 焦点不在右侧栏内时,官方 page.close 会落到 closeWindow(),也就是关掉 Electron 窗口、退出应用,而不是关闭标签:布局会保留,下次启动仍保留被引用的子会话。只有真正的 close handler 才归档。

工作区零污染。

- 归档集是 registry 全局的,关闭的子会话会从所有分组界面消失。它的会话日志仍在 ~/.dsh/sessions/...,unarchiveSession(childId) 可恢复。
- 插件只写 ~/.dsh/(storages/side-chat.json、正常 session store、profile 包)。从不在用户项目里创建文件,不建 worktree,不复制工作区,也不碰 app.asar 或安装目录。
- 工具写项目文件属于继承来的「全工具」行为,不是生命周期状态;边界消息仍然要求模型除非用户在本辅助对话中明确要求,否则不要修改任何东西。

左栏方案 (a)。 session header 的 origin 只允许 subagent,而 sessionVisible() 只隐藏 origin === 'subagent',所以辅助对话在打开期间无法隐藏。v1 接受这一点:打开的子会话是普通工作区行,标题为 辅助对话 · <父标题>,并在 16 px 的 sidebar.session.row.leading 位置显示分支标记。关闭归档时它才离开列表。方案 (b) —— 改 sessionVisible() 并放宽 origin 联合类型 —— 属于上游改动,每次 Desktop 升级都要重打,不在 v1 范围内。

生命周期验收

- ×、面板关闭按钮、面板内 Ctrl+W 都会归档子会话:它离开左栏,JSONL 仍在,unarchive 可恢复。
- 折叠右栏、等待、切换主会话、再展开后,标签、存活的子会话和对话都还能用;没有归档。
- 回合运行中关闭会停止工作并归档,之后没有幽灵唤醒。
- 有待审批/提问时关闭行为相同,不留挂起交互。
- 重启后标签恢复,对应子会话保留;崩溃后未被引用的子会话在下次启动时被归档。
- 连续关闭两次,或关闭一个已消失/已归档的子会话,不抛错、不崩溃。
- 关闭后再点开始页卡片会创建新的子会话,绝不复活旧标签。
- 插件不在项目目录创建任何文件;所有状态都在 ~/.dsh 下。
- 归档失败时标签保持关闭,主界面可用,并有一条可读 toast。

划词提问浮条

在主对话正文里选中文字,会浮出主题化的浮条,含 添加到当前任务 和 在辅助对话中提问。浮条只在 shell.overlay 里挂载一次,用 position: fixed 定位,不会被任何滚动容器裁掉。

出现位置

- 仅当选区非空、commonAncestorContainer 位于主正文的 [data-conversation-session] 区域内,且该会话 id 等于 uiWorkspace.mainReference 的当前主会话时出现。
- 正文里的普通文本、行内代码、围栏代码块和渲染后的 Markdown 都算。
- 选区在 input、textarea、[contenteditable]、输入框([data-composer-card])、右侧栏([data-sidebar-right-session])或辅助对话面板(.dsh-side-chat-panel)里时不出现。
- 视口窄于 640 px 时隐藏(对齐 ZCode 的移动端规则)。
- 浮条打开时不改动原生选区:渲染不抢焦点,按钮上的 mousedown 被阻止移动选区。

浮条行为

- 空间够时放在选区上方,否则放在下方;水平方向夹在视口内,且绝不与选区重叠。
- 滚动(捕获监听,任意滚动父级)和窗口缩放时重新定位。
- 按 Escape、在外部按下指针、或选区收起/消失时关闭。
- Tab 在两个按钮间切换,Enter 激活当前按钮,Esc 关闭;浮条出现时不抢焦点。

添加到当前任务

- 使用导航里的当前主会话 id,绝不使用右侧栏当前聚焦的标签。
- 把选区以 Markdown 引用块(> line)追加到主输入框草稿,然后聚焦输入框。保留原有草稿及其引用芯片,不切换会话、不新建会话、不发送。
- 不创建附件、文件、上传或附件库对象。
- 引用块就是普通草稿文本:随草稿持久化,下一条消息以文本形式携带它。
- 相同文本会去重;一次选区只添加一个引用块。

在辅助对话中提问

- 当前主会话已有辅助对话标签时,复用当前激活的标签(否则用最后一个);引用块追加到该子会话草稿并聚焦其输入框。不会新建 fork。
- 没有时,走已有的 forkOnce 单飞 + 替换开始页的打开流程;按钮显示 正在打开辅助对话… 并禁用,双击仍然只创建一个子会话。
- 目标辅助对话有待审批或提问时,按钮禁用,提示 请先处理辅助对话中的请求,再添加新的选区。
- 主会话本身就是辅助对话子会话(在主栏打开)时,隐藏提问按钮,只保留 添加到当前任务。

限额与序列化

- 一次操作添加一条引用;每个会话最多 8 条;单条最多 8000 字符;当前存活的引用总计最多 16000 字符。超限和重复都以可读的输入框提示拒绝,绝不截断。
- 限额与去重使用 localStorage['dsh.side-chat.v1.quotes.<sessionId>'] 里的按会话记录,但草稿文本才是事实来源:一条记录只有在它的引用块仍原样存在于草稿里时才有效。删除引用块或清空草稿,会在下次插入时释放名额;重启后记录会对照恢复的草稿重新校验。
- 引用块是纯文本。正常的 prompt 序列化把它作为一个 text 块发送;抓到的请求里是 { type: 'text', text: '> …' },没有 file 块或路径。
- 附件库不受影响。20 次添加/删除循环后 ~/.dsh/attachments/v1 保持不变。已有的附件型消息及其对象仍然可读;本插件从不删除它们,因为附件 API 没有删除能力,且对象是内容寻址、可能被共享。

划词验收

- 正文、行内代码、围栏代码、渲染后的 Markdown 选区都能浮出带两个按钮的浮条;浮条位于选区上/下方且不重叠。
- 输入框和辅助对话面板内的选区不浮出。
- 嵌套的辅助对话主会话只显示 添加到当前任务。
- 没有辅助对话时,提问路径会创建一个并聚焦;点两次只创建一个。已有辅助对话时复用(两个打开时用当前激活的),不新增子会话。
- 待处理提问会让提问按钮禁用并显示准确提示。
- 第 9 条引用、8001 字符的引用、16001 字符的总量都会被提示拒绝;同一文本两次只产生一个引用块。
- 从草稿删除引用块会释放名额,同一文本可再次添加;发送不含引用块的草稿会产生不含它的消息。
- 滚动时浮条与选区 1:1 跟随;Escape、外部点击、选区收起都会关闭;窄视口隐藏。
- Tab/Enter 键盘操作可用;浮条出现后选区仍在。
- 重启后引用块仍在主和辅助对话的草稿里;引用只留在自己会话的草稿里,绝不会出现在别的会话。

与 ZCode 的差异

- 这里采用方案 A:引用是草稿里的 Markdown 引用块,而不是输入框上方的独立引用芯片。没有复刻 ZCode 的芯片外观,但选中文本仍以原文作为文本发送。
- 窄屏阈值这里是 640 px;本构建没有暴露 ZCode 的确切断点。
- 浮条只显示两个动作,不重复显示选中文本。
- 引用随草稿持久化(不同于 ZCode 的临时选区芯片),因此能跨重启保留。

v1 范围

包含:DSH 后端、持久化 fork、全工具/全权限、开始页卡片作为主入口、右侧栏标签、多开辅助对话、重启恢复、边界契约、继承历史过滤、一个快捷键绑定、生命周期(显式关闭带 stopActivity 归档,启动对账归档无引用子会话,项目零写入),以及划词浮条(草稿文本引用块、按会话限额、主/辅助对话两个目标)。

不包含:合并回父会话、Claude/Codex、/side 命令、命令面板入口、用户自定义快捷键、辅助对话搜索/导出、自动压缩、打开期间从左栏会话列表隐藏辅助对话行、应用退出时归档。

已知限制

- 左栏: 打开期间辅助对话是普通会话,会出现在左栏,标题为 辅助对话 · <父标题> 并带分支标记。要打开期间就隐藏,需要上游修改 dsh-client-ui-workspace 的 sessionVisible();目前靠关闭归档来让它消失。
- 会话删除: 删除或遗忘父会话会移除它保存的布局,仍在打开的辅助对话子会话就变成无引用;下次启动对账会归档它。
- Dock 撤销: 撤销可能恢复已关闭的辅助对话标签。子会话仍然是归档状态(归档只是隐藏,不删除),所以标签能用,但行会一直留在归档里,直到 unarchiveSession。
- 继承历史过滤: 官方 conversation.content 没有 seq 切点输入,客户端也不暴露 inheritedEventCount。插件在标签挂载期间把 session binding 的 eventSource 换成读取侧过滤视图。这依赖 binding 对象保持为普通可变对象;每次 Desktop 升级后都要复验。一旦失效,就去掉过滤器、显示继承历史并保留提示条。
- 「加载更早」: 官方按钮仍在标签里,但过滤窗口报告 hasMore: false,点了不会加载任何东西。
- 审批: 内嵌输入框渲染真实的审批/提问 UI;栏位窄时用全屏或在主页打开。
- 并发写: 继承了全工具。两个对话改同一个文件时后写覆盖先写;边界提示词是唯一护栏。
- 父会话删除: 辅助对话是独立会话,不会随父会话一起删除。
- 引用外观: 方案 A 把引用渲染成草稿里的 Markdown 引用块,而不是 ZCode 那种输入框上方的独立芯片。选中文本仍以原文作为文本发送,只是视觉不同。
- 引用状态: 草稿文本是事实来源。按会话记录只负责 8/8000/16000 和去重;每次插入都会对照草稿重新校验,所以手动删掉引用块就释放名额。清空浏览器存储会丢失索引(也就丢失限额),但草稿里的引用文本永远不会丢。
- 选区范围: 资格判定依赖主正文上的 [data-conversation-session]。未来若主对话在没有该标记的情况下渲染,就需要更新选择器;Desktop 升级后请复验。
- 遗留附件: 旧版本创建的引用附件仍留在 ~/.dsh/attachments/v1,在各自消息里仍能渲染。它们不会被删除:附件库是内容寻址的、可能被共享,且没有删除 API。清理需要另做一次带备份的引用扫描并取得明确同意。

实现说明

- $mount 安装一个名为 remote.sideChat 的动态 Cordis 服务。通过 ctx.get('remote.sideChat') 读取;ctx.remote.sideChat 按 inject 作用域门禁,在 apply 外会抛错。
- 挂载后的 remote 方法接收一个经过校验的请求对象,返回 { ok: true, value } / { ok: false, error }。
- developer/message 无法在打开的 turn 和 step 之外持久化(v4 格式拒绝冷读),所以边界是一条持久化的 user 角色消息。标签的 seq 过滤器把它和继承前缀一起隐藏。
- 用 ctx.sessions.flush(session) 刷写子会话。服务级的 sessionPersistence.flush() 会在任何无关的存活 writer 出错时失败。
- 任何用 t 渲染的 slot 条目都必须声明 locale: NS;否则 locale 绑定缺失,组件会抛错。
- 开始页替换槽以标签类型的 id 为 key(sidebar.right.tab.guide.entry → key: 'dsh-side-chat'),不是 guide 条目自己的 id。
- Ctrl+Alt+B 在所有桌面平台都是 Desktop 的右侧栏开关。快捷键注册先试它,再试 primary+shift,再试 primary+alt+shift;卡片的 chip 从 live catalog 读取,所以永远反映实际注册成功的绑定。
- 选区捕获是文档级的(selectionchange + mouseup),但由 [data-conversation-session] === uiWorkspace.mainReference.sessionId 门禁,一次判断就能排除输入框、左树、右侧栏和所有内嵌辅助对话。辅助对话面板另有显式排除。
- 浮条位于 shell.overlay 列表槽。它必须为 t 声明 locale: NS;useSessionStatus 来自 uiSession.sessionStatus,useNavigation 来自 uiWorkspace.selection。
- 引用就是草稿文本。insertQuote 用 conversation.input.shell(id)(主会话)或打开标签保留的 binding(辅助对话)解析目标 shell,再用 shell.paste 追加 > …;编辑器未挂载时用 shell.setDraft 兜底并保留草稿。shell.notify(level, text) 负责提示超限/重复。
- 限额与去重存在 localStorage['dsh.side-chat.v1.quotes.<sessionId>']。每条记录在使用前都会对照 shell.snapshot.draft 校验,所以草稿始终是权威,手动删除会释放名额。引用块比较会折叠段落分隔,避免编辑器合并换行导致记录失效。
- 辅助对话标签在重挂载后可能保留一个游离的编辑器(shell 的 editor 和可见的 contenteditable 分叉)。插入或聚焦前,ensureEditorRoot 会把 shell.editor.setRootElement 重新绑定到可见的 [data-lexical-editor];这也让恢复的草稿显示出来。
- 主会话目标始终使用规范的主 shell;辅助对话路径使用标签的 reference binding。这样即使同一个子会话也在主栏打开,「添加到当前任务」也不会写进停靠标签。

回滚

移除 bundle 条目和包目录
PROFILE="${DSH_HOME:-$HOME/.dsh}/profiles/desktop"
PROFILE="$PROFILE" node -e "const fs=require('fs');const p=process.env.PROFILE+'/package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.dsh.profile.bundles=j.dsh.profile.bundles.filter(x=>x!=='dsh-side-chat');fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n')"
rm -rf "$PROFILE/node_modules/dsh-side-chat"

然后重启应用。已经创建的辅助对话子会话会作为普通会话保留;需要的话在会话列表里删除。

目录结构

lib/index.js host 半:提供 sideChat,注册 descriptors lib/service.js SideChatService(typertRemote) lib/fork.js 边界选择、agents.create、标题、工作区、flush lib/remote.js strict Typert descriptors + 请求编解码 lib/sidecar.js ~/.dsh/storages/side-chat.json client/src/index.jsx 资源、开始页卡片、标签、内嵌对话 client/src/lifecycle.js 显式关闭归档、启动对账、行标记存储 client/src/quote.jsx 划词浮条、草稿文本引用、按会话限额 client/src/filter.js 按 binding 的 eventSource seq 过滤 client/src/address.js dsh-resource://sidechat/session/<child>?parent=&boundary=&hide= scripts/install.mjs profile 安装脚本 scripts/cdp-*.mjs 开发期手动使用的 CDP 辅助脚本
预览分享卡片长什么样 ↓daidashi/dsh-side-chat
分享 · DeepSeek Harness Hub
daidashi/dsh-side-chat

把当前会话分叉成右侧栏独立子会话,随时追问

这是你的仓库?认领条目

回到顶部