Back to marketplace

dsh-composer-history

UI & Experience

PerryLink/dsh-composer-history

Terminal-style input history for the DeepSeek Harness web composer: arrow-key recall, browser-local persistence, Ctrl+R reverse search, workspace recall, and sliding-context awareness with compaction summaries.

  • compaction
  • composer
  • context-window
  • deepseek-harness
  • dsh
  • dsh-plugin
  • input-history
  • keyboard-shortcuts
  • sliding-context
  • terminal
  • typescript
  • ui
  • web-gui
GitHub Stars
17GitHub
Views
4DSH Plugin Hub
Forks
2GitHub
Open issues
1GitHub Issues
Manifest version
0.5.3dsh-composer-history
Latest push
Oct 9, 2026GitHub
License
Apache-2.0TypeScript
Plugin type
Host + ClientRuns in both Host and Web Client

Verification and compatibility

This section shows evidence collected by the catalog. Undeclared information is labeled as unknown.

Static checked
01Exact source: npm · dsh-composer-history@0.5.302Validated: Aug 23, 202603Verified Harness: 0.1.0-rc.7
Current-version compatibility
Verified on the catalog Harness version
Declared Harness range
Not declared
Declared platforms
Not declared
Profiles
web
Build approval
Unknown
Permissions
Not declared
External services
Not declared
Telemetry
Unknown
No known risk flags found

This is not a security endorsement. Review source, permissions, and configuration before installing.

View evidence and scope

Verification covers only the named source, version, and Harness environment. It does not guarantee future compatibility.

  • dsh-composer-history@0.5.3
  • The manifest and static structure passed checks; a runtime load check has not completed.

README

View source

⌨️ dsh-composer-history

Release stamp: 0.8.8 (2026-10-04).

  • 1024 store channel: npm i -g dsh1024 once, then dsh1024 plugin --profile web add dsh-composer-history (counts toward the deepseek1024.com install ranking). Gitee dshfind OpenSSF Scorecard

Terminal-style input history for the DeepSeek Harness Web GUI composer.

Press ↑ like it's in a terminal — and keep your half-typed draft safe.

License DSH plugin dsh-doctor DSH Market Node CI Version npm version npm downloads

English · 简体中文 · Español · Português · हिन्दी


📖 Ecosystem knowledge base — measured data, not marketing: plugin development guide · plugin-selection data · maintenance criteria.

⭐ 如果它帮到了你

这个插件是 DSH 插件家族的一员(40+ 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。

English: part of a 40+ plugin family for DeepSeek Harness. If it is useful, a star helps the next person find it — nothing is gated behind it.

What is dsh-composer-history?

Terminal-style input history for the DeepSeek Harness Web GUI composer.

Press ↑ like it's in a terminal — and keep your half-typed draft safe.

Terminal demo of dsh-composer-history: dsh-composer-history — /save and /load, plus arrow recall and Ctrl+R search

Compatibility

SurfaceStatus
HarnessDeepSeek Harness dsh-v0.2.1-alpha.1 (verified 2026-09-25: dual typecheck rulers + 294 tests; client peers >=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0). On this line the settings seam is the profile entry's own live Config form — the removed ctx.settings.register / SettingsProvider family and the client ctx.settingsScope service are both gone, so every tunable now travels through ctx.configForms. On the 0.1.6+ lines SessionListState.current is gone — the current session is derived from the retention facts, so history injection / the snippet library keep working.
Node^22.19.0 || >=24.0.0
PlatformsWeb GUI only (client plugin; browser-local storage; no network, no native code)
ModelAny (no model requests — pure UI behavior)

The browser half rides the published client packages (dsh-client-ui-conversation, dsh-client-ui-input-trigger, dsh-client-ui-settings) and the cordis Context; it no longer depends on the removed dsh-client-runtime package, so the client surface also lines up with 0.1.2-rc.1 hosts. Interception anchors on the web composer's DOM: the contenteditable surface div[data-composer-input] inside [data-input-scroll] (the Lexical composer shipped since 0.1.2-alpha.5 / 0.1.2-rc.1), with the legacy textarea composer inside [data-input-scroll] (harness lines up to 0.1.1-rc.2) still matched; textareas elsewhere pass through. The compat workflow's jsdom web-behavior smoke asserts this identity/text/caret face against the packed bundle. 0.1.2-rc.1 (adapted 2026-09-04): the session envelope keeps its ignorable field for stored-log read compatibility only - Session.append still cannot stamp it, so audit-gate behavior is unchanged. Verified 2026-09-06 against the dsh-v0.1.7-alpha.1 master checkout (full gate chain + profile install smoke). 0.1.5-rc.1 (adapted 2026-09-10): dependency pins move to the published 0.1.5-rc.1 line; no seam change affects this plugin's behavior. 0.1.5-rc.2 (adapted 2026-09-11): dependency pins move to the published 0.1.5-rc.2 line; no seam change affects this plugin's behavior. 0.1.7-alpha.1 (adapted 2026-10-04): the settings seam is replaced on both halves. The host half no longer registers a composer-history namespace through the removed ctx.settings.register(ns, schema, { base }) — on this line a plugin's durable settings surface IS its own live Config: every tunable is declared .volatile(), the profile entry id (composer-history, the bundle patch's row id) names the form, and apply claims the generated-form presentation (ctx.settings.configure({ auto: true }, ctx.fiber), effect-owned so a reload re-registers cleanly). The browser half reads the same entry through ctx.configForms.get('composer-history') instead of the removed ctx.settingsScope.bind({ namespace }); the snapshot/subscribe shape is unchanged, so the wiring still reinstalls on every committed change. Editable surface is preserved, not widened: every field the old namespace exposed is volatile, and no new field became editable. An existing settings.yaml section named composer-history is migrated into the profile entry of the same id by the host itself.

What you get

dsh-composer-history puts a terminal's input history into the DeepSeek Harness Web GUI composer:

  1. Edge-first arrow recall — bare ↑/↓ move the caret first; history recall triggers only when the caret sits on the first/last line. The first recall stashes {draft, caret}, and reaching the newest entry again (or pressing Esc) restores both exactly — never cleared.
  2. Persisted history — every sent message is appended to a bounded browser-local store, so recall survives page reloads and reaches across sessions.
  3. Reverse search — Ctrl+R (configurable) opens a query overlay over merged history, snippets, and templates.
  4. Smart input layer — /save//load snippets, prompt templates with {{workspace}}/{{session}}/{{draft}} variables, and browser-local reuse insights.
  5. Sliding-context aware — compaction summaries join recall and search as [compacted] … entries, and a transient notice announces each compaction with a one-click /compact fill.
  6. Versioned JSON backup — export/import all four libraries (history, snippets, templates, insights) as one schema-versioned document; download or copy on export, file pick or paste on import.

Pure UI behavior: no session events, no agent-loop changes, no model requests. Recalled text only enters the ordinary composer draft; it reaches the model only if you press Enter.

Quick start

dsh plugin --profile web add github:PerryLink/dsh-composer-history
# 1. install the bundle into your profile
dsh plugin --profile web add github:PerryLink/dsh-composer-history

# or from npm (published releases)
dsh plugin --profile web add dsh-composer-history

# 2. restart and verify the row
dsh --profile web --dump-config | grep -A3 'id: composer-history'

Install & uninstall

The npm package ships the built bundles; a source checkout must be built first (pnpm run build) — the client-package check refuses to boot against an unbuilt bundle.

  • git channel (latest main): dsh plugin --profile web add github:PerryLink/dsh-composer-history.
  • npm channel (published releases): dsh plugin --profile web add dsh-composer-history.
  • tarball channel: pnpm pack in this repo, then dsh plugin --profile web add ./dsh-composer-history-<version>.tgz.
  • uninstall: dsh plugin --profile web remove dsh-composer-history (or remove the row from the profile patch).

Configuration

All tunables are Schemastery Config fields (changeable from cordis.yml and the entry's settings form; the profile patch is the persisted document). An id-targeted override replaces the whole row — restate every key you need. Invalid enum values fail the whole dsh boot loudly, and a settings-form edit is validated by the host before it persists.

KeyDefaultMeaning
recallWithDraft'save'Recall mode (save / gate): save stashes a non-empty draft before recall; gate recalls only an empty draft (Claude/Codex-style gating)
restoreOnEscapetrueRestore the stashed draft when Esc ends browsing
edgeMode'logical'Edge detection mode (logical / visual): by \n lines or by measured wrapped lines
enableCtrlAliastrueLet Ctrl+↑/↓ behave like the bare arrows
restoreCarettrueAlso restore the stashed caret on bottom-out / Esc
upKey'ArrowUp'KeyboardEvent.key that recalls upward; '' disables
downKey'ArrowDown'KeyboardEvent.key that walks newer / restores; '' disables
escapeKey'Escape'KeyboardEvent.key that escapes browsing; '' disables
maxHistory500Maximum recalled entries (newest kept); 0 = unlimited
includeKinds['user']Conversation node kinds admitted into the history (add 'steering' to include steer messages)
historyScope'session'History scope (session / workspace): workspace prepends other listed sessions' user messages before the current session's
persistHistorytrueAppend sent messages to the browser-local store
maxPersisted200Maximum persisted entries; 0 = unlimited
enableSearchtrueEnable the Ctrl+R reverse-search overlay
searchKeys['Ctrl+R']Chord specs opening the search (modifiers Ctrl/Alt/Meta/Shift + a key name); a malformed spec fails the browser fiber loudly
searchCaseSensitivefalseWhether search matching distinguishes letter case
includeCompactionSummariestrueAdmit [compacted] … checkpoint summaries into recall and search
showCompactionNoticetrueShow a transient notice when a compaction checkpoint lands
compactCommandText'/compact'Slash command the notice's "Compact now" action fills into the composer; '' hides the action
enableSnippetstrueEnable the snippet library (/save, /load, search-panel picking)
maxSnippets200Maximum stored snippets; 0 = unlimited
enableTemplatestrueEnable the prompt-template library (variables fill at insertion)
enableInsightstrueEnable the reuse-insight hint (local usage statistics)
insightMinUses2Minimum uses before the reuse hint shows
enableCompactionHighlighttrueBadge [compacted] … summaries distinctly in the search panel

Tools & surfaces

SurfaceKindNotes
ArrowUpkeybindingEdge-first ↑/↓ recall — stashes {draft, caret}, restores both exactly on bottom-out or Esc
Ctrl+RkeybindingReverse-search overlay over merged history, snippets, and templates
/savecommandSave the current draft as a named, tagged snippet
/loadcommandInsert a saved snippet at the caret
templatesUIVersioned JSON backup export/import of history, snippets, templates, and insights (explicit click only)
composer-historysettings formThe profile entry's own live Config form — carries the resolved config (cordis.yml base + profile overrides) into the browser half

Keybindings

KeyStateBehavior
↑IDLE, caret on first linestash {draft, caret}, fill newest entry, caret to end (no history → pass)
↑BROWSING, caret on first lineolder entry; hold at the oldest (intercept, no mutation)
↑caret not on first linefully released (browser moves the caret)
↓IDLEalways released (plain caret movement)
↓BROWSING, caret on last linenewer entry; at newest → restore savedDraft + savedCaret → IDLE
↓caret not on last linefully released
EscBROWSING (restoreOnEscape: true)restore savedDraft + savedCaret → IDLE, intercepted
Escotherwisereleased (menu/popup Escape semantics untouched)
Ctrl+↑/↓enableCtrlAlias: truesame as bare arrows
searchKeys chordcomposer focused, plain phase, no menu/selection/IMEopen reverse search; browsing ends, the shown text becomes the draft
Shift/Alt/Meta+arrows, IME, selectionanyalways released

upKey/downKey/escapeKey/searchKeys rename the keys above; the modifier policy (and the search chord's exact-modifier match) is unchanged. Inside the search overlay: ↑/↓ move the match selection (the selected row scrolls into view), Enter fills, Esc cancels, a click picks, a press outside cancels; matched substrings are highlighted in every row.

Reverse search

  • Open: the searchKeys chord while the composer is focused and the input is plain (a Ctrl+R here also stops the browser's page reload — the key is consumed only inside the composer).
  • Filter: substring match over the merged history (current session + persisted + workspace entries); case sensitivity per searchCaseSensitive; matched substrings are highlighted in each row.
  • Pick: Enter fills the draft and moves the caret to the end — the same single setDraft write path as ordinary recall. Recalled text reaches the model only if you press Enter afterwards.
  • Cancel: Esc or a press outside the panel; the draft is untouched.

Smart input layer

On top of the terminal-style history, three browser-local libraries turn the composer into a reusable input surface. Everything below lives in localStorage (keys dsh.composer-history.snippets.v1, .templates.v1, .insights.v1), never touches the network, and every switch is a Config field.

Snippets (cross-session command library)

/save ship-check --tag=release,ops
check the build, run the smoke suite, tag the release        ← the rest of the draft is the snippet
/save ship-check                                             → "snippet saved: ship-check"
/load ship-check                                             → the snippet fills the composer
Ctrl+R → search panel lists snippets (green badge = name) alongside history
  • /save <name> consumes the Enter, stores the draft (minus the command line) under a kebab-case name with optional tags, and clears the composer. Nothing to save → an error notice, the command never sends.
  • /load <name> inserts the snippet at the caret (whole-draft replace, caret to end) and counts the use.
  • Scope: snippets saved with a workspace cwd are workspace-scoped; snippets saved without one are global. maxSnippets bounds the library; same-name saves replace.
  • The plugin never sends: every fill lands in the ordinary draft and your Enter stays yours.

Prompt templates with variables

Templates are stored prompt texts with {{variable}} placeholders. The search panel lists them with a purple badge; picking one fills the variables from the live session and inserts the result. Built-in variables: {{workspace}} (the session's cwd), {{session}} (the session id), {{draft}} (the current draft). A template referencing an unknown variable fails loudly with the missing list — a half-filled prompt is worse than an error.

The whole library — history, snippets, templates, and insights — exports to and imports from a single versioned JSON document through the panel's Export JSON / Import file actions; see Backup export & import below. An explicit user action; the plugin never writes files on its own.

Reuse insights

Every newly committed user message (and every snippet load) lands one browser-local usage record keyed by exact text. While you type, a small hint under the composer reports used M× in N sessions · 在 N 个会话里用过 M 次 once the draft matches a prompt used in at least insightMinUses (default 2) sessions. Toggle with enableInsights; the statistics contain only the deduped texts and counters.

Compaction summary highlight

Ctrl+R marks [compacted] … summaries with an amber badge (history stays unbadged), snippets green, templates purple — the panel's provenance is visible at a glance. Toggle with enableCompactionHighlight.

Backup export & import

All four browser-local libraries export to and import from one versioned JSON document. The panel's Export JSON / Copy JSON / Import file / Paste JSON actions run entirely in the browser: download or copy to clipboard on export, file pick or pasted text on import — nothing is uploaded and no host RPC or network call is involved.

Document shape

{
  "schemaVersion": 1,
  "exportedAt": 1735689600000,
  "data": {
    "history": ["…"],
    "snippets": [{ "name": "…", "text": "…", "tags": [], "scope": "global", "createdAt": 0, "updatedAt": 0, "useCount": 0, "lastUsedAt": 0 }],
    "templates": [{ "name": "…", "text": "…", "description": "", "updatedAt": 0 }],
    "insights": [{ "text": "…", "sessions": [], "uses": 0, "lastUsedAt": 0 }]
  }
}

Merge & conflict strategy

  • History entries are plain strings and deduplicate by exact text; a duplicate or blank entry is skipped, never overwritten.
  • Snippets and templates key on name; insights key on exact text. On a same-key conflict the newest timestamp wins (updatedAt for snippets/templates, lastUsedAt for insights); an older or equal-timestamp import is skipped, and new keys are appended.
  • The import respects maxPersisted and maxSnippets; templates and insights cap at their fixed protocol limits (500 each).
  • The result notice reports how many records were written and how many were skipped (older/duplicate).

Schema versioning

schemaVersion starts at 1. Imports run a stepwise migration (one version at a time) so future formats can upgrade old documents in place. A document whose schemaVersion is newer than the one this build understands is rejected with an error — it is never silently dropped or partially merged; a version too old to migrate is rejected the same way.

Sliding context

The harness core gives every dsh session a sliding context window, the same workflow Claude Code and Codex ship: when a conversation approaches the model's context limit (or the provider reports an overflow), the harness auto-compacts — older turns are summarized behind a compaction checkpoint marker that stays visible in the transcript, the model keeps only the summary plus the recent tail, and the session continues. /compact triggers the same compaction on demand, and the marker renders as an expandable "Context compacted" row.

dsh-composer-history plugs the composer into that workflow so the window slide never costs you your typing history:

  • Recall survives compaction — shadowed turns stay in the finalized conversation the Chat view publishes, so ↑ still walks every message you sent before and after a checkpoint.
  • Summaries join the history — each checkpoint's summary text enters ↑ recall and Ctrl+R search as a [compacted] … entry (toggle: includeCompactionSummaries), so context the model no longer sees verbatim stays one keystroke away.
  • Compaction notice — when a checkpoint lands while the page is open, a transient snackbar announces it (the Claude Code "Auto-compacting conversation…" moment) with the summary snippet and a one-click Fill /compact action (showCompactionNotice, compactCommandText); the fill lands in the ordinary draft, and only your Enter sends it.
  • Search counts — the Ctrl+R panel now shows a live N entries / N matches status line, and long entries are clamped to two lines.

Compaction itself (thresholds, summary model, /compact) is owned by the harness core's compaction plugins — this plugin only observes the checkpoint markers the Chat view's conversation projection already publishes (uiConversation.binding(id).target('chat').legacy.nodes), so it works without any agent-loop or model-request changes.

Permissions & data

  • Permissions: the plugin declares browser:local-storage in its workshop manifest — nothing else. No network, no subprocesses, no session events.
  • Data: four browser-local localStorage keys — dsh.composer-history.v1 (sent-message history), dsh.composer-history.snippets.v1 (snippet texts + tags + use counters), dsh.composer-history.templates.v1 (template texts), and dsh.composer-history.insights.v1 (deduped prompt texts + per-session use counters). All bounded, same-origin only, never uploaded; corrupt payloads reset silently.
  • Model-visible ⟺ you press Enter: recalled text, snippet loads, template fills, and the /compact fill all land in the ordinary composer draft. Nothing reaches the model until you press Enter.

Security boundaries

  • UI-only, never enforcement. The plugin edits the composer draft only; the sandbox, approval, and session systems remain the enforcement authorities, and no command or tool is ever claimed or bypassed.
  • No content leaves the browser except an explicit export. History, snippets, templates, and insights live in localStorage; nothing is uploaded, and no model request or network call is made. The versioned backup export only writes a local download or the clipboard on an explicit click.
  • Fail loud. Invalid enum values fail the whole dsh boot; a malformed search chord fails the browser fiber — misconfiguration never silently degrades.
  • Bounded everything. maxHistory, maxPersisted, and maxSnippets cap retained entries; corrupt or foreign payloads reset silently.
  • Zero side effects on pass-through. The plugin intercepts only in the plain input phase and yields to the slash menu, command popups, IME composition, text selections, and modifier combos.

Known limitations

  • Composer DOM face. Interception anchors on host-private DOM: the contenteditable div[data-composer-input] inside [data-input-scroll] (harness 0.1.2-alpha.5 / 0.1.2-rc.1 and later); the legacy textarea composer inside [data-input-scroll] (lines up to 0.1.1-rc.2) stays matched. This shape is not a published API (upstream proposal C3 records that plugins can only guess host DOM), so a future host DOM change can break interception silently — the compat workflow's jsdom smoke re-asserts the face against the packed bundle.
  • Logical vs visual lines. Default logical keys off \n (a long auto-wrapped message counts as one line); visual measures real wraps via a hidden mirror that copies the contenteditable surface's computed box (O(lines·log n) binary search per edge check, memoized per draft/width). Mirror measurement needs a real layout engine — the pure span math is unit-tested instead, and measured spans on the Lexical composer stay best-effort (logical remains the default).
  • Persisted history is per-browser. The store lives in one origin's localStorage; it never syncs between browsers or machines. Corrupt payloads reset silently.
  • Undo stack includes recall transactions. Every fill/restore is one setDraft transaction in the input machine's undo log; Ctrl+Z steps back through recalls. The precision fix needs the upstream edit-range exposure.
  • Recalling a /xxx entry then Enter follows the normal command claim/adjudication path (expected, and Enter is never intercepted).
  • Menus/popups and non-plain phases always win; a committed send and session switches both reset to IDLE.
  • Reference chips (U+FFFC placeholders) ride along with recalled/restored draft text.
  • historyScope: 'workspace' reads the Chat targets of other listed sessions; a session whose Chat view has not been activated in this page contributes nothing yet.
  • The search overlay is plain DOM (no React dependency); it renders all matches up to the maxHistory bound.
  • Compaction awareness is observational. Checkpoints landed before install (or before a session switch) never trigger a notice; a checkpoint whose summary event fell outside the loaded window contributes no [compacted] … entry (summary: null).
  • The notice's "Compact now" action only fills the configured command text into the draft — sending remains the user's Enter.
  • Snippets, templates, and insights are browser-local. Names are kebab-case (1..64 chars); tags cap at 8 × 32 chars. Template variables resolve from the live session; {{draft}} is the draft at pick time.

Development

pnpm install           # node ^22.19 || >=24
pnpm run build         # tsc build + tsdown bundle (lib/)
pnpm run typecheck     # tsc --noEmit (src + tests)
pnpm test              # vitest run
pnpm run test:watch    # vitest watch
pnpm run test:coverage # vitest run --coverage
pnpm run check:readmes # README consistency gate
pnpm run verify:pack   # pack-surface check

Topics

deepseek-harness · dsh · dsh-plugin · web-gui · input-history · keyboard-shortcuts · compaction · sliding-context · typescript

Contributors

  • @PerryLink — creator and maintainer: edge-first arrow recall, persisted history, reverse search, sliding-context awareness, snippet library, prompt templates, reuse insights, and the dsh.bundle / dshWorkshop manifests.

PerryLink DSH Plugin Family

This project is one of the 33 actively maintained DeepSeek Harness plugins from PerryLink — the roster is 42, of which 6 are frozen and 3 retired; every one keeps its row below, with the reason in the Status column. If this one helps you, the others likely will too:

PluginOne-linerStatus
dsh-auto-reviewSecond-model auto-review on the approval chain, fail-closed by default
dsh-autotierAutomatic strong/cheap model-tier routing with deterministic risk guards and a /tier command
dsh-background-agentsDurable background child agents with a Web UI sidebar, messaging and interrupt🚫 RETIRED — see the note above
dsh-budgetCost governance for DeepSeek Harness: budgets, carbon, and latency in one panel.🧊 FROZEN — see the repo README
dsh-catalogDSH Desktop Market standard catalog source for the PerryLink family
dsh-cert-mcpRead-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence
dsh-checkpoint-rewindClaude Code /rewind-equivalent: snapshots, session forks, one-shot restore
dsh-claude-moveMigrate Claude Code sessions, memory, skills and CLAUDE.md into DSH🧊 FROZEN — see the repo README
dsh-clickCross-platform native desktop control for DeepSeek Harness — Windows first.
dsh-composer-historyTerminal-style input history for the web composer: arrows, Ctrl+R search
dsh-data-qualityDataset quality checks and citation cross-checks (the optional numeric bridge consumed here)
dsh-defendPrompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness.🧊 FROZEN — see the repo README
dsh-doublecheckEngineering-discipline guard: requirements grill, test gates, adversary review
dsh-drawUnified static-image generation routing for DeepSeek Harness.🧊 FROZEN — see the repo README
dsh-fastRead-only performance diagnostics for DeepSeek Harness.
dsh-fund-researchDeterministic research reports for Chinese public mutual funds
dsh-githubGitHub PR/issues integration for DSH, every write gated by approval
dsh-industry-researchIndustry research orchestration that seals its deliverables through this plugin's ctx.researchReport.assemble
dsh-layaLaya typed decisions (noul/choice/score) as a first-class Cordis service and model-visible tools
dsh-libraryLocal document knowledge base for DeepSeek Harness.
dsh-local-aiLocal-model (Ollama) integration for DeepSeek Harness.
dsh-lsp-actionsLSP diagnostics, formatting, completion, code actions and rename over language servers
dsh-maskPII masking middleware: anonymize at the model boundary, restore at the display layer
dsh-mcp-panelRead-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors
dsh-mementoApproval-gated cross-session memory: ctx.memory seam + SQLite + memory tool🧊 FROZEN — see the repo README
dsh-observeOpenTelemetry and Langfuse observability exporter for DeepSeek Harness.
dsh-output-stylesClaude Code outputStyles-equivalent runtime style switching
dsh-permission-rulesClaude Code-style declarative allow/deny/ask permission rules with audit
dsh-plugin-certificationCommunity certification registry with repro-checkable grades and badges
dsh-plugin-doctorZero-dependency static + sandbox smoke detector for DSH plugins
dsh-plugin-guidePlugin-development knowledge base as an on-demand agent skill
dsh-plugin-kitShared zero-runtime-dependency toolkit for the PerryLink DSH plugins
dsh-plugin-upgradeOne-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card
dsh-plugin-upgrade-015Merged 0.1.3-alpha.1 → 0.1.5-rc.1 upgrade corridor card plus a zero-dependency seam scanner🚫 RETIRED — corridors carried by dsh-plugin-upgrade
dsh-reachMulti-channel approval/question bridge: WeChat/Telegram/Feishu, session console🧊 FROZEN — see the repo README
dsh-research-reportVerifiable research-report engine: content-addressed evidence ledger and sealed versions
dsh-scoreMulti-dimensional quality scoring for DeepSeek Harness plugins.
dsh-session-pinPin sessions in the Web sidebar with durable ordering🚫 RETIRED — see the note above
dsh-session-syncCross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store.
dsh-skill-pack-securitySecurity-audit skill pack: secret scan, dependency and supply-chain review
dsh-talkVoice-first session loop for DeepSeek Harness: talk to it, hear it answer.
dsh-team-roomsCross-session team rooms: shared message bus, task board and timeline🚫 RETIRED — see the note above
dsh-test-driveIsolated install-and-smoke test drives for DeepSeek Harness plugins.
dsh-ticktickTickTick/Dida365 task bridge: session-header panel + 11 tools
dsh-translateVendor parameter translation and deterministic JSON repair for DeepSeek Harness.

Install from the DSH Desktop Market

All PerryLink plugins are browsable in the built-in DSH Desktop Market: Market → Sources → add source → paste https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → select it. Installation still goes through the Market's npm-identity verification and your confirmation.

License

Apache License 2.0 © 2026 dsh-composer-history contributors

Comments

0
Newest first