DSH Plugins Marketplace

DSH Plugins

Plugins

/

Sessions & Messages

/

dsh-context-annotations

Y

dsh-context-annotations

Manifest valid★ 1

Select text anywhere in a DSH conversation, attach a note to it, and send the whole annotation batch together with the next message.

UI (client)hasBundlePatch

dsh-context-annotations

DSH Plugin DSH License: MIT

English · 中文

A DSH (DeepSeek Harness) Web GUI plugin: select any text in the conversation, write a note about it, and let the whole batch ride along with your next message — for that one round only.

This repository carries the dsh-plugin topic, which the DeepSeek Harness documentation requires of plugin repositories so they can be discovered; the link above is the inline, clickable form of that requirement.

What it does

  1. Select → annotate. Select text anywhere in the conversation (a reply, a tool card, your own message), and a floating 注释 button appears beside the selection. Click it, type the note, press Enter. Shift+Enter breaks the line, Escape cancels.
  2. Collect several. Every saved note becomes a numbered marker at the left edge of the passage it is about — hovering a marker shows that note — and a N 条注释 strip appears above the composer. Click the strip to open the pending batch, where each annotation shows its quoted passage and note with edit and delete actions. Clicking a marker opens that note's editor, with a delete button.
  3. Send together. Your message gains one short “💬 N 条注释” bubble; the annotation text never appears in the conversation. Hover that bubble to see exactly which passages the batch quoted and what each note says. The list reaches the model as a system-prompt section, so the request still carries every quoted passage and note. The batch is consumed once and its markers stay in the transcript, dimmed.
  4. Send alone. With an empty composer, the strip's send button starts a round from the annotations alone.

How it works

The browser half owns the editing UI; the Host half owns delivery.

  • The browser posts the complete batch to /api/dsh-context-annotations (a route registered through ctx.connection.fetch, behind the carrier's trust fence). It never writes into the draft.
  • The Host keeps that batch per Session and listens on the agent/pre-step waterfall. pre-step hands over exactly the messages the step claimed — never replayed history — so a batch can only ride one round. When the step carries a source.kind === "user" message, the Host appends one extra message that holds only the marker (💬 N 条注释) and leaves the human message byte-for-byte unchanged.
  • The annotation text does not travel in a message: ctx.systemPrompt.section() contributes it to the prompt, and the rendered prompt is logged as a hidden system/message node. The conversation therefore shows one short bubble while the request carries the full list; both are reconstructable from the log, and no plugin event type is invented.
  • The marker message is written before the step records its messages, so it is part of an ordinary user/message record, and the prompt is likewise reconstructable from the log. By design, fork, resume and replay should reproduce the conversation the model saw; no plugin event type is invented.
  • An empty composer cannot submit on its own, so the strip's send button writes a zero-width draft; that round is one empty human message plus the marker.
  • The batch outlives only the turn it rode: pre-step marks it consumed (the browser then clears the strip) and that turn's turn/end retires it from the prompt, so a later round never inherits it. A batch that no round consumed is left pending instead — a note written while the model is still answering waits for your next message rather than vanishing with that turn.
  • After a send the browser reconciles with one cheap request: the Host states consumed explicitly, which marks the local annotations sent (the strip collapses and the markers stay, dimmed). The same request adopts a still-pending batch after a page reload.

What the conversation shows vs what the model receives

The conversation gains exactly one short message:

💬 2 条注释

The model receives the list as a system-prompt section:

1. 所选文本:
<the selected passage>
注释:<your note>

2. 所选文本:
<the selected passage>
注释:<your note>

Files

PathRole
lib/index.jsHost half: batch store, /api/dsh-context-annotations, agent/pre-step fold
lib/client.jsBrowser half: selection button, note editor, numbered markers, composer strip and panel
cordis.patch.ymlInsert the plugin row into the profile
locale/{zh,en}.jsonPlugin Manager title and description
test/smoke.mjsDependency-free test of the fold semantics and the browser bundle's registration
test/client.mjsRegression test for the browser store: per-Session push, explicit consumption, editor identity, composer exclusion

Configuration

The bundle currently reads no configuration. The folded list carries no marker line, so it reads as the user's own numbered notes rather than a plugin block.

Install

Installed from this repository:

plugin_manager install_bundle  target="github:YubaiLoving/dsh-context-annotations"

Or from a local checkout of this directory:

plugin_manager install_bundle  (target: this directory)

Limits

  • Markers key on character offsets into the flattened conversation text and are validated against the recorded passage; when that offset no longer matches (the content above the passage changed), a whitespace-insensitive passage search takes over, disambiguated by the passage's occurrence ordinal. There is no DOM path fallback. A passage that is re-rendered with different wording loses its marker; the note itself stays in the strip and is still sent. Markers that would land on the same box are nudged upwards so they do not stack.
  • Annotations live in Host memory per Session. A Host restart drops a pending batch (the browser adopts only what the Host still holds).
  • The float, strip, and panel read documented data-* markers of the shipped conversation shell ([data-conversation-content], [data-composer-seat], [data-composer-card]) and the browser's own selection. No other plugin's DOM is modified.

License

MIT

Comments

Loading…

From the same category

billion-context

by ranxianglei

基本稳定可用 100K tokens is enough. Universal context-compression proxy for ALL AI coding agents,10w上下文足矣

Sessions & MessagesManifest valid

★ 2k

↓ 450.5k/wk

MIT

TypeScript

Oct 20, 2026

dsh plugin --profile web add billion-context

A DeepSeek coding agent harness: persistent shell, Ultra subagents, auto approval, Chrome MCP and session telemetry

Sessions & Messages

★ 1k

MIT

JavaScript

Index only — not installable

by Han-1413141

DeepSeek Harness session cost meter plugin: session/daily cost, budget, history, OpenCode Go quota, official & custom-provider balance, Codex-like token heatmap, peak/off-peak pricing with pre-switch

Sessions & MessagesManifest valid

★ 470

↓ 26k/wk

MIT

JavaScript

Oct 19, 2026

dsh plugin --profile web add dsh-cost-meter

by Nwflower

Import 14+ external agent chat histories (Claude Code, Codex, ChatGPT, Cursor, Gemini, Reasonix, opencode, ZCode, Grok Build, OpenClaw, Pi, Hermes, Kimi CLI, DSH) into DeepSeek Harness as resumable se

Sessions & MessagesManifest valid

★ 238

MIT

JavaScript

Oct 19, 2026

dsh plugin --profile web add dsh-chat-import

by MichengAI

DSH Archive Manager — 在 DeepSeek Harness 中安全查看、恢复和管理已归档会话 · Safely view, restore, and manage archived sessions in DSH

Sessions & MessagesManifest valid

★ 177

↓ 17.2k/wk

Apache-2.0

JavaScript

Oct 19, 2026

dsh plugin --profile web add @michengai/dsh-archive-manager

by Totoro-qaq

DeepSeek Harness plugin for previewable cross-preset session migration. Fixed-schema handoffs preserve state, source-model intent, and unresolved images; the original session stays untouched.

Sessions & MessagesManifest valid

★ 163

MIT

JavaScript

Oct 18, 2026

dsh plugin --profile web add dsh-plugin-bridge