# ЁЯОЩя╕П dsh-talk - **1024 рд╕реНрдЯреЛрд░ рдЪреИрдирд▓**: рдПрдХ рдмрд╛рд░ `npm i -g dsh1024`, рдлрд┐рд░ `dsh1024 plugin --profile web add dsh-talk` ([deepseek1024.com](https://deepseek1024.com) рдЗрдВрд╕реНрдЯреЙрд▓ рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред **DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЙрдЗрд╕-рдлрд░реНрд╕реНрдЯ рд╕рддреНрд░ рд▓реВрдк: рдЙрд╕рд╕реЗ рдмреЛрд▓реЗрдВ рдФрд░ рдЙрддреНрддрд░ рд╕реБрдиреЗрдВред** *рдорд╛рдЗрдХ рджрдмрд╛рдПрдБ, рдмреЛрд▓реЗрдВ рдФрд░ рдЬрд╡рд╛рдм рдЬрд╝реЛрд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ тАФ рдмреЛрд▓рддреЗ рд╣реА рд░реБрдХрд╛рд╡рдЯред* [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-talk) [![DSH plugin](https://img.shields.io/badge/dsh--plugin-тЬЕ-green)](https://github.com/topics/dsh-plugin) [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-talk.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-х╛╜чла) [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-top-rated.svg)](https://dsh.market/) [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#) [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-talk/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-talk/actions) [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-talk?label=version)](https://github.com/PerryLink/dsh-talk/releases) [![npm version](https://img.shields.io/npm/v/dsh-talk)](https://www.npmjs.com/package/dsh-talk) [![npm downloads](https://img.shields.io/npm/dm/dsh-talk)](https://www.npmjs.com/package/dsh-talk) [English](README.md) ┬╖ [чоАф╜Уф╕нцЦЗ](README-zh.md) ┬╖ [Espa├▒ol](README-es.md) ┬╖ [Portugu├кs](README-pt.md) ┬╖ [рд╣рд┐рдиреНрджреА](README-hi.md)
--- ## рд╕рдВрдЧрддрддрд╛ | рд╕рддрд╣ | рд╕реНрдерд┐рддрд┐ | |---|---| | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2` (2026-09-18 рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд: peers рдХрд╛ рддреАрд╕рд░рд╛ рдЦрдВрдб + `engines.dsh` + `manifestVersion: 1`, рдФрд░ рдорд╛рд╕рд┐рдХ Compat workflow рдЙрд╕реА рд▓рд╛рдЗрди рдкрд░ рдПрдВрдХрд░); 2026-09-18 рдХреЛ рдкреВрд░реА gate chain рд╣рд░реА (рджреЛ typecheck рд░реВрд▓рд░, 86 рдЯреЗрд╕реНрдЯ, build, self-contained, artifacts, pack)ред npm dev/test рд▓рд╛рдЗрди `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0`ред | | Node | `^22.19.0 \|\| >=24.0.0` | | рдмреНрд░рд╛рдЙрдЬрд╝рд░ | Web Speech + MediaRecorder (Chrome/Edge рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда); рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП host рдХреЗ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди/TTS рдЗрдВрдЬрди | ## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ `dsh-talk` рд╡реЙрдЗрд╕ рд▓реВрдк рдХреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрдВрдж рдХрд░рддрд╛ рд╣реИ: - **`speak` рдЯреВрд▓** тАФ рдПрдЬреЗрдВрдЯ рдЕрдкрдиреЗ рдЙрддреНрддрд░ рдЬрд╝реЛрд░ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред TTS рдЗрдВрдЬрди: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕, `edge-tts` (рдиреЗрдЯрд╡рд░реНрдХ рдиреНрдпреВрд░рд▓ рд╡реЙрдЗрд╕) рдпрд╛ `piper` (рд╕реНрдерд╛рдиреАрдп)ред рдСрдбрд┐рдпреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдмрдЬрддрд╛ рд╣реИ; рдЬреЛ host рдЗрд╕реЗ рд╡рд╣рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣рд╛рдБ рд╕рддреНрд░ рд▓реЙрдЧ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХреА рдЧрдИ рдмрд╛рдд рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ (рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ рджреЗрдЦреЗрдВ)ред - **рдХрдВрдкреЛрдЬрд╝рд░ рдорд╛рдЗрдХ рдмрдЯрди** тАФ рджрдмрд╛рдПрдБ, рдмреЛрд▓реЗрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдЗрдирдкреБрдЯ рдмреЙрдХреНрд╕ рдореЗрдВ рднрд░ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рд╕реАрдзреЗ рд╕рдмрдорд┐рдЯ рд╣реЛрддрд╛ рд╣реИ)ред STT рдЗрдВрдЬрди: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ Web Speech (рдЕрдВрддрд░рд┐рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕рд╣рд┐рдд), FunASR HTTP рд╕рд░реНрд╡рд░ рдпрд╛ рд╕реНрдерд╛рдиреАрдп `whisper.cpp`ред - **рдмреЛрд▓рддреЗ рд╣реА рд░реБрдХрд╛рд╡рдЯ** тАФ рдмреЛрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реА рдЪрд▓ рд░рд╣рд╛ рдкреНрд▓реЗрдмреИрдХ рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ (clientтЖТhost, `talk` Remote рдиреЗрдорд╕реНрдкреЗрд╕ рдкрд░)ред - **рдЗрд╡реЗрдВрдЯ рдШреЛрд╖рдгрд╛рдПрдБ** тАФ рдЯрд░реНрди рдкреВрд░рд╛ рд╣реЛрдирд╛, рд▓рдВрдмрд┐рдд рд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ (waterfall-рд╕реБрд░рдХреНрд╖рд┐рдд: рдЧреЗрдЯ рдХрднреА рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛) рдФрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдБ, рдореНрдпреВрдЯ рд╕реНрд╡рд┐рдЪ рд╡ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд╛рдХреНрдпреЛрдВ рд╕рд╣рд┐рддред - **рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯреИрдм** тАФ рдЗрдВрдЬрди/рднрд╛рд╖рд╛ рдЪрдпрди рдФрд░ рдШреЛрд╖рдгрд╛ рд╕реНрд╡рд┐рдЪ, append-only рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓-рдкреИрдЪ рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдмреИрдХрдЕрдк рд╕рд╣рд┐рдд)ред ## рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд ```sh # 1. рдмрдВрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ dsh plugin --profile web add "github:PerryLink/dsh-talk#main" # рдпрд╛ npm рд╕реЗ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝) dsh plugin --profile web add dsh-talk # 2. рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ dsh --profile web --dump-config | grep -A2 'id: talk' ``` рдлрд┐рд░ рдХрдВрдкреЛрдЬрд╝рд░ рдХреЗ рдкрд╛рд╕ рдорд╛рдЗрдХ рджрдмрд╛рдПрдБ рдФрд░ рдмреЛрд▓реЗрдВ; рдпрд╛ рдПрдЬреЗрдВрдЯ рд╕реЗ рдмреЛрд▓рдиреЗ рдХреЛ рдХрд╣реЗрдВ: ``` > speak рдЯреВрд▓ рд╕реЗ "рдирдорд╕реНрддреЗ" рдХрд╣реЛред ``` ## рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ - **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-talk#main"` тАФ `prepare` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рдкреНрд░реЛрдбрдХреНрд╢рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдмрд┐рд▓реНрдб рдХрд░рддреА рд╣реИред - **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝): `dsh plugin --profile web add dsh-talk`ред - **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ `pnpm pack`, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-talk-.tgz`ред - **рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓**: `dsh plugin --profile web remove dsh-talk` (рдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рд╕реЗ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдБ)ред > рдпрджрд┐ pnpm рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП `ERR_PNPM_IGNORED_BUILDS` рджрд┐рдЦрд╛рддрд╛ рд╣реИ (esbuild рдХрд╛ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдмрд╛рдЗрдирд░реА рд╕рддреНрдпрд╛рдкрди), рддреЛ рдЕрдкрдиреЗ `pnpm-workspace.yaml` рдореЗрдВ `allowBuilds: { esbuild: true }` рдЬреЛрдбрд╝реЗрдВ тАФ `dsh` CLI рд╕рдЯреАрдХ рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред ## рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рднреА рд╕рдорд╛рдпреЛрдЬрди Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред `cordis.patch.yml` рд╣рд░ рдХреБрдВрдЬреА рдХреЛ рдЗрдирд▓рд╛рдЗрди рд╕рдордЭрд╛рддрд╛ рд╣реИред | рдХреБрдВрдЬреА | рдбрд┐рдлрд╝реЙрд▓реНрдЯ | рдЕрд░реНрде | |---|---|---| | `record.enabled` | `true` | рдХрдВрдкреЛрдЬрд╝рд░ рдорд╛рдЗрдХ рдмрдЯрди рджрд┐рдЦрд╛рдПрдБ | | `record.hotkey` | *(рдХреЛрдИ рдирд╣реАрдВ)* | рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЙрдЧрд▓ рд╣реЙрдЯрдХреА, рдЬреИрд╕реЗ `"alt+r"` | | `record.maxSeconds` | `60` | рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╕реАрдорд╛ рд╕реЗрдХрдВрдб рдореЗрдВ (1..600) | | `record.autoSubmit` | `false` | рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВ (false = рдбреНрд░рд╛рдлреНрдЯ рднрд░реЗрдВ) | | `record.vad.enabled` / `silenceMs` / `energyThreshold` | `true` / `1500` / `0.01` | рдзреНрд╡рдирд┐-рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд╣рдЪрд╛рди: рдореМрди рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╕реНрд╡рддрдГ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (AudioContext рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ рдореИрдиреБрдЕрд▓ рд╕реНрдЯреЙрдк) | | `stt.engine` | `auto` | `auto` / `web` / `funasr` / `whisper`; auto рдкрд╣рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЬрди, рдлрд┐рд░ Web Speech | | `stt.language` | `auto` | BCP-47 рднрд╛рд╖рд╛ рдпрд╛ `auto` | | `stt.interim` | `true` | рдЕрдВрддрд░рд┐рдо рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рджрд┐рдЦрд╛рдПрдБ (Web Speech) | | `stt.silenceFinaliseMs` | `4000` | рдЗрддрдиреА рдорд┐рд▓реАрд╕реЗрдХрдВрдб рддрдХ рдЖрд╡рд╛рдЬрд╝ рди рдЖрдиреЗ рдкрд░ рд▓рдЧрд╛рддрд╛рд░ Web Speech рд░реЛрдХреЗрдВ (500..15000) | | `stt.funasr.url` | *(рдХреЛрдИ рдирд╣реАрдВ)* | FunASR рдЗрдиреНрдлрд╝рд░реЗрдВрд╕ рдПрдВрдбрдкреЙрдЗрдВрдЯ; `funasr` рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ | | `stt.whisper.modelPath` | *(рдХреЛрдИ рдирд╣реАрдВ)* | whisper.cpp рдореЙрдбрд▓; `whisper` рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ | | `tts.engine` | `auto` | `auto` / `browser` / `edge-tts` / `piper`; auto рдкрд╣рд▓реЗ piper, рдлрд┐рд░ edge-tts, рдлрд┐рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕ | | `tts.rate` | `0` | edge-tts/piper рдХреЗ рд▓рд┐рдП рдЧрддрд┐ рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░рддрд┐рд╢рдд рдореЗрдВ (-50..50) | | `tts.fallbackToBrowser` | `true` | рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЬрди рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕ рдкрд░ рдЧрд┐рд░реЗрдВ | | `tts.browser.voiceName` | *(рдХреЛрдИ рдирд╣реАрдВ)* | рдкрд╕рдВрджреАрджрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕ рдирд╛рдо; рди рдорд┐рд▓рдиреЗ рдкрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ | | `tts.browser.rate` | `1` | рдмреНрд░рд╛рдЙрдЬрд╝рд░ SpeechSynthesis рдЧрддрд┐ (0.1..10) | | `tts.browser.pitch` | `1` | рдмреНрд░рд╛рдЙрдЬрд╝рд░ SpeechSynthesis рдкрд┐рдЪ (0..2) | | `tts.piper.modelPath` | *(рдХреЛрдИ рдирд╣реАрдВ)* | piper рд╡реЙрдЗрд╕ рдореЙрдбрд▓; `piper` рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ | | `announce.enabled` | `true` | рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рдорд╛рд╕реНрдЯрд░ рд╕реНрд╡рд┐рдЪ | | `announce.onTurnEnd` / `onApproval` / `onError` | `true` | рдХреМрди рд╕реЗ рдЗрд╡реЗрдВрдЯ рдмреЛрд▓реЗ рдЬрд╛рдПрдБ | | `announce.messages.*` | *"Turn complete." рдЖрджрд┐* | рдмреЛрд▓реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд╛рдХреНрдп | | `interrupt` | `true` | рдмреЛрд▓рддреЗ рд╣реА рдЪрд▓рддрд╛ рдкреНрд▓реЗрдмреИрдХ рд░реБрдХрддрд╛ рд╣реИ | | `maxSpeakChars` | `20000` | speak рдЯреВрд▓ рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рд╕реАрдорд╛ (1..100000) | | `maxAudioCacheBytes` | `8388608` | рдореЗрдореЛрд░реА рдореЗрдВ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝реНрдб рдСрдбрд┐рдпреЛ рдХреИрд╢ рд╕реАрдорд╛ (1 MiB..64 MiB) | `stt.silenceFinaliseMs` рдФрд░ `record.vad.silenceMs` рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрдВрддреНрд░ рд╣реИрдВ: рдкрд╣рд▓рд╛ рд▓рдЧрд╛рддрд╛рд░ Web Speech рдкрд╣рдЪрд╛рди рдореЗрдВ рдЖрд╡рд╛рдЬрд╝ рди рдорд┐рд▓рдиреЗ рдкрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрддрд╛ рд╣реИ; рджреВрд╕рд░рд╛ MediaRecorder рдХрд╛ рдКрд░реНрдЬрд╛-рдЖрдзрд╛рд░рд┐рдд рдбрд┐рдЯреЗрдХреНрдЯрд░ рд╣реИ рдЬреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рдФрд░ `record.autoSubmit` рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рдЙрд╕реЗ рднреЗрдЬ рджреЗрддрд╛ рд╣реИ)ред рджреЛрдиреЛрдВ рдЕрд▓рдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд░рдЦрддреЗред ## рдЯреВрд▓ рдФрд░ рд╕рддрд╣реЗрдВ | рд╕рддрд╣ | рдкреНрд░рдХрд╛рд░ | рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ | |---|---|---| | `speak` | рдЯреВрд▓ | рдЯреЗрдХреНрд╕реНрдЯ рдЬрд╝реЛрд░ рд╕реЗ рдмреЛрд▓рддрд╛ рд╣реИ (browser/edge-tts/piper); рдкреНрд░рддрд┐-рдХреЙрд▓ рдЗрдВрдЬрди/рд╡реЙрдЗрд╕ рдУрд╡рд░рд░рд╛рдЗрдб; рдХреИрдирдирд┐рдХрд▓ JSON рдкрд░рд┐рдгрд╛рдо | | рдорд╛рдЗрдХ рдмрдЯрди | `conversation.input.left` рд╕реНрд▓реЙрдЯ | рд░рд┐рдХреЙрд░реНрдб тЖТ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм тЖТ рдбреНрд░рд╛рдлреНрдЯ рднрд░реЗрдВ (рдпрд╛ рд╕рдмрдорд┐рдЯ); рджрдмрд╛рддреЗ рд╣реА рд░реБрдХрд╛рд╡рдЯ | | рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯреИрдм | `settings.plugins.tab` (id `talk`) | рдЗрдВрдЬрди/рднрд╛рд╖рд╛/рдШреЛрд╖рдгрд╛ рд╕реНрд╡рд┐рдЪ; append-only рд╕рд╣реЗрдЬ | | `talk:*` | Typert Remote | `status`, `audio`, `transcribe`, `applySettings`, `interrupt` (host рдиреЗрдорд╕реНрдкреЗрд╕) | ## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛ - **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: рдкреНрд▓рдЧрдЗрди рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯ-рд╕реАрдорд┐рдд рдЗрди-рдореЗрдореЛрд░реА рдСрдбрд┐рдпреЛ рдХреИрд╢ рд░рдЦрддрд╛ рд╣реИ; рдорд╛рдЗрдХ рдЕрдиреБрдорддрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░-рдордзреНрдпрд╕реНрде рд╣реИред рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯреИрдм рдХреЗрд╡рд▓ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрдЪ рдЦрдВрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдмреИрдХрдЕрдк рд╕рд╣рд┐рдд) тАФ рдлрд╝рд╛рдЗрд▓ рдХрднреА рджреЛрдмрд╛рд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ред - **рдбреЗрдЯрд╛**: рдСрдбрд┐рдпреЛ рдХрднреА рдореЙрдбрд▓ рд╕рдВрджрд░реНрдн рдпрд╛ рд╕рддреНрд░ рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддрд╛ред рдЬрд╣рд╛рдБ host рдХрд╛ рд╕рддреНрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, `dsh-talk/speech` рдЗрд╡реЗрдВрдЯ рдЙрдЪреНрдЪрд╛рд░рдг id, рдЗрдВрдЬрди, рдХрд╛рд░рдг, рдЖрдХрд╛рд░, рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕, рдЧрддрд┐ рдФрд░ рдкрд┐рдЪ рд░рдЦрддрд╛ рд╣реИ; рдПрдирд╡рд▓рдк-рд░рд╣рд┐рдд host рдкрд░ рдпрд╣ рдЗрд╡реЗрдВрдЯ рд▓рд┐рдЦрд╛ рд╣реА рдирд╣реАрдВ рдЬрд╛рддрд╛ред рд╣рд░ рдбрд┐рд╕реНрдкреНрд▓реЗ/рд▓реЙрдЧ рд╕рддрд╣ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓, JWT, bearer рд╣реЗрдбрд░ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рдкрдереЛрдВ рдХреЛ рд░рд┐рдбреИрдХреНрдЯ рдХрд░рддреА рд╣реИред - **рдиреЗрдЯрд╡рд░реНрдХ**: рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЗрдВрдЬрди рд╕реЗ рд╕рдВрдкрд░реНрдХ рд╣реЛрддрд╛ рд╣реИред `edge-tts` рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рдВрдереЗрд╕рд┐рд╕ рдХрд░рддрд╛ рд╣реИ, FunASR рдЕрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ Chrome рдХрд╛ `webkitSpeechRecognition` рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдСрдбрд┐рдпреЛ Google рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ; рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ `speechSynthesis` playback рд╕реНрдерд╛рдиреАрдп рд░рд╣рддрд╛ рд╣реИред ## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ - **рдореЙрдбрд▓-рджреГрд╢реНрдп тЯ║ рд▓реЙрдЧреНрдб** тАФ рдореЙрдбрд▓ рдХреЗрд╡рд▓ speak рдЯреВрд▓ рдХрд╛ рдХреИрдирдирд┐рдХрд▓ рдорд╛рди рдФрд░ рд░реЗрдВрдбрд░ рдЯреЗрдХреНрд╕реНрдЯ рджреЗрдЦрддрд╛ рд╣реИред `dsh-talk/speech` рдЗрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рддрдм рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм host рдЗрд╕реЗ рд╡рд╣рди рдХрд░ рд╕рдХреЗ (рд╣реЛрд╕реНрдЯ рд╕рдВрдЧрддрддрд╛ рджреЗрдЦреЗрдВ); `tool/call` + `tool/result` рдЗрд╡реЗрдВрдЯ рд╣рдореЗрд╢рд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдпреЛрдЧреНрдп рдирд┐рд╢рд╛рди рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВред - **рд╕реНрд╡реАрдХреГрддрд┐ рдШреЛрд╖рдгрд╛рдПрдБ рдХрднреА рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреАрдВ** тАФ `approval/request` рд▓рд┐рд╕рдирд░ рд╣рдореЗрд╢рд╛ `next()` рдмреБрд▓рд╛рддрд╛ рд╣реИред - **рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб рдЖрдЙрдЯрдкреБрдЯ** тАФ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рдСрдбрд┐рдпреЛ рдкрде рд▓реЙрдЧ рдпрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддреЗред - **рд╣реЛрд╕реНрдЯ рд╕рдВрдЧрддрддрд╛** тАФ `dsh-talk/speech` рдЗрд╡реЗрдВрдЯ рдПрдХ рд╣рд╛рдБ/рдирд╣реАрдВ рдЧреЗрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рди host рдХреА рдЬреНрдЮрд╛рдд-рдкреНрд░рдХрд╛рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдЗрд╕ рдЗрд╡реЗрдВрдЯ рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИ рд╡реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓ рдпрд╣ рдмрддрд╛рддреА рд╣реИ; рдмрд╛рдХреА рд╣рд░ host тАФ `0.1.1-rc.2` рддрдХ рдХреА рд╣рд░ рдЬрд╛рд░реА рд▓рд╛рдЗрди, `0.1.2-alpha` рд▓рд╛рдЗрди, `0.1.2-rc.1`, рдФрд░ `0.1.6-alpha.2` рднреА, рдЬрд┐рд╕рдХрд╛ `Session.append` рдХреЗрд╡рд▓ surface intent рд╕реНрдЯреИрдореНрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ, `ignorable` рдПрдирд╡рд▓рдк рдирд╣реАрдВ (рд╡рд╣ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рдкрдарди рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ) тАФ рдХреЛрдИ append рдирд╣реАрдВ рдкрд╛рддреЗ, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдБ рд╕реНрдкреАрдЪ рдХрднреА рд╕рддреНрд░ рд▓реЙрдЧ рдХреЛ рджреВрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреАред рдпрд╣ рдЫреВрдЯ рдЕрдм рдореМрди рдирд╣реАрдВ рд╣реИ: host рдкреНрд░рддрд┐-рд╕рддреНрд░ рдЬреЛрдбрд╝реЗ/рдЫреЛрдбрд╝реЗ рдЧрдП рдХрд╛рдЙрдВрдЯрд░ рд░рдЦрддрд╛ рд╣реИ рдФрд░ `talk/latest(sessionId)` рдЙрдиреНрд╣реЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рд╕рддреНрд░-рд╕реНрддрд░реАрдп playback рд╕реВрдЪреА рдЦрд╛рд▓реА рд░рд╣рддреА рд╣реИ рдФрд░ speak рдЯреВрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реА рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдпреЛрдЧреНрдп рдирд┐рд╢рд╛рди рд╣реИрдВред - **Fail loud** тАФ рдЕрдорд╛рдиреНрдп рдЗрдВрдЬрди, рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдорд╛рди рдФрд░ рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдореЙрдбрд▓/рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рдЗрдВрдЬрди рдорд╛рдЙрдВрдЯ рдкрд░ рдЕрд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред ## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ - **рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди**: Web Speech рдФрд░ MediaRecorder рдХреНрд╖рдорддрд╛-рдкрд╣рдЪрд╛рди рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ; рдмрд┐рдирд╛ рдЙрдирдХреЗ рдмрдЯрди рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛрдиреЗ рдкрд░ host рдЗрдВрдЬрди (FunASR/whisper.cpp) рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - **рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЬрди рдЖрдкрдХреА рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВ**: `edge-tts`, `piper`, `whisper.cpp` рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдореЙрдбрд▓ рдЕрд▓рдЧ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рд╣реЛрддреЗ рд╣реИрдВред - **рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк**: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдкрдиреЗ рдиреЗрдЯрд┐рд╡ MediaRecorder рдХреЛрдбреЗрдХ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ; whisper.cpp рдХреЛ WAV рд░рд┐рдХреЙрд░реНрдбрд░ рдпрд╛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред - **рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд░реАрд▓реЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ**: рдЯреИрдм рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ; рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд░реАрд▓реЛрдб (рдпрд╛ рд╡реЗрдм-рдРрдк рдкреБрдирдГ рдЖрд░рдВрдн) рдмрджрд▓рд╛рд╡ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред - **рдЙрд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдмрд┐рдирд╛ host рдкрд░ live playback рдЗрддрд┐рд╣рд╛рд╕ рдЦрд╛рд▓реА рд░рд╣рддрд╛ рд╣реИ**: `0.1.1-rc.2`, `0.1.2-alpha` рд▓рд╛рдЗрди, `0.1.2-rc.1` рдФрд░ `0.1.6-alpha.2` рдкрд░ host рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА `dsh-talk/speech` рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреА, рдЗрд╕рд▓рд┐рдП рдЧреЗрдЯ рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рд╕рддреНрд░-рд╕реНрддрд░реАрдп playback рд╕реВрдЪреА рдЦрд╛рд▓реА рд░рд╣рддреА рд╣реИ; `talk/latest(sessionId)` рдлрд┐рд░ рднреА рдирд╡реАрдирддрдо utterance рдФрд░ рдЫреЛрдбрд╝реЗ рдЧрдП рдХрд╛рдЙрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реНрдкреАрдЪ рд╕реНрд╡рдпрдВ, рдорд╛рдЗрдХ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯреИрдм рдФрд░ рдЯреВрд▓ рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд░рд╣рддреЗ рд╣реИрдВред - **dsh-talk тЙд 0.2.1 рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдкреБрд░рд╛рдиреЗ рд▓реЙрдЧ рдХреЛ cold load рд╕реЗ рдкрд╣рд▓реЗ рдорд░рдореНрдордд рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИ**: `0.2.1` рддрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдмрд┐рдирд╛ рдорд╛рд░реНрдХрд░ рд╡рд╛рд▓реЗ `dsh-talk/speech` events рдЬреЛрдбрд╝рддреЗ рдереЗред `0.1.0-rc.7` рдпрд╛ рдирдП host рдкрд░, рдЬрд┐рд╕ session рдХреА log рдореЗрдВ рдпреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реЛрдВ рдЙрд╕рдХрд╛ рдЕрдЧрд▓рд╛ cold load `SessionFormatUnsupportedError` рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИред рд╕реБрдзрд╛рд░: host рд░реЛрдХреЗрдВ, session рдХреА `.jsonl` log рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдВ, рд╣рд░ рдЙрд╕ JSON рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╢реАрд░реНрд╖-рд╕реНрддрд░ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ `"ignorable":true` рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдХрд╛ `"type"` `"dsh-talk/speech"` рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реБрд░реБрдЖрддреА `{` рдХреЗ рдареАрдХ рдмрд╛рдж `"ignorable":true,` рдбрд╛рд▓реЗрдВ), рдлрд┐рд░ session рджреЛрдмрд╛рд░рд╛ рдЦреЛрд▓реЗрдВред рдмрд╛рдХреА рдХреБрдЫ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рдФрд░ рдХреБрдЫ рднреА рдЦреЛрддрд╛ рдирд╣реАрдВ; рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдирдП append рдХрднреА рдмрд┐рдирд╛-рдорд╛рд░реНрдХрд░ рдЗрд╡реЗрдВрдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗред ## рд╡рд┐рдХрд╛рд╕ ```sh pnpm install # node ^22.19 || >=24 pnpm run typecheck # tsc: src + tests рд╕реНрдерд╛рдиреАрдп рд╣рд╛рд░реНрдиреЗрд╕ рдЪреЗрдХрдЖрдЙрдЯ рдХреЗ рд╡рд┐рд░реБрджреНрдз pnpm run typecheck:ci # tsc рдкреНрд░рдХрд╛рд╢рд┐рдд 0.1.5-rc.2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз (рдмрд┐рдирд╛ paths) pnpm test # vitest: 86 рдЯреЗрд╕реНрдЯ, 15 рд╕реБрдЗрдЯ pnpm run build # tsc рдШреЛрд╖рдгрд╛рдПрдБ + tsdown рдмрдВрдбрд▓ (lib/) pnpm run verify:self-contained # рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдкреЗрдХ registry рд╕реЗ рд╣рд▓ рд╣реЛрддреА рд╣реИрдВ pnpm run verify:artifacts # рдирд┐рд░реНрдорд┐рдд ESM рдлрд╝реЗрд╕ + рдХреНрд▓рд╛рдЗрдВрдЯ ModuleLoader рд╣реИрдВрдбрд╢реЗрдХ pnpm pack # рдкреНрд░рдХрд╛рд╢рд┐рдд tarball ``` ## Topics `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `voice`, `speech`, `tts`, `stt`, `speech-to-text`, `text-to-speech`, `microphone` ## Contributors - [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдореЗрдВрдЯреЗрдирд░: рд╡реЙрдЗрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рд╕реНрдкреАрдЪ рдЗрдВрдЬрди, рдорд╛рдЗрдХ рд░рд┐рдХреЙрд░реНрдбрд░, рдЗрд╡реЗрдВрдЯ рдШреЛрд╖рдгрд╛рдПрдБ, рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдпреВрдирд┐рдЯ рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред ## PerryLink DSH Plugin Family рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ [PerryLink](https://github.com/PerryLink) рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░рдХреНрд╖рд┐рдд [42 DeepSeek Harness рдкреНрд▓рдЧрдЗрдиреЛрдВ](https://github.com/PerryLink) рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рднреА рдХрд░реЗрдВрдЧреЗ: | Plugin | One-liner | |---|---| | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | рдЕрдиреБрдореЛрджрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ рд╕реНрд╡рддрдГ-рд╕рдореАрдХреНрд╖рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓-рдмрдВрдж | | | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | рд╡реЗрдм UI рд╕рд╛рдЗрдбрдмрд╛рд░, рд╕рдВрджреЗрд╢ рдФрд░ рдЕрд╡рд░реЛрдзрди рдХреЗ рд╕рд╛рде рдЯрд┐рдХрд╛рдК рдкреГрд╖реНрдарднреВрдорд┐ рдЪрд╛рдЗрд▓реНрдб рдПрдЬреЗрдВрдЯ | | | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд рдкреНрд░рд╢рд╛рд╕рди: рдмрдЬрдЯ, рдХрд╛рд░реНрдмрди рдФрд░ рд╡рд┐рд▓рдВрдмрддрд╛ рдПрдХ рдкреИрдирд▓ рдореЗрдВред | | | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-рд╕рдорддреБрд▓реНрдп: рд╕реНрдиреИрдкрд╢реЙрдЯ, рд╕рддреНрд░ рдлрд╝реЙрд░реНрдХ, рдПрдХ-рдмрд╛рд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ | | | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Claude Code рд╕рддреНрд░, рдореЗрдореЛрд░реА, рдХреМрд╢рд▓ рдФрд░ CLAUDE.md рдХреЛ DSH рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ | | | **[dsh-click](https://github.com/PerryLink/dsh-click)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдиреЗрдЯрд┐рд╡ рдбреЗрд╕реНрдХрдЯреЙрдк рдирд┐рдпрдВрддреНрд░рдг тАФ Windows рдкрд╣рд▓реЗред | | | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | рд╡реЗрдм рдХрдВрдкреЛрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓-рд╢реИрд▓реА рдЗрдирдкреБрдЯ рдЗрддрд┐рд╣рд╛рд╕: рддреАрд░, Ctrl+R рдЦреЛрдЬ | | | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | рдбреЗрдЯрд╛рд╕реЗрдЯ рдЧреБрдгрд╡рддреНрддрд╛ рдЬрд╛рдБрдЪ рд╡ рдЙрджреНрдзрд░рдг рд╕рддреНрдпрд╛рдкрди (рдпрд╣рд╛рдБ рдЙрдкрднреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрдЦреНрдпрд╛-рд╕реЗрддреБ) | | | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдореНрдкреНрдЯ-рдЗрдВрдЬреЗрдХреНрд╢рди, рдЬреЗрд▓рдмреНрд░реЗрдХ рдФрд░ рд╕реАрдХреНрд░реЗрдЯ-рд▓реАрдХ рд░рдХреНрд╖рд╛ред | | | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ-рдЕрдиреБрд╢рд╛рд╕рди рд░рдХреНрд╖рдХ: рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдкреВрдЫрддрд╛рдЫ, рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░, рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рд╕рдореАрдХреНрд╖рд╛ | | | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдПрдХреАрдХреГрдд рд╕реНрдереИрддрд┐рдХ-рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рд░реВрдЯрд┐рдВрдЧред | | | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд░реАрдб-рдУрдирд▓реА рдкреНрд░рджрд░реНрд╢рди рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕ред | | | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | рдЪреАрдиреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдореНрдпреВрдЪреБрдЕрд▓ рдлрдВрдб рдХреЗ рд▓рд┐рдП рдирд┐рдпрддрд╛рддреНрдордХ рдЕрдиреБрд╕рдВрдзрд╛рди рд░рд┐рдкреЛрд░реНрдЯ | | | **[dsh-github](https://github.com/PerryLink/dsh-github)** | DSH рдХреЗ рд▓рд┐рдП GitHub PR/issues рдПрдХреАрдХрд░рдг, рд╣рд░ рд▓реЗрдЦрди рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд | | | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | рдЙрджреНрдпреЛрдЧ-рдЕрдиреБрд╕рдВрдзрд╛рди рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рдЬреЛ рдЗрд╕ рдкреНрд▓рдЧрд┐рди рдХреЗ `ctx.researchReport.assemble` рд╕реЗ рдбрд┐рд▓реАрд╡рд░реЗрдмрд▓ рд╕реАрд▓ рдХрд░рддрд╛ рд╣реИ | | | **[dsh-library](https://github.com/PerryLink/dsh-library)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреНрдЮрд╛рдирдХреЛрд╢ред | | | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп-рдореЙрдбрд▓ (Ollama) рдПрдХреАрдХрд░рдгред | | | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | рднрд╛рд╖рд╛ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ LSP рдирд┐рджрд╛рди, рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ, рдкреВрд░реНрдгрддрд╛, рдХреЛрдб рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдирд╛рдо рдмрджрд▓рдирд╛ | | | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII рдорд╛рд╕реНрдХрд┐рдВрдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░: рдореЙрдбрд▓ рд╕реАрдорд╛ рдкрд░ рдЕрдирд╛рдо рдХрд░реЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ рд▓реЗрдпрд░ рдкрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ | | | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ MCP рд░рдирдЯрд╛рдЗрдо рдкреИрдирд▓: /mcp рдХрдорд╛рдВрдб + рд╕реНрдерд┐рддрд┐, рдЯреВрд▓ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓рд╛ Settings рдЯреИрдм | | | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд рдХреНрд░реЙрд╕-рд╕рддреНрд░ рдореЗрдореЛрд░реА: ctx.memory рд╕реАрдо + SQLite + рдореЗрдореЛрд░реА рдЯреВрд▓ | | | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП OpenTelemetry рдФрд░ Langfuse рдЕрд╡рд▓реЛрдХрдиреАрдпрддрд╛ рдирд┐рд░реНрдпрд╛рддрдХред | | | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-рд╕рдорддреБрд▓реНрдп рд░рдирдЯрд╛рдЗрдо рд╢реИрд▓реА рдмрджрд▓рд╛рд╡ | | | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | рдСрдбрд┐рдЯ рдХреЗ рд╕рд╛рде Claude Code-рд╢реИрд▓реА рдШреЛрд╖рдгрд╛рддреНрдордХ allow/deny/ask рдЕрдиреБрдорддрд┐ рдирд┐рдпрдо | | | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | рд╢реАрд░реНрд╖-рдмрд╛рд░ рдЯреЙрдЧрд▓ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рдЧрдд рдирд┐рд░реНрджреЗрд╢ рдЗрдВрдЬреЗрдХреНрдЯрд░ (рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг) | | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | рдорд╛рдБрдЧ рдкрд░ рдПрдЬреЗрдВрдЯ рдХреМрд╢рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд▓рдЧрдЗрди-рд╡рд┐рдХрд╛рд╕ рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ | | | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | | | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | рдорд▓реНрдЯреА-рдЪреИрдирд▓ рдЕрдиреБрдореЛрджрди/рдкреНрд░рд╢реНрди рдмреНрд░рд┐рдЬ: WeChat/Telegram/Feishu, рд╕рддреНрд░ рдХрдВрд╕реЛрд▓ | | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | рд╕рд╛рдордЧреНрд░реА-рдкрддрд╛ рд╕рд╛рдХреНрд╖реНрдп рдФрд░ рд╕реАрд▓рдмрдВрдж рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╡рд╛рд▓рд╛ рд╕рддреНрдпрд╛рдкрди-рдпреЛрдЧреНрдп рдЕрдиреБрд╕рдВрдзрд╛рди-рд░рд┐рдкреЛрд░реНрдЯ рдЗрдВрдЬрди | | | **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness рдкреНрд▓рдЧрд┐рдиреЛрдВ рдХреА рдмрд╣реБ-рдЖрдпрд╛рдореА рдЧреБрдгрд╡рддреНрддрд╛ рд╕реНрдХреЛрд░рд┐рдВрдЧред | | | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | рдЯрд┐рдХрд╛рдК рдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рд╕рддреНрд░ рдкрд┐рди рдХрд░реЗрдВ | | | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдбрд┐рд╡рд╛рдЗрд╕ рд╕рддреНрд░ рд╕рд┐рдВрдХ тАФ рдЖрдкрдХреЗ рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХрд╛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд git рдорд┐рд░рд░ред | | | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | рд╕реБрд░рдХреНрд╖рд╛-рдСрдбрд┐рдЯ рдХреМрд╢рд▓ рдкреИрдХ: рдЧреБрдкреНрдд рд╕реНрдХреИрди, рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЖрдкреВрд░реНрддрд┐-рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдореАрдХреНрд╖рд╛ | | | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness рдкреНрд▓рдЧрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреГрдердХ рдЗрдВрд╕реНрдЯреЙрд▓-рдПрдВрдб-рд╕реНрдореЛрдХ рдЯреЗрд╕реНрдЯ рдбреНрд░рд╛рдЗрд╡ред | | | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 рдХрд╛рд░реНрдп рдмреНрд░рд┐рдЬ: рд╕рддреНрд░-рд╣реЗрдбрд░ рдкреИрдирд▓ + 11 рдЯреВрд▓ | | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЗрдВрдбрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдирд┐рдпрддрд╛рддреНрдордХ JSON рдорд░рдореНрдорддред | | | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat тЖФ DSH рдмреНрд░рд┐рдЬ (Tencent iLink bot): рдЯреЗрдХреНрд╕реНрдЯ/рдЗрдореЗрдЬ/рдлрд╝рд╛рдЗрд▓/рдЖрд╡рд╛рдЬрд╝, рдЪреИрдЯ рдореЗрдВ рдЕрдиреБрдореЛрджрди | | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | | | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | | | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | | | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | | | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | | | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | | | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | | | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/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-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | | | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | | ## License [Apache License 2.0](LICENSE) ┬й 2026 dsh-talk contributors ### DSH Desktop рдорд╛рд░реНрдХреЗрдЯ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рд╕рднреА PerryLink рдкреНрд▓рдЧрдЗрди DSH Desktop рдХреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: **Market тЖТ Sources тЖТ add source тЖТ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **тЖТ рдЪреБрдиреЗрдВ**ред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдорд╛рд░реНрдХреЗрдЯ рдХреЗ npm-identity рд╕рддреНрдпрд╛рдкрди рдФрд░ рдЖрдкрдХреА рдкреБрд╖реНрдЯрд┐ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред