DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Branch Companion — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
B

dsh-branch-companion

Branch Companion

划词分支助手:框选回答文字 → 添加到新的分支,保留原文标记与分支树面板

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Tetro02/dsh-branch-companion#556d76f08c460743deb6364ce4f7a796ba6a8f51
README兼容性版本

兼容性与来源证明

Branch Companion 以 dsh-branch-companion 发布,当前版本为 0.2.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/18

版本

0.2.0stable
2026/10/18

相关插件

正在加载相关插件…

最新版
0.2.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/18
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 memory-context 分类下经过校验的插件。

Memory Plugin@openviking/dsh-memory-plugin适用于 DeepSeek Harness 的 OpenViking 记忆与上下文套件Contextdsh-context用于上下文洞察和管理的 DeepSeek Harness 插件,提供上下文仪表板和上下文命令,帮助了解上下文的构成及其演变过程。Ab Memorydsh-ab-memory--- description: "dsh-ab-memory 包:一种跨会话、基于文件的智能体记忆,提供五个工具(remember / recall / forget / load_skill / distill)以及始终启用的轻量注入。" kind: "package-reference" ---Weknora@wxg-prc-cpg/dsh-weknora适用于 DeepSeek Harness (dsh) 的 WeKnora 知识检索工具:通过自有知识库进行语义搜索、文档阅读以及 RAG/代理回答。

README


description: "Selection branching for the Web client: grow a Session branch from selected transcript text, with source markers and a navigable branch tree." kind: package-reference

dsh-branch-companion

English | 中文

Overview

dsh-branch-companion adds one path the Web client does not have: growing a branch out of a passage. Selecting text in a transcript reveals Add to new branch; choosing it forks the current Session through the Host, opens the child, records the reference, leaves a clickable ⑂ marker beside the quoted text, and keeps a navigable tree in the top-right corner.

The node document lives in the browser (localStorage). The Host gains no service and no event; removing the plugin takes away the panel and the markers and nothing else.

Features

  • Branch from a selection: select any passage in an answer or question; Add to new branch appears under it and forks the current Session into a child.
  • Context preserved: the child keeps the context up to the fork point and prefills About this passage: "…".
  • Source markers: a ⑂ marker sits beside the quoted text, re-anchors on scroll, re-render, and streaming, and jumps back to the branch.
  • Branch tree panel: the ⑂ Branch pill at the top right opens a panel grouped by source Session with parent/child nesting; every level expands and collapses (plus a collapse-all control), and the current branch carries a highlighted dot.
  • Jump and prune: click a node to jump; hover ✕ to remove that node and its sub-branches without deleting the Session.
  • Client-only state: nodes live in browser localStorage; the Host gains no service or event, and removing the plugin takes only the panel and markers.

Usage

Take a multi-section technical answer (for example "explain OFDM"):

  1. Create a branch from the answer: select "cyclic prefix (CP)" and choose Add to new branch under the selection.
  2. Continue in the branch: the child Session opens with About this passage: "cyclic prefix (CP)" already in the composer; ask the follow-up there.
  3. Return to the source: a ⑂ marker appears beside the quoted text; click it to jump back, and it re-anchors after scrolling.
  4. See the whole tree: open the ⑂ Branch pill at the top right; click a node to jump, hover ✕ to remove a node (the Session stays).

Screenshot walkthrough: the ChatGPT / Codex desktop edition, chatgpt-desktop-branch-companion, shares the same core interaction (select → branch → marker → tree panel). The DSH edition runs in the DSH Web UI and keeps nodes in browser localStorage.

Table of contents

  • Features
  • Usage
  • Use this package
  • Understand the implementation
  • Further exploration
  • Model experience
  • Known limitations and deferred work
  • Dev note

Use this package

Interactions

ActionResult
Select text in a transcriptAdd to new branch appears under the selection
Choose itForks the current Session, opens the child, prefills About this passage: "…"
⑂ marker beside the quoteJumps to the branch; re-anchors on scroll, re-render, and streaming output
⑂ Branch pill, top rightOpens the tree; click a node to jump, hover ✕ to remove it and its sub-branches
Branch from inside a branchThe child node hangs under its parent and indents accordingly

Installation

This package is itself a DSH bundle: it declares dsh.bundle, ships its own cordis.patch.yml, and needs no manual Loader edit.

Install it with the plugin manager (plugin_manager, action: install_bundle), passing either spec:

  • the repository URL: https://github.com/Tetro02/dsh-branch-companion
  • a local checkout: file:C:\path\to\dsh-branch-companion

The manager writes the profile dependency, selects the bundle, and applies its patch layer live; remove_bundle reverts the profile completely. A DSH 0.2.x runtime and the Web UI are required — the Host half exists only so the client half can be composed.

Understand the implementation

Implementation details — click to expand

Design

The plugin does three things, all in the browser: turn a selection into a fork, record the fork relationship, and draw that record back beside the source text. It registers no slot and renders no React node, so the transcript's own tree is untouched; the price is a dependency on DOM contracts ([data-conversation-content], [data-conversation-session]).

Markers never wrap text. The plugin concatenates the transcript's text nodes, matches the stored quote with whitespace-insensitive patterns, builds a Range to measure getBoundingClientRect(), and positions an absolutely placed badge to its right. When React re-renders, the next paint measures the new nodes.

Source map

FileResponsibility
src/index.tsHost half: exists so the Loader can compose the client bundle; no services, no state
src/client/index.tsBrowser entry: registers dictionaries, mounts the overlay, hands teardown to the plugin fiber
src/client/overlay.tsSelection action, source markers, branch panel, prefill retry
src/client/anchor.tsRe-anchors a stored quote to the live transcript and returns a Range
src/client/quote.tsQuote normalization and whitespace-tolerant matching (pure, unit-tested)
src/client/tree.tsNode document parsing, parent/child queries, subtree removal, depth (pure, unit-tested)
src/client/types.tsStructural types for the client services used here (no DSH type imports)
scripts/build.mjsesbuild emits the Host ESM and the wrapped browser bundle; tsc emits declarations

Flow

Selection → sessions.fork({ sessionId, increaseTitle: true }) → child id → append and persist the node → uiWorkspace.openSession(childId) → poll sessions.binding(childId) and conversation.input.requestDraftInitialization to prefill (up to 15 attempts, 200 ms apart, silent on failure).


Further exploration

  • Fork semantics belong to sessions.fork in @deepseek-ai/dsh-api-session-controller; title increment and the atSeq boundary come from there.
  • Navigation belongs to uiWorkspace.openSession in @deepseek-ai/dsh-client-ui-workspace.
  • Composer prefill belongs to conversation.input.requestDraftInitialization in @deepseek-ai/dsh-client-ui-conversation.

Model experience

None directly. The plugin registers no tool, injects no prompt, and sends no message; any difference between a source Session and its branch comes from the user's own input.

Token impact

Zero. No system-prompt paragraph, no runtime-context line.

KV cache impact

None. The plugin neither assembles nor sends provider requests.

Known limitations and deferred work

  • The Host picks the fork point: sessions.fork cuts at the last completed turn by default; the selected text is context and a node reference, not a precise cut.
  • No forking while streaming: the Host rejects a fork on an unfinished turn; the plugin reports it once.
  • Markers need the text: if the message is collapsed or rewritten, the quote no longer matches and no marker is drawn, while the node stays in the panel.
  • The panel is an overlay: it covers the right pane and must be collapsed; no sidebar slot is used.
  • The document is per origin: a different host or port yields a new localStorage and the old document does not follow.
  • No Host configuration: thresholds (600-character quote cap, 40 markers, retry count) are build-time constants, not Schemastery fields.
  • Compared with the ChatGPT desktop edition: tree nodes have no keyboard navigation or removal undo yet; nodes live in localStorage instead of a branch-state.json file.

Dev note

Maintainer context — click to expand
pnpm install       # esbuild + typescript
pnpm run build     # lib/index.js, lib/client.js, lib/internal/*, lib/types/**
pnpm test          # node --test, pure-function unit tests
pnpm run typecheck # tsc --noEmit

A browser bundle must be window.__ModuleLoader__.load({ id, factory }) with module side effects inside the factory; scripts/build.mjs embeds esbuild's IIFE in that factory so nothing runs early.