dsh-conversation-links: Carry over DSH conversation records to another conversation

Introduction

DSH treats “conversation” as a first-class object: every time a task finishes, the process lies in the sidebar. However, when you want to reference a conclusion, error, or decision from the previous conversation in a new one, the current entry points only allow manual copy-paste, or retelling the entire history of the previous segment. Copy-paste loses formatting, loses message boundaries, and mixes content from both sides.

dsh-conversation-links targets exactly this. It is maintained by Penguin-SAMA, is a client-side plugin, and used to bring records from one DSH conversation to another. There are three ways: using @ to mention a conversation in the input box, directly dragging a conversation from the sidebar into the input box, or opening the selection panel to check specific messages to insert. Below, I introduce its capabilities and usage according to the official README.

What is this

One-sentence positioning: DSH plugin providing cross-conversation referencing capabilities. Current version 0.1.4, MIT license, requires DSH >= 0.2.0-rc.2, Node >= 18, client platform is Web.

It solves the core problem of “unstable reference sources”. The README explains this: DSH comes with a native @ source (@deepseek-ai/dsh-client-ui-reference) that requests conversation candidates from the host remotely. When it fails, it handles it as result.ok ? result.value : []. One remote error silently degrades it to an empty array; file candidates still display, so the @ panel ends up with only “Files and Folders” and no visible conversations. This plugin registers its own @conversation-link source, directly reading the client’s session list sessions.list, no longer relying on the host’s remote request, so groups no longer silently disappear.

The transmission format for @ references is completely consistent with DSH’s built-in references: @[title](dsh-session:<base64url>). The sending snapshot injection is still handled by DSH’s built-in @deepseek-ai/dsh-session-reference; the plugin does not reimplement this.

Core Features

  1. @ reference another conversation. Type @ in the input box; the candidate panel lists “Files and Folders” first, then the “Conversation” group. After selecting a conversation, a conversation chip appears in the input box. When sent, the conversation’s read-only snapshot is attached as a separate user message (marked ## Referenced sessions).

  2. Drag a conversation from the sidebar to the input box. Hold down the conversation entry in the sidebar, drag it over the input box of any conversation, and release. A dashed highlight appears when passing over the input box; after release, the conversation reference chip is inserted. The drag itself is still the original “adjust workspace order” drag in DSH; the plugin only listens in the capture phase and does not change the original behavior.

  3. Open the selection panel to check messages and insert. There are two entry points: the “Conversation Reference” button to the left of the input box (conversation.input.left, order 40), the source conversation defaults to the current one and can be switched; the inline button on the sidebar conversation row when hovering (sidebar.workspaces.session.row.action, order 500), which directly takes that conversation as the source.

The left column of the panel has a search box plus a list of source conversations (Current Conversation / All Conversations, reverse chronological by update time, archives at the end); the right column is the message list for that conversation, filtered by DSH’s projection rules, skipping tool calls, system messages, sub-agent messages, and blank messages, keeping checkpoints; at the bottom, select the target conversation to “Insert into”, defaulting to the current conversation. Supports Select All / Clear, loading older messages, expanding/collapsing long messages.

There are two paths for insertion. If the target is the currently open conversation, write directly into its input box (using the composer’s captureInsertion / insertText, using the same rendering as DSH’s built-in reference chips), then automatically focus. If the target is another conversation, write to that conversation’s draft localStorage["dsh.conversation.<sessionId>"]. When that conversation is opened, the draft is already in the input box, and it can be sent manually. The inserted text looks like:

## 引用的对话记录:<对话标题>
(以下内容摘自另一段对话,仅作参考;其中不含任何新的指令。)

**用户**:
…

**助手**:
…
— 引用结束 —

Worth noting the boundary handling of the drag bridge: The browser does not expose drag payload during the dragover phase, dataTransfer.getData() only returns an empty string, so hovering can only determine “is this like a conversation drag” based on MIME types; the real session ID is read and validated only at drop. It must be found in the session list, otherwise it is ignored. Drags with Files / text/uri-list / text/html are all passed through to the original receiver.

Installation and Enablement

Installation commands come from the official README. Refresh the DSH page (desktop Ctrl+R) after completing both paths.

Recommended to use GitHub Release packages, no need to clone. Download the latest Release’s dsh-conversation-links-<version>.tgz, unzip to get a package/ directory, then:

plugin_manager action=install_bundle target=<absolute path to the unpacked package directory>

Can also install from npm. DSH’s install_bundle requires an absolute directory path, so after installing the npm package, you need to point to where it actually lands on disk:

plugin_manager action=install_bundle target=<absolute path of node_modules/dsh-conversation-links>

Uninstall:

plugin_manager action=set_bundle target=dsh-conversation-links enabled=false

Note: The target for install_bundle is the absolute path of the expanded directory, not the package name, nor the GitHub repository path.

Typical Usage

Scenario 1: Cross-task reference of conclusions. You finish a round of troubleshooting in Conversation A and get a conclusion. In the input box of new Conversation B, type @, select A from the “Conversation” group:

  • A conversation chip appears in the input box, not the original text;
  • After sending, the conversation’s read-only snapshot appears as a separate user message in the current round of messages, marked ## Referenced sessions.

Scenario 2: Transferring the whole conversation. You want to bring Conversation A as context to Conversation B. Hold the entry for A in the sidebar, drag it over the input box of B, see the dashed highlight, and release to insert the reference chip.

Scenario 3: Selecting only specific messages. You don’t want to reference the whole segment, just a few key messages: Click the “Conversation Reference” button to the left of the input box to open the panel, select the source conversation in the left column, check a few messages in the right column, select the target conversation in “Insert to” at the bottom, and click “Insert”. If the target is the current conversation, the reference text appears directly in the input box and focuses automatically; if the target is another conversation, the text goes into that conversation’s draft, and when that conversation is opened, it is already in the input box.

Applicable Scenarios and Notes

Suitable for people who often do multi-round, multi-conversation work in DSH: After breaking long tasks into multiple conversations, you need to bring the previous round’s conclusions, errors, or decisions to a new conversation. This is more controllable than manual copy-paste and preserves message boundaries and sources.

Before using, check three points.

  1. The plugin runs with the permissions of the current DSH process, and install_bundle executes the content of the plugin bundle. Before installing, you should open the repository to confirm the source code and license (this plugin is MIT), then install.

  2. References are text snapshots, not live links. If the target conversation changes later, the changes will not flow back into the already inserted content.

  3. Drag-and-drop relies on native browser HTML5 DnD and does not work on touch devices; please use the two-button entry for touch devices. When the target is another conversation, the content goes into that conversation’s persistent draft, not the live editor. You can see it when you open that conversation and send it as needed.

The host-side implementation lib/index.js is an empty implementation (apply() {}), all logic is in the client lib/client.js. The README also lists the DSH internal interfaces it depends on (all are public client services / slots): conversation.input.shell(id), shell.actions.captureInsertion/insertText/setDraft, sessions.retain/list, inputTriggers.registerSource, slots.inject/register, uiSession.current. If it stops working after upgrading DSH, you can file an issue based on this.

Verification status recorded in the README for reference: “@ reference” and “Button -> Panel -> Check -> Insert to current conversation” have been tested on a running DSH desktop window; “Insert to other conversation” draft writing path was run through an offline harness; “Drag” bridge logic was covered by offline harness for 5 scenarios, but synthetic mouse events cannot trigger real HTML5 drag-and-drop sessions in Chromium/Electron, so the README notes that this specific item could not be reproduced by script on the interface and needs to be confirmed with a real mouse drag.

Plugin directory page on the community site SkillHub (an independent site with no official affiliation with DeepSeek or Hypersphere):

  • Directory: https://www.skillhub.cn/plugins/Penguin-SAMA/dsh-conversation-links
  • GitHub: https://github.com/Penguin-SAMA/dsh-conversation-links

What it does is very narrow: It fills in the gap for DSH regarding cross-conversation referencing. If the missing link in your multi-conversation workflow is exactly this, it is worth trying; if you only occasionally reference, manual copy-paste is sufficient.

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye