Foreword

In DeepSeek Harness (DSH), when models run for extended periods (deep thinking, tool calls), users often need to “interject” — inserting new instructions into the current session, to be read by the model after it completes its current task. Once sent, messages appear as “pending” bubbles at the end of the conversation; before the model acknowledges (reads) them, if the user finds the wording inappropriate or changes their mind, the official interface lacks a recall entry for such steering messages.

Messages waiting in the queue for the next turn (placement: queued) already have a delete button in the official queue dock; interjected messages (placement: steering) have always lacked this feature. dsh-recall-unread, maintained by hg1048596-pixel, adds an “unread messages” strip above the input box, supporting single and full recall, and only takes effect when the message is still in the inbox and unread by the model.

What This Is

dsh-recall-unread is a client-side plugin for DSH, categorized as a client plugin. It lists all sent but unread steering interjected messages in the conversation.input.dock slot, providing a preview and “Recall” button for each; when multiple messages exist, a “Recall All” option is available. It takes effect upon activation and ceases to load upon deactivation, without relying on the launcher menu.

The recall semantics are consistent with the official queue dock’s delete function: once the model claims a message, it automatically leaves the strip and cannot be recalled at that point. The plugin is released under the MIT license, current version v1.1.0 (2026-08), with approximately 35 stars on the GitHub repository.

How It Works

In DSH, messages that are “sent but unread” correspond to items still residing in the Agent inbox, specifically the pending items in the ConversationSnapshot.queue snapshot. The meanings of steering and queued placements differ: queued messages are handled by the official queue dock; this plugin specifically adds the missing recall capability for the steering side.

The static version (recommended) directly calls the official session RPC on the client side:

session.updateQueue(itemId, { kind: 'remove' })

This is the same implementation as the official queue dock’s “delete” function. The dynamic version uses the Host private RPC recall, internally calling agents.get(sessionId).inbox.remove(itemId), which has the same effect as the above RPC.

Core Features

  1. Unread Message Strip: Displays all steering unread messages with preview text above the input box.
  2. Single Recall: Clicking “Recall” removes the message from the conversation and shows a “One message recalled” notification.
  3. Recall All: When multiple unread messages exist, clears them all with one click.
  4. Read-Only Semantics: Messages automatically leave the strip once the model begins reading and cannot be recalled.
  5. Graceful Degradation: Provides clear prompts if recall fails (e.g., if the message has already started sending) without breaking the conversation.
  6. Zero Configuration: Works out of the box with no additional settings required.

Installation and Activation

Static installation loads with DSH and persists after restart.

  1. Copy the plugin/ directory from the repository to the web profile’s node_modules:
~/.dsh/profiles/web/node_modules/dsh-recall-unread/
  1. Append to the end of ~/.dsh/profiles/web/cordis.patch.yml:
- insert:
    - id: recall-unread
      name: dsh-recall-unread
  1. Restart DSH. Once the plugin is enabled, the “unread messages” strip takes effect; it can be disabled or enabled at any time in the plugin marketplace (dsh-market) or the plugin management page.

The static version does not rely on Amadeus; recalls use the official client RPC, consistent with the official interface behavior.

Method 2: Dynamic Plugin (Temporary Trial)

Suitable for trying out; requires redefinition after DSH restart.

  1. Enter the Cordis plugin development process in the conversation (cordis_define).
  2. Create a new plugin: set idPrefix to recall; paste src/host.js into code.host; paste src/client.js into code.client; set name to Recall Sent Unread Messages.
  3. Use the returned pluginId / packageId to call cordis_run to activate, and approve the run in the interface.

For long-term use, Method 1 is recommended.

Typical Usage

  1. Ensure the plugin is enabled (enabled by default after installation; can be toggled in the plugin marketplace or management page).
  2. While the model is running, send a text message via interjection (sending during execution enters steering).
  3. The message appears at the end of the conversation (with a “pending” marker), and simultaneously the “unread messages” strip appears above the input box.
  4. Click “Recall” to the right of that message — both the bubble and the strip disappear, with a “One message recalled” notification.
  5. When multiple unread messages exist, click “Recall All” to clear them all at once.

To fine-tune the strip position or prompt duration, modify slots.register(…, order: 30) or ctx.timeout(() => setStatus(null), 2500) in src/client.js; the dynamic version requires redefinition, while the static version requires redeployment to node_modules and a restart after modification.

Use Cases and Notes

Who It’s For: Users who frequently interject during long model tasks and need to retract or change their mind before the model reads the message.

Limitations:

  • Can only recall messages that have not been read by the model and are still in the inbox.
  • Queued messages (queued) are handled by the official queue dock; this plugin does not duplicate coverage.
  • Due to the official lack of message bubble-level slots, the recall entry is in the strip above the input box, not directly hovering over the bubble.
  • Dynamic plugins are not persistent; static installation loads automatically with DSH startup.

Security Note: The plugin runs with the permissions of the current DSH process. Before installation, it is recommended to review the repository source code and the MIT license to ensure the behavior meets expectations.

If the static bundle causes a DSH startup red screen (Failed to load plugins), you can use tools/recall-killswitch.ps1 from the repository to add disabled: true to the recall-unread entry in cordis.patch.yml, disable the plugin, and restart; use -Action enable to restore.

Links

  • SkillHub Directory Page: https://www.skillhub.cn/plugins/hg1048596-pixel/dsh-recall-unread
  • GitHub Repository: https://github.com/hg1048596-pixel/dsh-recall-unread

dsh-recall-unread adds recall capability for steering interjections in the “sent but unread” stage, complementing the official queue dock’s delete function for queued messages. If you frequently interject during long tasks and need the option to retract, simply enable it after static installation — no additional configuration is required.