Shared toolkit for authoring DeepSeek Harness plugins, published as @perrylink/dsh-plugin-kit: a pluggable provider registry seam, fail-closed approval and session-event gates, shared sanitize/pricing/judge modules and a new-plugin skeleton.
Install
# from npm (prebuilt)
dsh plugin --profile web add @perrylink/dsh-plugin-kit
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:PerryLink/dsh-plugin-kit
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
- 1024 store channel:
npm i -g dsh1024once, thendsh1024 plugin --profile web add @perrylink/dsh-plugin-kit(counts toward the deepseek1024.com install ranking).
English | 简体中文 | Español | Português | हिन्दी
Shared zero-runtime-dependency toolkit for the PerryLink DSH plugin repositories. The per-project audit found 20+ of the 33 plugins hand-rolling the same Provider seam and duplicating the same sanitize/pricing/verdict shapes, so this package extracts all of it — the pluggable Provider seam, the fail-closed approval and adaptive session-event gates, the mechanical verify scripts, and the shared sanitize/pricing/judge pure modules — into one ESM + TypeScript package.
Compatibility
- DSH harness: the kit imports nothing from
@deepseek-ai/*at runtime.@deepseek-ai/cordis(^4.0.2),@deepseek-ai/schemastery(^3.18.2), and the@deepseek-ai/dsh-*packages are optional peer dependencies in the>=0.1.2-rc.1 <0.2.0band the PerryLink plugin repos share; they exist only for type interop. Verified 2026-09-11 against the dsh-v0.1.5-rc.2 master checkout (full gate chain + profile install smoke). - Node:
^22.19.0 || >=24.0.0, ESM only. - Wire compatibility: names and shapes mirror
dsh-mask(sanitize),dsh-budget(pricing), anddsh-auto-review(judge and thefallbackPolicyvocabulary), so migration is mechanical.
What you get
- Zero runtime dependencies — the pure core (
seam,gates,shared) is browser-safe. - ESM + strict TypeScript — JSDoc contracts on every module;
strict,noUncheckedIndexedAccess,exactOptionalPropertyTypes. - Fail-closed and adaptive gates — approval never defaults to a grant; session-event appends degrade gracefully on hosts that reject unknown event types.
- A new-plugin skeleton —
template/withcordis.yml, a three-rolesrc/index.ts(Service Definition / Provider / Consumer), a test, and the shared Renovate preset.
Quick start
From npm:
pnpm add @perrylink/dsh-plugin-kit
From git (the prepare script builds lib/ using only production
dependencies):
pnpm add github:PerryLink/dsh-plugin-kit
Replace a hand-rolled registry in one step:
import { ProviderRegistry } from '@perrylink/dsh-plugin-kit/seam'
const registry = new ProviderRegistry<Detector>({
default: { name: 'regex', impl: new RegexDetector() },
})
ctx.effect(() => registry.register('ner', new NerDetector()))
const active = registry.use('ner') ?? registry.use()
Install & uninstall
As a library, install is pnpm add (see Quick start). The package also ships an
intentionally empty dsh.bundle.patch layer (cordis.patch.yml), so it flows
through the harness bundle channel when a profile wants the kit mounted as a
package:
# npm channel (published releases)
dsh plugin --profile web add @perrylink/dsh-plugin-kit
# git channel (latest master)
dsh plugin --profile web add "github:PerryLink/dsh-plugin-kit#master"
Remove with:
pnpm remove @perrylink/dsh-plugin-kit
Nothing registers global state: uninstall is exactly the reverse of install.
Configuration
No runtime configuration: the gates and helpers are pure functions. The only
configuration surface is cordis.patch.yml, the bundle-patch layer shipped
for harness profile composition; it mounts no plugin row (the kit is a
library) and documents how consuming plugins add their own rows.
Tools & surfaces
| Subpath | Purpose |
|---|---|
seam |
ProviderRegistry<T> — reversible, fail-loud named provider registry. |
gates |
applyFailClosed; makeEventGate / maybeAppendSessionEvent / probeIgnorableAppend. |
shared |
sanitize (Stripper, redactText, redactMapping, sanitizeText, sanitizeUrl), pricing (BUILTIN_PRICES, estimateUsageCost, tokenCarbon, latencyStats, formatMoney, formatTokens), judge (parseVerdict, VERDICT_SCHEMA, riskExceeds). |
verify |
Mechanical CI gates (verify-license, verify-readme-languages, verify-seam) with a VerifyReport and a non-zero-exit CLI: node lib/verify/cli.js all . |
template/ |
New-plugin skeleton (cordis.yml, three-role plugin, test, README, renovate.json5). |
| root barrel | Re-exports all of the above. |
Permissions & data
The kit performs no I/O, no network access, and no subprocess spawns on its
own. Stripper keeps placeholder→original mappings in memory only, and
stats()/redactMapping() never emit plaintext; a consumer that persists a
mapping owns that decision and its storage permissions.
Security boundaries
sanitize/redact*are display hygiene, not a security boundary: they reduce leakage into logs and results, they do not authenticate or authorize.- Approval gates are fail closed by default (
rejected); the only grant path is an explicitallow-onceopt-in. - Session-event appends the host refuses are skipped, never retried in a way that could break session resume.
- Report vulnerabilities via GitHub Security Advisories — see
SECURITY.md.
Known limitations
- Hosts whose
Session.appendthird argument is aSurfaceIntent(0.1.2-rc.1) throwvalidateNexton the ignorable-envelope probe; the gate degrades to skip-unknown, so audit events are dropped (fail closed) rather than logged on those hosts. - 0.1.2-rc.1 (adapted 2026-09-02): 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.
- The kit ships no browser UI half; it is a library consumed by the Host (and optionally Client) halves of other plugins.
Development
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm run typecheck:ci # CI face: tsc -p tsconfig.ci.json --noEmit
pnpm test # vitest unit tests
pnpm run build # emit lib/ + declarations (also run by prepare)
pnpm run verify:self-contained
pnpm run verify:artifacts
Topics
This repository is also the maintenance hub for the 33 plugin repos:
scripts/sync-peer-range.mjs re-pins the shared peer band across all repos in
one command, renovate/default.json5 is the shared Renovate preset every repo
extends, .github/workflows/npm-publish.yml is a reusable tag-triggered
publish workflow (needs only an NPM_TOKEN secret), and data/repos.json is
the ecosystem registry consumed by the portal. See
docs/ecosystem-tooling.md.
Keywords: dsh, dsh-plugin, deepseek-harness, deepseek, cordis, perrylink, provider, seam, approval, sanitize, pricing, judge.
Contributors
Maintained by PerryLink with contributions from the DSH plugin ecosystem.
PerryLink DSH Plugin Family
This project is one of the 41 DeepSeek Harness plugins maintained by PerryLink. If this one helps you, the others likely will too:
| Plugin | One-liner |
|---|---|
| dsh-auto-review | Second-model auto-review on the approval chain, fail-closed by default |
| dsh-autotier | Automatic strong/cheap model-tier routing with deterministic risk guards and a /tier command |
| dsh-background-agents | Durable background child agents with a Web UI sidebar, messaging and interrupt |
| dsh-budget | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. |
| dsh-catalog | DSH Desktop Market standard catalog source for the PerryLink family |
| dsh-cert-mcp | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence |
| dsh-checkpoint-rewind | Unified session + workspace + config checkpoints with one-shot /rewind |
| dsh-claude-move | Migrate Claude Code, Codex, OpenCode and Hermes sessions, memories and skills into DSH |
| dsh-click | Cross-platform native desktop control for DeepSeek Harness — Windows first. |
| dsh-composer-history | Terminal-style input history for the web composer: arrows, Ctrl+R search |
| dsh-data-quality | Deterministic dataset profiling, cleaning and citation verification |
| dsh-defend | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. |
| dsh-doublecheck | Engineering-discipline guard: requirements grill, test gates, adversary review |
| dsh-draw | Unified static-image generation routing for DeepSeek Harness. |
| dsh-fast | Read-only performance diagnostics: load, spill, compaction and cache hit rate |
| dsh-fund-research | Chinese mutual-fund research with sealed, traceable source snapshots |
| dsh-github | GitHub PR/issue/CI integration with every write approval-gated |
| dsh-industry-research | Industry and company research pack: chain map, policy timeline, company cards |
| dsh-kit | One-command starter pack that installs the core family |
| dsh-library | Local document knowledge base with hybrid search and citation-aware injection |
| dsh-local-ai | Local Ollama model discovery and task-based routing with cloud fallback |
| dsh-lsp-actions | LSP diagnostics, formatting, completion, code actions, symbols and rename |
| dsh-mask | PII masking at the model boundary with a host-side restore table |
| dsh-mcp-panel | MCP management console: /mcp command, Settings tab and trial calls |
| dsh-memento | Approval-gated cross-session memory protocol (ctx.memory + SQLite) |
| dsh-observe | OpenTelemetry and Langfuse telemetry export from the session event stream |
| dsh-output-styles | Runtime-switchable model output styles |
| dsh-permission-rules | Declarative allow/deny/ask rules plus a process-level network policy |
| dsh-plugin-certification | Community certification registry with repro-checkable grades and badges |
| dsh-plugin-doctor | Zero-dependency static + sandbox smoke detector for DSH plugins |
| dsh-plugin-guide | Plugin-dev knowledge base, agent skill and the dsh-plugin-dev CLI toolchain |
| dsh-plugin-portal | Zero-dependency static portal rendering the whole plugin family as one page |
| dsh-plugin-upgrade-015 | Merged 0.1.3-alpha.1 → 0.1.5-rc.1 upgrade corridor card plus a zero-dependency seam scanner |
| dsh-reach | Multi-channel approval/question bridge: WeChat, Telegram, Feishu + a session console |
| dsh-research-report | Verifiable research reports: evidence ledger, manifest seal, per-claim verdicts |
| dsh-score | Multi-dimensional plugin quality scoring with an evidence-backed leaderboard |
| dsh-session-pin | Pin sessions and workspaces in the Web sidebar with per-pin colors |
| dsh-session-sync | Git-backed cross-device session synchronization with keep-both merges |
| dsh-skill-pack-security | Security-audit skill pack plus the plugin_vet supply-chain gate |
| dsh-talk | Voice-first session loop: speech-to-text input and text-to-speech replies |
| dsh-team-rooms | Cross-session team rooms: shared message bus, task board and timeline |
| dsh-test-drive | Isolated install-and-smoke test drives with a pass/fail matrix |
| dsh-ticktick | TickTick/Dida365 task bridge: session-header panel plus eleven agent tools |
| dsh-translate | Vendor parameter translation and deterministic JSON repair |
| dsh-wechat | WeChat ↔ DSH bridge (Tencent iLink bot) developed with pan17, who hosts the repo |
| dsh-personal-directive | Personal directive injector with a top-bar toggle (fork of liucai2026/dsh-personal-directive) |
License
Apache-2.0 — see LICENSE.
Links
More in this category
yjh051108/dsh-routing-suite★ 7199
One repository, three parts: a runtime injector for DSH plugin packages (inject, hot-reload, unload, promote a dev staging tool to the front, route self-heal, plus a settings-page plugin manager that lists, unloads and drags folders in to internalize), a task-aware reasoning-mode router agent preset (router-standard / router-spec / router-react), and a graded two-level task protocol whose six tools (commit_star, lock_stage, revise_do, edit_plan, mark_task, redteam_verdict) pin task state to disk. The injector implementation ships in-tree, so the install carries its own behaviour rather than a dependency list.
strukto-ai/mirage#dsh★ 3642
Swaps the filesystem and bash providers for a mirage virtual workspace: file tools and shell commands run over mounted resources (RAM, S3, Redis, Slack, Gmail, Notion, Postgres) instead of the host disk, with per-mount read/write/exec modes, per-command sandbox routing (monty, pyodide, quickjs in process; docker, e2b, daytona remote), and installed CLIs (git, gh, slack, linear, ntn, gws, or one you register) as head words in the virtual terminal.
hust-open-atom-club/oh-dsh★ 318
Community distribution: TUI, desktop, and Web UI as one bundle with layered installation.
weijiafu14/pi2dsh★ 199
Pi Host ABI compatibility engine: after one install, unmodified Pi extensions from npm mount as native DSH plugins with `dsh plugin add <pi-package>`. Verified end to end on stock DSH with pi-mcp-adapter (full MCP manager: OAuth, resources, prompts, MCP Apps, elicitation, sampling), @tintinweb/pi-subagents, pi-code, pi-hermes-memory and pi-background-tasks; `pi2dsh inspect` reports a package's compatibility before installing.
lire1131/dsh-undo-savepoint★ 160
Undo/redo & rollback system for DSH: every config change is auto-snapshotted; undo/redo/restore to any version from the WebUI or the offline CLI/GUI tools (works even when DSH fails to boot).
Fishquito7/dsh-skill-mcp-panel★ 136
Manages DSH skills and MCP servers from the web settings: skill cards with hot enable/disable, workspace scopes, groups, batch migration and drag-and-drop import, plus stdio/HTTP MCP CRUD with connection tests, secret redaction and the unified dsh-panel CLI.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.