# ЁЯОЩя╕П dsh-talk **DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЙрдЗрд╕-рдлрд░реНрд╕реНрдЯ рд╕рддреНрд░ рд▓реВрдк: рдЙрд╕рд╕реЗ рдмреЛрд▓реЗрдВ рдФрд░ рдЙрддреНрддрд░ рд╕реБрдиреЗрдВред** *рдорд╛рдЗрдХ рджрдмрд╛рдПрдБ, рдмреЛрд▓реЗрдВ рдФрд░ рдЬрд╡рд╛рдм рдЬрд╝реЛрд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ тАФ рдмреЛрд▓рддреЗ рд╣реА рд░реБрдХрд╛рд╡рдЯред* [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![DSH plugin](https://img.shields.io/badge/dsh-plugin-тЬЕ-green)](https://github.com/topics/dsh-plugin) [![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 `0.1.0-rc.6` | | Node | `^22.19.0 \|\| >=24.0.0` | | рдмреНрд░рд╛рдЙрдЬрд╝рд░ | Web Speech + MediaRecorder (Chrome/Edge рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда); рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП host рдХреЗ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди/TTS рдЗрдВрдЬрди | ## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ `dsh-talk` рд╡реЙрдЗрд╕ рд▓реВрдк рдХреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрдВрдж рдХрд░рддрд╛ рд╣реИ: - **`speak` рдЯреВрд▓** тАФ рдПрдЬреЗрдВрдЯ рдЕрдкрдиреЗ рдЙрддреНрддрд░ рдЬрд╝реЛрд░ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред TTS рдЗрдВрдЬрди: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕, `edge-tts` (рдиреЗрдЯрд╡рд░реНрдХ рдиреНрдпреВрд░рд▓ рд╡реЙрдЗрд╕) рдпрд╛ `piper` (рд╕реНрдерд╛рдиреАрдп)ред рдСрдбрд┐рдпреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдмрдЬрддрд╛ рд╣реИ; рд╕рддреНрд░ рд▓реЙрдЧ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХреА рдЧрдИ рдмрд╛рдд рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред - **рдХрдВрдкреЛрдЬрд╝рд░ рдорд╛рдЗрдХ рдмрдЯрди** тАФ рджрдмрд╛рдПрдБ, рдмреЛрд▓реЗрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдЗрдирдкреБрдЯ рдмреЙрдХреНрд╕ рдореЗрдВ рднрд░ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рд╕реАрдзреЗ рд╕рдмрдорд┐рдЯ рд╣реЛрддрд╛ рд╣реИ)ред 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 = рдбреНрд░рд╛рдлреНрдЯ рднрд░реЗрдВ) | | `stt.engine` | `auto` | `auto` / `web` / `funasr` / `whisper`; auto рдкрд╣рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЬрди, рдлрд┐рд░ Web Speech | | `stt.language` | `auto` | BCP-47 рднрд╛рд╖рд╛ рдпрд╛ `auto` | | `stt.interim` | `true` | рдЕрдВрддрд░рд┐рдо рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рджрд┐рдЦрд╛рдПрдБ (Web Speech) | | `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.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) | ## рдЯреВрд▓ рдФрд░ рд╕рддрд╣реЗрдВ | рд╕рддрд╣ | рдкреНрд░рдХрд╛рд░ | рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ | |---|---|---| | `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 рдиреЗрдорд╕реНрдкреЗрд╕) | ## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛ - **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: рдкреНрд▓рдЧрдЗрди рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯ-рд╕реАрдорд┐рдд рдЗрди-рдореЗрдореЛрд░реА рдСрдбрд┐рдпреЛ рдХреИрд╢ рд░рдЦрддрд╛ рд╣реИ; рдорд╛рдЗрдХ рдЕрдиреБрдорддрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░-рдордзреНрдпрд╕реНрде рд╣реИред рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯреИрдм рдХреЗрд╡рд▓ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрдЪ рдЦрдВрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдмреИрдХрдЕрдк рд╕рд╣рд┐рдд) тАФ рдлрд╝рд╛рдЗрд▓ рдХрднреА рджреЛрдмрд╛рд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ред - **рдбреЗрдЯрд╛**: рдСрдбрд┐рдпреЛ рдХрднреА рдореЙрдбрд▓ рд╕рдВрджрд░реНрдн рдпрд╛ рд╕рддреНрд░ рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддрд╛ред `dsh-talk/speech` рдЗрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рдЙрдЪреНрдЪрд╛рд░рдг id, рдЗрдВрдЬрди, рдХрд╛рд░рдг, рдЖрдХрд╛рд░ рдФрд░ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдЯреЗрдХреНрд╕реНрдЯ рд░рдЦрддрд╛ рд╣реИред рд╣рд░ рдбрд┐рд╕реНрдкреНрд▓реЗ/рд▓реЙрдЧ рд╕рддрд╣ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓, JWT, bearer рд╣реЗрдбрд░ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рдкрдереЛрдВ рдХреЛ рд░рд┐рдбреИрдХреНрдЯ рдХрд░рддреА рд╣реИред - **рдиреЗрдЯрд╡рд░реНрдХ**: рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЗрдВрдЬрди рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ (edge-tts рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рдВрдереЗрд╕рд┐рд╕, FunASR рдПрдВрдбрдкреЙрдЗрдВрдЯ); рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реЙрдЗрд╕ рдФрд░ Web Speech рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реА рд░рд╣рддреЗ рд╣реИрдВред ## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ - **рдореЙрдбрд▓-рджреГрд╢реНрдп тЯ║ рд▓реЙрдЧреНрдб** тАФ рдореЙрдбрд▓ рдХреЗрд╡рд▓ speak рдЯреВрд▓ рдХрд╛ рдХреИрдирдирд┐рдХрд▓ рдорд╛рди рджреЗрдЦрддрд╛ рд╣реИ; рд╣рд░ рдЙрдЪреНрдЪрд╛рд░рдг рд╕рддреНрд░ рд▓реЙрдЧ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдпреЛрдЧреНрдп рд╣реИред - **рд╕реНрд╡реАрдХреГрддрд┐ рдШреЛрд╖рдгрд╛рдПрдБ рдХрднреА рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреАрдВ** тАФ `approval/request` рд▓рд┐рд╕рдирд░ рд╣рдореЗрд╢рд╛ `next()` рдмреБрд▓рд╛рддрд╛ рд╣реИред - **рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб рдЖрдЙрдЯрдкреБрдЯ** тАФ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рдСрдбрд┐рдпреЛ рдкрде рд▓реЙрдЧ рдпрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддреЗред - **Fail loud** тАФ рдЕрдорд╛рдиреНрдп рдЗрдВрдЬрди, рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдорд╛рди рдФрд░ рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдореЙрдбрд▓/рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рдЗрдВрдЬрди рдорд╛рдЙрдВрдЯ рдкрд░ рдЕрд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред ## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ - **рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди**: Web Speech рдФрд░ MediaRecorder рдХреНрд╖рдорддрд╛-рдкрд╣рдЪрд╛рди рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ; рдмрд┐рдирд╛ рдЙрдирдХреЗ рдмрдЯрди рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛрдиреЗ рдкрд░ host рдЗрдВрдЬрди (FunASR/whisper.cpp) рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - **рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЬрди рдЖрдкрдХреА рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВ**: `edge-tts`, `piper`, `whisper.cpp` рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдореЙрдбрд▓ рдЕрд▓рдЧ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рд╣реЛрддреЗ рд╣реИрдВред - **рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк**: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдкрдиреЗ рдиреЗрдЯрд┐рд╡ MediaRecorder рдХреЛрдбреЗрдХ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ; whisper.cpp рдХреЛ WAV рд░рд┐рдХреЙрд░реНрдбрд░ рдпрд╛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред - **рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд░реАрд▓реЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ**: рдЯреИрдм рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ; рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд░реАрд▓реЛрдб (рдпрд╛ рд╡реЗрдм-рдРрдк рдкреБрдирдГ рдЖрд░рдВрдн) рдмрджрд▓рд╛рд╡ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред ## рд╡рд┐рдХрд╛рд╕ ```sh pnpm install # node ^22.19 || >=24 pnpm run typecheck # tsc: src + tests рд╕реНрдерд╛рдиреАрдп рд╣рд╛рд░реНрдиреЗрд╕ рдЪреЗрдХрдЖрдЙрдЯ рдХреЗ рд╡рд┐рд░реБрджреНрдз pnpm run typecheck:ci # tsc рдкреНрд░рдХрд╛рд╢рд┐рдд 0.1.0-rc.6 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз (рдмрд┐рдирд╛ paths) pnpm test # vitest: 45 рдЯреЗрд╕реНрдЯ, 7 рд╕реБрдЗрдЯ 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) рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░рдХреНрд╖рд┐рдд [29 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) | Web 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 рд╕рддреНрд░, рд╕реНрдореГрддрд┐, skills рдФрд░ CLAUDE.md рдХреЛ DSH рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ | | [dsh-click](https://github.com/PerryLink/dsh-click) | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдиреЗрдЯрд┐рд╡ рдбреЗрд╕реНрдХрдЯреЙрдк рдирд┐рдпрдВрддреНрд░рдг тАФ Windows рдкрд╣рд▓реЗред | | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Web рдХрдВрдкреЛрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓-рд╢реИрд▓реА рдЗрдирдкреБрдЯ рдЗрддрд┐рд╣рд╛рд╕: рддреАрд░, Ctrl+R рдЦреЛрдЬ | | [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-github](https://github.com/PerryLink/dsh-github) | DSH рдХреЗ рд▓рд┐рдП GitHub PR/issues рдПрдХреАрдХрд░рдг, рд╣рд░ рд▓реЗрдЦрди рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд | | [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) | DeepSeek Harness рдХреЗ рд▓рд┐рдП PII рдорд╛рд╕реНрдХрд┐рдВрдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░ тАФ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдЕрдирд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдкрд░рдд рдкрд░ рдмрд╣рд╛рд▓ рдХрд░рддрд╛ рд╣реИред | | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | рдХреЗрд╡рд▓-рдкрдарди MCP рд░рдирдЯрд╛рдЗрдо рдкреИрдирд▓: /mcp рдХрдорд╛рдВрдб + рд╕реНрдерд┐рддрд┐, рдЯреВрд▓ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓рд╛ рд╕реЗрдЯрд┐рдВрдЧ рдЯреИрдм | | [dsh-memento](https://github.com/PerryLink/dsh-memento) | рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд рдХреНрд░реЙрд╕-рд╕рддреНрд░ рд╕реНрдореГрддрд┐: ctx.memory seam + SQLite + memory рдЯреВрд▓ | | [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-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | рдорд╛рдБрдЧ-рдкрд░ рдПрдЬреЗрдВрдЯ рд╕реНрдХрд┐рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд▓рдЧрдЗрди-рд╡рд┐рдХрд╛рд╕ рдЬреНрдЮрд╛рдирдХреЛрд╢ | | [dsh-score](https://github.com/PerryLink/dsh-score) | DeepSeek Harness рдкреНрд▓рдЧрдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдЖрдпрд╛рдореА рдЧреБрдгрд╡рддреНрддрд╛ рд╕реНрдХреЛрд░рд┐рдВрдЧред | | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Web рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рд╕рддреНрд░ рдкрд┐рди рдХрд░реЗрдВ, рд╕реНрдерд╛рдпреА рдХреНрд░рдо рдХреЗ рд╕рд╛рде | | [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-talk](https://github.com/PerryLink/dsh-talk)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдЖрд╡рд╛рдЬрд╝-рдкреНрд░рдердо рд╕рддреНрд░ рд▓реВрдк: рдмреЛрд▓реЗрдВ рдФрд░ рдЙрддреНрддрд░ рд╕реБрдиреЗрдВред | | [dsh-test-drive](https://github.com/PerryLink/dsh-test-drive) | DeepSeek Harness рдкреНрд▓рдЧрдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреГрдердХ рдЗрдВрд╕реНрдЯреЙрд▓-рдФрд░-рд╕реНрдореЛрдХ рдкрд░реАрдХреНрд╖рдгред | | [dsh-translate](https://github.com/PerryLink/dsh-translate) | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЗрдВрдбрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдирд┐рдпрддрд╛рддреНрдордХ JSON рдорд░рдореНрдорддред | ## License [Apache License 2.0](LICENSE) ┬й 2026 dsh-talk contributors