# ЁЯОЩя╕П dsh-talk
**DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЙрдЗрд╕-рдлрд░реНрд╕реНрдЯ рд╕рддреНрд░ рд▓реВрдк: рдЙрд╕рд╕реЗ рдмреЛрд▓реЗрдВ рдФрд░ рдЙрддреНрддрд░ рд╕реБрдиреЗрдВред**
*рдорд╛рдЗрдХ рджрдмрд╛рдПрдБ, рдмреЛрд▓реЗрдВ рдФрд░ рдЬрд╡рд╛рдм рдЬрд╝реЛрд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ тАФ рдмреЛрд▓рддреЗ рд╣реА рд░реБрдХрд╛рд╡рдЯред*
[](LICENSE)
[](https://github.com/topics/dsh-plugin)
[](#)
[](https://github.com/PerryLink/dsh-talk/actions)
[](https://github.com/PerryLink/dsh-talk/releases)
[](https://www.npmjs.com/package/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