
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
Voice-first session loop for DeepSeek Harness: a composer microphone button with browser/local speech-to-text (Web Speech, FunASR, whisper.cpp), a speak tool for text-to-speech replies (browser, edge-tts, piper), event announcements with mute, and speak-t
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.
📖 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.
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.


The same run, animated.
| 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 |
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; on hosts that can carry it, the session log records the sanitized utterance (see Security boundaries).whisper.cpp.talk Remote namespace).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)
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.
main): dsh plugin --profile web add github:PerryLink/dsh-talk — the prepare script builds with production dependencies only.dsh plugin --profile web add dsh-talk.pnpm pack in this repo, then dsh plugin --profile web add ./dsh-talk-<version>.tgz.dsh plugin --profile web remove dsh-talk (or remove the row from the profile patch).If pnpm reports
ERR_PNPM_IGNORED_BUILDSfor this package (esbuild's harmless platform-binary validation), addallowBuilds: { esbuild: true }to yourpnpm-workspace.yaml— thedshCLI prints the exact snippet.
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 |
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.
| 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) |
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. All display/log surfaces redact credentials, JWTs, bearer headers, and temp paths.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.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/request listener always calls next().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.edge-tts, piper, and whisper.cpp executables and models must be installed separately.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.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.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: 86 tests, 15 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
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:
talk; that key is not a built-in seam and is not provided by any surveyed high-star plugin.shadows-shipped-ui seat.webServer prefix.inserts its own row; it never overrides a built-in row's config.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.
dsh, dsh-plugin, deepseek-harness, deepseek, cordis, voice, speech, tts, stt, speech-to-text, text-to-speech, microphone
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:
| Plugin | One-liner | Status |
|---|---|---|
| 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 note above |
| dsh-budget | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | 🧊 FROZEN — see the repo README |
| 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 | 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-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-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-fast | Read-only performance diagnostics for DeepSeek Harness. | |
| 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-industry-research | Industry research orchestration that seals its deliverables through this plugin's ctx.researchReport.assemble | |
| dsh-laya | Laya typed decisions (noul/choice/score) as a first-class Cordis service and model-visible tools | |
| 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-memento | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | 🧊 FROZEN — see the repo README |
| dsh-observe | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
| dsh-output-styles | Claude Code outputStyles-equivalent runtime style switching | |
| dsh-permission-rules | Claude Code-style declarative allow/deny/ask permission rules with audit | |
| 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-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-plugin-upgrade-015 | Merged 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-reach | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | 🧊 FROZEN — see the repo README |
| dsh-research-report | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
| 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 note above |
| dsh-session-sync | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
| dsh-skill-pack-security | Security-audit skill pack: secret scan, dependency and supply-chain review | |
| 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 note above |
| 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. |
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.
Apache License 2.0 © 2026 dsh-talk contributors
FAQs
Voice-first session loop for DeepSeek Harness: a composer microphone button with browser/local speech-to-text (Web Speech, FunASR, whisper.cpp), a speak tool for text-to-speech replies (browser, edge-tts, piper), event announcements with mute, and speak-t
We found that dsh-talk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.