DeepSeek Harness Plugin

PerryLink/dsh-talk

Stars ★ 15 Downloads (30d) 4,021 Category Voice & Audio Added 2026-09-03 npm dsh-talk

Voice I/O for DeepSeek Harness — speech-to-text and text-to-speech over the microphone and audio output.

Install

# from npm (prebuilt)

dsh plugin --profile web add dsh-talk

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:PerryLink/dsh-talk

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

This plugin publishes its README in Chinese only.

🎙️ dsh-talk

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

Voice-first session loop for DeepSeek Harness: talk to it, hear it answer.

Press the mic, speak, and the reply is spoken back — with speak-to-interrupt.

dsh-doctor DSH Market

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

dsh plugin --profile <name> add dsh-talk

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

Install & uninstall

  • git channel (latest main): dsh plugin --profile web add github:PerryLink/dsh-talk — the prepare script builds with production dependencies only.
  • npm channel (published releases): dsh plugin --profile web add dsh-talk.
  • tarball channel: pnpm pack in this repo, then dsh plugin --profile web add ./dsh-talk-<version>.tgz.
  • uninstall: dsh plugin --profile web remove dsh-talk (or remove the row from the profile patch).

If pnpm reports ERR_PNPM_IGNORED_BUILDS for this package (esbuild's harmless platform-binary validation), add allowBuilds: { esbuild: true } to your pnpm-workspace.yaml — the dsh CLI prints the exact snippet.

⭐ 如果它帮到了你

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

English: part of a 95 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-talk?

Voice-first session loop for DeepSeek Harness: talk to it, hear it answer.

Press the mic, speak, and the reply is spoken back — with speak-to-interrupt.

Terminal demo of dsh-talk: dsh-talk — install, verify the row, then talk to the session

Animated terminal demo of dsh-talk

The same run, animated.

Compatibility

Surface Status
Harness DeepSeek Harness dsh-v0.2.1-alpha.1 (adapted 2026-09-24: third peer clause + engines.dsh + manifestVersion: 1, and the monthly Compat workflow anchored to that line); full gate chain green on 2026-09-24 (dual typecheck rulers, 86 tests, build, self-contained, artifacts, pack). npm dev/test line 0.1.7-rc.2, peers `>=0.1.2-rc.1 <0.2.0
Node ^22.19.0 || >=24.0.0
Browser Web Speech + MediaRecorder (Chrome/Edge best); host transcription/TTS engines for the rest

What you get

dsh-talk closes the voice loop in both directions:

  • speak tool — the agent speaks its replies aloud. TTS engines: the browser voice, edge-tts (network neural voices), or piper (local). Audio plays in the browser; with a local engine it is also written to a file and the tool result carries the absolute path (audioPath) for other tools to consume; on hosts that can carry it, the session log records the sanitized utterance (see Security boundaries).
  • Composer mic button — press it, speak, and the transcription lands in the input box (or submits directly). STT engines: the browser's Web Speech (interim results included), a FunASR HTTP server, or local whisper.cpp.
  • Speak-to-interrupt — starting to talk stops whatever is playing (client → host over the talk Remote namespace).
  • Event announcements — turn completion, pending approvals (waterfall-safe: never blocks the gate), and errors, with a mute switch and configurable phrases.
  • Settings tab — engine/language selects and announcement switches, saved as append-only profile-patch operations with backups.
browser                                host
  🎙 press ──▶ interrupt ─────────────────▶ talk/interrupt
  record (MediaRecorder / Web Speech)
  transcribe (browser) or talk/transcribe ─▶ FunASR / whisper.cpp
  setDraft(text) or submit()  ◀── talk:speech projection ── speak tool / announcements
  ▶ play audio (talk/audio or speechSynthesis)

Quick start

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

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

# 2. restart and verify the row
dsh --profile web --dump-config | grep -A2 'id: talk'

Then press the microphone next to the composer and talk; ask the agent to speak its reply:

> Say "hello" with the speak tool.

Remote browsers need a secure origin

The browser microphone (getUserMedia / Web Speech / MediaRecorder) only works in a secure context: https://… or http://localhost / http://127.0.0.1. A plain http://<LAN-IP>:3081 page — including Safari on another machine — will not expose the microphone, even if the Talk settings are correct.

For a remote browser, use one of:

  • open the Web UI through an HTTPS reverse proxy or tunnel;
  • SSH-forward the port and open http://localhost:<port> on the client;
  • keep the UI on the same machine as the browser.

stt.engine: funasr / whisper changes where transcription runs, not the browser capture permission; recording still needs the secure context.

Configuration

All tunables are Schemastery Config fields (changeable from cordis.yml). cordis.patch.yml documents each key inline.

Key Default Meaning
record.enabled true Show the composer mic button
record.hotkey (none) Optional toggle hotkey, e.g. "alt+r"
record.maxSeconds 60 Recording cap in seconds (1..600)
record.autoSubmit false Submit the transcription as a user message (false = fill the draft)
record.vad.enabled / silenceMs / energyThreshold true / 1500 / 0.01 Voice-activity detection: silence auto-ends the recording (degrades when AudioContext is absent)
stt.engine auto auto / web / funasr / whisper; auto prefers a configured local engine, then Web Speech
stt.language auto BCP-47 language or auto
stt.interim true Show interim transcriptions (Web Speech)
stt.silenceFinaliseMs 4000 Stop continuous Web Speech recognition after this many milliseconds without speech (500..15000)
stt.funasr.url (none) FunASR inference endpoint; required when the engine is funasr
stt.whisper.modelPath (none) whisper.cpp model; required when the engine is whisper
tts.engine auto auto / browser / edge-tts / piper; auto prefers piper, then edge-tts, then the browser voice
tts.rate 0 Rate offset in percent (-50..50) for edge-tts/piper
tts.fallbackToBrowser true Fall back to the browser voice when a local engine fails
tts.browser.voiceName (none) Preferred browser voice name; an unknown name uses the platform default
tts.browser.rate 1 Browser SpeechSynthesis rate (0.1..10)
tts.browser.pitch 1 Browser SpeechSynthesis pitch (0..2)
tts.piper.modelPath (none) piper voice model; required when the engine is piper
tts.export.enabled true Write locally synthesized audio to a file and return its path as audioPath
tts.export.dir <home>/.dsh-talk/audio Export directory; ~ = home, a relative path resolves under home (never the workspace)
tts.export.maxFiles 20 Files retained in the export directory, counting the one just written (1..1000)
tts.export.maxAgeMinutes 1440 Exported files older than this many minutes are pruned on the next write (1..10080)
announce.enabled true Master switch for event announcements
announce.onTurnEnd / onApproval / onError true Which events are spoken
announce.messages.* "Turn complete." etc. Spoken phrases
interrupt true Talking stops current playback
maxSpeakChars 20000 Cap on the speak tool's text length (1..100000)
maxAudioCacheBytes 8388608 In-memory synthesized-audio cache cap (1 MiB..64 MiB)

stt.silenceFinaliseMs and record.vad.silenceMs are separate mechanisms: the first finalises the Web Speech transcript when continuous recognition hears no speech, the second is the MediaRecorder energy-based detector that ends the recording (and submits it when record.autoSubmit is on). They run in different pipelines and share no state.

Audio file export

Every utterance synthesized by a local engine (edge-tts, piper) is written to a file in addition to the in-memory cache the browser plays from. The browser engine synthesizes on the client and therefore exports nothing — that state is reported explicitly, never silently.

  • Where: tts.export.dir, default <home>/.dsh-talk/audio — the plugin's own directory. It is deliberately never the host's working directory, so a repository is never polluted; a relative tts.export.dir is resolved under the home directory for the same reason.
  • Names: speech-<YYYYMMDD>T<HHMMSS>Z-<8 hex>.mp3 (edge-tts) or .wav (piper). The stamp is UTC so names sort chronologically, and the token comes from the utterance id, so a file maps back to its dsh-talk/speech log entry. The spoken text is never part of a file name.
  • Cleanup: bounded on every write, age first and count second. Files older than tts.export.maxAgeMinutes (default 1440 = 24 h) are removed, then the oldest files are removed until the directory holds at most tts.export.maxFiles (default 20, counting the file just written). Pruning only ever unlinks names matching this plugin's own speech-… pattern, so other files in a shared directory are never touched. With the defaults the directory holds at most 20 files (~a few MB) and nothing older than a day.
  • Failure: exporting is an addition to speech, never a precondition. If the directory cannot be created or written, the utterance still plays and the result reports audioExport: "failed" with the reason; pruning failures are ignored and retried on the next write.
  • Model-visible path: the speak tool's canonical value carries audioPath (plus audioExport and, when there is no file, exportNote), and the same path is in the rendered result text — so the agent can pass it straight to another tool that takes a file, for example a messenger plugin's file argument. Event announcements (turn end, approval, error) are synthesized through the same pipeline and are exported the same way; they are bounded by the same caps.
  • Handing the file to another plugin: a consumer that only accepts files inside its own workspace — dsh-wechat's send_wechat refuses a file_path outside the calling session's workspace unless its own allowAnyFilePath setting is on — will reject a path under your home directory. For that flow, point tts.export.dir at a directory inside that workspace (for example <workspace>/.dsh-talk-audio); the default stays outside every repository on purpose.

Tools & surfaces

Surface Kind Notes
speak tool Speaks text aloud (browser/edge-tts/piper); per-call engine/voice overrides; canonical JSON outcome
mic button conversation.input.left slot Record → transcribe → fill draft (or submit); speak-to-interrupt on press
settings tab settings.plugins.tab (id talk) Engine/language/announcement switches; append-only save
talk:* Typert Remote status, audio, transcribe, applySettings, interrupt (host namespace)

Permissions & data

  • Permissions: the plugin keeps an in-memory, byte-capped audio cache for playback and, for local engines, writes the synthesized audio to its own bounded directory (tts.export.*, default <home>/.dsh-talk/audio, at most 20 files and 24 h old by default); microphone permission is browser-mediated. The settings tab only appends patch fragments to the profile with a timestamped backup — never rewrites the file.
  • Data: audio bytes never enter the model context or the session log. Where the host's session vocabulary accepts it, the dsh-talk/speech event carries the utterance id, engine, reason, size, sanitized text, and browser voice/rate/pitch when applicable; on envelope-less hosts the event is not written at all. The speak tool result carries the exported file's path (a persistent artifact in the plugin's own directory), and everything else on a display/log surface passes the redaction helpers, so credentials, JWTs, bearer headers, and temp paths stay out.
  • Network: only the engines you configure are contacted. edge-tts performs network synthesis, FunASR uses its configured endpoint, and Chrome's webkitSpeechRecognition sends microphone audio to Google's servers for transcription; browser speechSynthesis playback remains local.

Security boundaries

  • Model-visible ⟺ logged — the model sees only the speak tool's canonical value and render text. The dsh-talk/speech event is appended only when the host can carry it (see Host compatibility); the tool/call + tool/result events always remain the reconstructable trail.
  • Approval announcements never block — the approval/request listener always calls next().
  • Sanitized output — credentials and temp audio paths never reach logs or displays. The one deliberate exception is the exported audio path in the speak result, which is a persistent file in the plugin's own directory (still passed through the secret redactor) and is meant to be handed to another tool.
  • Host compatibility — the dsh-talk/speech event is appended through a yes/no gate. Hosts whose known-type vocabulary covers the event append it, and the call reports that it did; every other host — every released line through 0.1.1-rc.2, the 0.1.2-alpha line, 0.1.2-rc.1, and also 0.1.6-alpha.2, whose Session.append can stamp only the surface intent and not the ignorable envelope (that field is retained for stored-log read compatibility only) — gets no append, so speech can never pollute the session log there. The skip is not silent any more: the host keeps per-session appended/skipped counters and talk/latest(sessionId) reads them back, the client's session-scoped playback list stays empty, and the speak tool results remain the reconstructable audit trail.
  • Fail loud — invalid engines, out-of-range values, and engines configured without their required model/endpoint fail the mount.

Known limitations

  • Browser support: Web Speech and MediaRecorder are feature-detected; without them the mic button disables itself and host engines (FunASR/whisper.cpp) can still transcribe when configured.
  • Local engines are your install: edge-tts, piper, and whisper.cpp executables and models must be installed separately.
  • Audio files need a local engine: the browser voice synthesizes on the client, so speak returns no audioPath there (the result says so explicitly), and a local engine that fails and falls back to the browser also has no file. Exported files live in the plugin's own bounded directory — see Audio file export for the location, naming, and cleanup rules.
  • Recording format: the browser records with its native MediaRecorder codec; whisper.cpp may require a WAV-configured recorder or a server-side conversion for other formats.
  • Settings apply on reload: the settings tab appends to the profile patch; a profile reload (or web-app restart) activates the changes.
  • Live playback history is empty on hosts without the vocabulary: on 0.1.1-rc.2, the 0.1.2-alpha line, 0.1.2-rc.1, and 0.1.6-alpha.2 the host vocabulary does not know dsh-talk/speech, so the gate writes nothing and the client's session-scoped playback list stays empty; talk/latest(sessionId) still answers with the newest utterance and the skipped counter. Speech itself, the mic, the settings tab, and the tool are unaffected.
  • Legacy logs written by dsh-talk ≤ 0.2.1 may need repair before cold load: versions through 0.2.1 appended unmarked dsh-talk/speech events. On hosts 0.1.0-rc.7 and newer, a session whose log already contains them fails its next cold load with SessionFormatUnsupportedError. Repair: stop the host, back up the session's .jsonl log, add "ignorable":true as a top-level member of every JSON line whose "type" is "dsh-talk/speech" (for example, insert "ignorable":true, right after the opening {), then reopen the session. Nothing else changes and nothing is lost; new appends from this version never add unmarked events.

Development

pnpm install        # node ^22.19 || >=24
pnpm run typecheck  # tsc: src + tests against the local harness checkout
pnpm run typecheck:ci  # tsc against the published 0.1.7-alpha.2 types (no paths)
pnpm test           # vitest: 108 tests, 16 suites
pnpm run build      # tsc declarations + tsdown bundles (lib/)
pnpm run verify:self-contained  # dependency specs resolve from the registry
pnpm run verify:artifacts       # built ESM faces + client ModuleLoader handshake
pnpm pack           # the published tarball

Interoperability with other DSH plugins

Verified against DSH 0.2.0-rc.2 (the runtime this README ships for) and the high-star plugin set surveyed on 2026-10-05.

This plugin does not interfere with other plugins, including the widely installed high-star ones:

  • No tool-name collision. Every tool is namespaced; no bare name owned by a shipped tool or another plugin is registered.
  • No service-key collision. It provides talk; that key is not a built-in seam and is not provided by any surveyed high-star plugin.
  • No slot collision. It registers no client slot key, so it cannot contend for a shadows-shipped-ui seat.
  • No HTTP route collision. It registers no webServer prefix.
  • No patch-layer collision. The bundle patch only inserts its own row; it never overrides a built-in row's config.
  • No global mutation. It does not patch prototypes, rewrite process.env, or replace the global fetch dispatcher.

Shared event listeners are non-interfering by construction. It observes the ordering-sensitive event approval/request with ctx.on() — Cordis's broadcast registration, where every listener runs and none can starve another. Every listener here delegates through next(), so the chain is never short-circuited, and a mutation is applied to the value next() produced rather than returned in its place:

Static evidence: dsh-plugin-doctor K10–K13 report pass for every check on this repository.

Topics

dsh, dsh-plugin, deepseek-harness, deepseek, cordis, voice, speech, tts, stt, speech-to-text, text-to-speech, microphone

Contributors

  • @PerryLink — creator and maintainer: speak pipeline, speech engines, mic recorder, event announcements, projection unit, and the five-language docs.

PerryLink DSH Plugin Family

This project is one of the 87 actively maintained DeepSeek Harness plugins from PerryLink. The family roster is 95 plugins in total — 5 frozen, 3 retired — and stays collapsed below so every README keeps a short first screen. Expand it to see every row, with the reason in the Status column.

Plugin One-liner Status
dsh-aqua-input-check 水产养殖投入品记录核对(按投入品用量、休药期与起捕间隔核对记录自洽,仅提示差异,不作出定性结论)
dsh-archive-check 档案归档完整性与保管期限核对(依据《档案法》及配套规定,仅提示差异,不作出定性结论)
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 🚫 RETIRED — see the repo README
dsh-bid-ca-precheck 投标文件符合性预检(按招标文件逐条核对响应情况,仅提示差异,不作出定性结论)
dsh-bid-qual-check 投标人资格条件核对(按资格条件与证明材料核对逐条响应,仅提示差异,不作出定性结论)
dsh-budget Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. 🧊 FROZEN — see the repo README
dsh-cert-mcp Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence
dsh-checkpoint-rewind Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore
dsh-claude-move Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH 🧊 FROZEN — see the repo README
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-contract-stance 合同条款立场台账核对(按立场、风险等级与退让底线核对台账自洽,仅提示差异,不作出定性结论)
dsh-customs-doc-check 报关单证一致性核对(按公开的报关单填制规范核对单证间字段一致性,仅提示差异,不作出定性结论)
dsh-data-quality Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here)
dsh-defend Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. 🧊 FROZEN — see the repo README
dsh-demurrage-ledger 滞箱费台账核对(按免箱期与费率核对超期天数与金额的自洽性,仅提示差异,不作出定性结论)
dsh-doublecheck Engineering-discipline guard: requirements grill, test gates, adversary review
dsh-draw Unified static-image generation routing for DeepSeek Harness. 🧊 FROZEN — see the repo README
dsh-drill-script-check 应急演练脚本核对(按阶段、响应分级、指挥与资源要素核对脚本齐备,仅提示差异,不作出定性结论)
dsh-eia-guide-check 环评导则适用性核对(按要素、导则名称与执行标准核对台账自洽,仅提示差异,不作出定性结论)
dsh-emergency-plan 应急预案要素齐备性与条款级页码定位(依据 GB/T 29639-2020 等公开文件,仅提示差异,不作出定性结论)
dsh-essay-rubric-check 作文量表评分核对(按评分项、原文定位与分值算术核对评分自洽,仅提示差异,不作出定性结论)
dsh-evidence-check 证据清单齐备性核对(按待证事实与证据要素核对清单自洽,仅提示差异,不作出定性结论)
dsh-export-ctl-check 出口管制物项核对(按管制清单、最终用途与许可证核对台账齐备,仅提示差异,不作出定性结论)
dsh-fast Read-only performance diagnostics for DeepSeek Harness.
dsh-fmea-table-check FMEA 分析表要素齐备性与风险顺序数一致性核对(按公开的 FMEA 方法标准核对表内自洽,仅提示差异,不作出定性结论)
dsh-forecast-penalty 预测准确率考核核对(按准确率、门槛与考核单价核对考核费用的算术自洽,仅提示差异,不作出定性结论)
dsh-fund-research Deterministic research reports for Chinese public mutual funds
dsh-github GitHub PR/issues integration for DSH, every write gated by approval
dsh-gongwen-flow-check 公文流转与办理时限核对(按公开的公文处理规范核对环节完整性与时限,仅提示差异,不作出定性结论)
dsh-gongwen-word-check 公文格式要素核对(按公开的党政机关公文格式标准核对版头与主体要素,仅提示差异,不作出定性结论)
dsh-guard-plan-qc 劳动保护与安全防护用品配置表核对(按公开的配备标准核对品名规格与配置数量,仅提示差异,不作出定性结论)
dsh-hazchem-check 危险化学品临界量与重大危险源辨识核对(按储存量与临界量核对台账自洽,仅提示差异,不作出定性结论)
dsh-hazplan-check HAZOP 分析表要素齐备性与偏差推导一致性核对(依据公开的危险与可操作性分析标准,仅提示差异,不作出定性结论)
dsh-hidden-risk-map 安全隐患台账→《工贸企业重大事故隐患判定标准》(应急管理部令第10号)条款映射提示(仅提示差异,不作出定性结论)
dsh-hs-classify 商品归类层级一致性核对(按章、品目、子目与商品编号的层级关系核对自洽,仅提示差异,不作出定性结论)
dsh-icd-rule-check ICD 合并编码与星剑号配对提示(依据 GB/T 14396-2016 与公开的 ICD 使用说明,仅提示差异,不作出定性结论)
dsh-industry-research Industry research orchestration that seals its deliverables through this plugin's ctx.researchReport.assemble
dsh-lawcite-adapter 法条引用与文书要素核对(按名称、条号、原文与效力状态核对引用可核验性,仅提示差异,不作出定性结论)
dsh-laya Laya typed decisions (noul/choice/score) as a first-class Cordis service and model-visible tools
dsh-lc-doc-check 信用证单据条款核对(按单据种类、份数、期限与不符点核对交单自洽,仅提示差异,不作出定性结论)
dsh-learning-gap-check 能力差距与培养计划核对(按能力等级差、培养措施与完成期限核对台账闭环,仅提示差异,不作出定性结论)
dsh-library Local document knowledge base for DeepSeek Harness.
dsh-local-ai Local-model (Ollama) integration for DeepSeek Harness.
dsh-lsp-actions LSP diagnostics, formatting, completion, code actions and rename over language servers
dsh-mask PII masking middleware: anonymize at the model boundary, restore at the display layer
dsh-mcp-panel Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors
dsh-medrec-qc 病案首页形式质控与逻辑矛盾提示(依据国卫办医发〔2016〕24号等公开文件,仅提示差异,不作出定性结论)
dsh-memento Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool
dsh-nsfc-form-check 国家自然科学基金申请书形式审查与匿名化提示(依据《国家自然科学基金条例》与申请人导入的当年指南,仅提示差异,不作出定性结论)
dsh-nurse-record-check 护理记录时限、签名与评估表完整性校验(依据《病历书写基本规范》等公开文件,仅提示差异,不作出定性结论)
dsh-observe OpenTelemetry and Langfuse observability exporter for DeepSeek Harness.
dsh-origin-rvc-check 原产地区域价值成分核对(按 RVC 定义式与门槛核对原产地判定自洽,仅提示差异,不作出定性结论)
dsh-ota-review-check 在线点评回复台账核对(按回复时限、问题分类与整改状态核对台账闭环,仅提示差异,不作出定性结论)
dsh-output-styles Claude Code outputStyles-equivalent runtime style switching
dsh-paper-doc-adapter 试卷解析结构核对(按题型、答案、分值与 yotta 标识核对试卷结构自洽,仅提示差异,不作出定性结论)
dsh-permission-rules Claude Code-style declarative allow/deny/ask permission rules with audit
dsh-permit-report-check 行政许可办理核对(按申请材料、法定时限与决定记录核对台账闭环,仅提示差异,不作出定性结论)
dsh-pipeline-check 项目全流程文件链条核对(按环节先后与金额口径核对链条自洽,仅提示差异,不作出定性结论)
dsh-pleading-draft 起诉状要素齐备性核对(按诉请、事实、证据、法条四要素核对文书齐备,仅提示差异,不作出定性结论)
dsh-plugin-doctor Zero-dependency static + sandbox smoke detector for DSH plugins
dsh-plugin-guide Plugin-development knowledge base as an on-demand agent skill
dsh-plugin-kit Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins
dsh-plugin-upgrade One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card
dsh-policy-brief-draft 政策专报要素核对(按观点、依据、出处与建议核对专报齐备,仅提示差异,不作出定性结论)
dsh-power-loss-split 线损电量拆分与考核表核对(依据公开的线损计算口径,仅提示差异,不作出定性结论)
dsh-power-ticket-check 电力工作票要素齐备性与签发许可顺序核对(依据现行电力安全工作规程,仅提示差异,不作出定性结论)
dsh-ppap-check PPAP 提交要素齐备性核对(按公开的 PPAP 手册与提交等级核对要素齐备与版本填写,仅提示差异,不作出定性结论)
dsh-protest-deadline 质疑与投诉期限核对(按公开的政府采购质疑投诉规定核对期限与台账自洽,仅提示差异,不作出定性结论)
dsh-railway-window 铁路施工天窗台账核对(按时间窗、时长算术与命令号核对台账自洽,仅提示差异,不作出定性结论)
dsh-reach Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console 🧊 FROZEN — see the repo README
dsh-repair-order-qc 维修工单结算核对(按项目金额、配件工时合计与结算总额核对算术自洽,仅提示差异,不作出定性结论)
dsh-research-report Verifiable research-report engine: content-addressed evidence ledger and sealed versions
dsh-review-reply-check 审稿意见逐条回应覆盖核对(按意见与回应一一对应核对覆盖完整性,仅提示差异,不作出定性结论)
dsh-rulefile-check 规则库文件自检核对(按条款引用纪律与效力上限核对规则库自身合规,仅提示差异,不作出定性结论)
dsh-safety-brief-check 安全技术交底记录要素齐备性与签字闭环核对(依据公开的安全生产法规与检查标准,仅提示差异,不作出定性结论)
dsh-score Multi-dimensional quality scoring for DeepSeek Harness plugins.
dsh-session-pin Pin sessions in the Web sidebar with durable ordering 🚫 RETIRED — see the repo README
dsh-session-sync Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store.
dsh-site-log-check 监理日志跨日连续性与旁站覆盖提示(依据 GB/T 50319-2013 等公开文件,仅提示差异,不作出定性结论)
dsh-skill-pack-security Security-audit skill pack: secret scan, dependency and supply-chain review
dsh-soe-decision-check 三重一大决策台账核对(按前置研究、会议审议与决议记录核对程序留痕,仅提示差异,不作出定性结论)
dsh-soilwater-check 土壤与地下水监测台账核对(按点位、监测项目、限值与超标判定核对台账自洽,仅提示差异,不作出定性结论)
dsh-sop-sync-check 作业规程与 FMEA/控制计划一致性核对(按编号与版本核对三份文件是否同步,仅提示差异,不作出定性结论)
dsh-spc-gbt-adapter 控制图常数与过程能力指数核对(按 GB/T 4091 的常规控制图常数表核对控制限与 Cp/Cpk 的自洽性,仅提示差异,不作出定性结论)
dsh-talk Voice-first session loop for DeepSeek Harness: talk to it, hear it answer.
dsh-team-rooms Cross-session team rooms: shared message bus, task board and timeline 🚫 RETIRED — see the repo README
dsh-tender-extract 招标文件条款摘录核对(按出处与原文逐字核对摘录完整性,仅提示差异,不作出定性结论)
dsh-tender-matrix 评标因素评分矩阵核对(按分值上限与合计核对矩阵自洽,仅提示差异,不作出定性结论)
dsh-test-drive Isolated install-and-smoke test drives for DeepSeek Harness plugins.
dsh-ticktick TickTick/Dida365 task bridge: session-header panel + 11 tools
dsh-translate Vendor parameter translation and deterministic JSON repair for DeepSeek Harness.
dsh-warranty-calc 质保期与索赔金额核对(按质保期月数与里程、索赔金额算式核对自洽,仅提示差异,不作出定性结论)

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-talk contributors

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.