@drakulavich/kesha-voice-kit 1.18.6 → 1.19.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -96,10 +96,10 @@ Each segment gets a `speaker` integer (cluster ID, stable within one file). Linu
96
96
 
97
97
  ## Text-to-speech
98
98
 
99
- Kesha speaks back via Kokoro-82M (English) and Vosk-TTS (Russian) — voice auto-picks from the text's language. On darwin-arm64, Kokoro uses FluidAudio CoreML instead of ONNX:
99
+ Kesha speaks back via Kokoro-82M (English) and Vosk-TTS (Russian) — voice auto-picks from the text's language. On darwin-arm64, Kokoro uses FluidAudio CoreML instead of ONNX; FluidAudio stores that CoreML cache at `~/.cache/fluidaudio/Models/kokoro`, outside Kesha's pinned model cache:
100
100
 
101
101
  ```bash
102
- kesha install --tts # ~990MB (Kokoro + Vosk-TTS RU, opt-in)
102
+ kesha install --tts # TTS, opt-in; Darwin Kokoro uses FluidAudio cache
103
103
  kesha say "Hello, world" > hello.wav
104
104
  kesha say "Привет, мир" > privet.wav # auto-routes (Milena on darwin, ru-vosk-m02 elsewhere)
105
105
  ```
@@ -236,6 +236,50 @@ Compared against Whisper `large-v3-turbo` — all engines auto-detect language.
236
236
 
237
237
  See [BENCHMARK.md](BENCHMARK.md) for the full per-file breakdown (Russian + English).
238
238
 
239
+ ## Architecture
240
+
241
+ ```text
242
+ Users / agents
243
+ shell | scripts | OpenClaw | Hermes | Raycast | @drakulavich/kesha-voice-kit/core
244
+ |
245
+ v
246
+ +------------------------------- Kesha CLI -------------------------------+
247
+ | Bun + TypeScript wrapper |
248
+ | - parses commands and formats stdout/stderr |
249
+ | - installs pinned engine/model assets only when explicitly requested |
250
+ | - keeps cache, support bundles, and local Stats in the CLI |
251
+ +-----------------------------------+-------------------------------------+
252
+ |
253
+ | spawns one local process
254
+ v
255
+ +----------------------------- kesha-engine ------------------------------+
256
+ | Rust binary, no cloud calls, no Python, no ffmpeg |
257
+ | |
258
+ | Audio input Text input Diagnostics |
259
+ | WAV/MP3/OGG/FLAC/AAC/M4A plain text / SSML status/support |
260
+ | | | | |
261
+ | v v v |
262
+ | Symphonia decode TTS preprocessing runtime probes |
263
+ | | | |
264
+ | +--> optional VAD +--> voice routing |
265
+ | | + diarization | Kokoro / Vosk / macOS voices |
266
+ | | | |
267
+ | +--> audio lang ID +--> speech synthesis |
268
+ | | SpeechBrain ONNX |
269
+ | | |
270
+ | +--> ASR backend |
271
+ | CoreML on Apple Silicon |
272
+ | ONNX Runtime on Linux/Windows/fallback |
273
+ +-----------------------------------+-------------------------------------+
274
+ |
275
+ v
276
+ transcript | JSON/TOON | WAV | local diagnostics
277
+ ```
278
+
279
+ Cache boundary: `kesha install` and opt-in feature installs populate the local
280
+ cache; ordinary transcription and speech commands fail fast if required assets
281
+ are missing.
282
+
239
283
  ## What's Inside
240
284
 
241
285
  | Model | Task | Size | Source |
@@ -244,7 +288,7 @@ See [BENCHMARK.md](BENCHMARK.md) for the full per-file breakdown (Russian + Engl
244
288
  | SpeechBrain ECAPA-TDNN | Audio language detection | ~86MB | [HuggingFace](https://huggingface.co/speechbrain/lang-id-voxlingua107-ecapa) |
245
289
  | Apple NLLanguageRecognizer | Text language detection | built-in | macOS system framework |
246
290
  | Silero VAD v5 (opt-in) | Voice activity detection | ~2.3MB | [snakers4/silero-vad](https://github.com/snakers4/silero-vad) |
247
- | Kokoro-82M / Vosk-TTS (opt-in) | Text-to-speech | ~990MB | [FluidAudio Kokoro](https://github.com/FluidInference/FluidAudio) on darwin-arm64; ONNX Kokoro elsewhere · [Vosk-TTS](https://github.com/alphacep/vosk-tts) |
291
+ | Kokoro-82M / Vosk-TTS (opt-in) | Text-to-speech | ~990MB | [FluidAudio Kokoro](https://github.com/FluidInference/FluidAudio) on darwin-arm64 (FluidAudio cache, not Kesha-verified); ONNX Kokoro elsewhere · [Vosk-TTS](https://github.com/alphacep/vosk-tts) |
248
292
 
249
293
  All models run through `kesha-engine` — a Rust binary using [FluidAudio](https://github.com/FluidInference/FluidAudio) (CoreML) on Apple Silicon and [ort](https://github.com/pykeio/ort) (ONNX Runtime) on other platforms.
250
294
 
@@ -277,9 +321,23 @@ Kesha can collect local diagnostics without downloading models or mutating cache
277
321
  ```bash
278
322
  kesha doctor --json --redact
279
323
  kesha support-bundle --output kesha-support.tar.gz
324
+ kesha support-bundle --include-logs --output kesha-support-with-logs.tar.gz
325
+ kesha logs status
326
+ kesha logs status --json
280
327
  ```
281
328
 
282
329
  `support-bundle` creates a redacted `.tar.gz` archive for GitHub issues. It includes runtime, engine, cache, optional-component, Stats status, and known Kesha environment settings. It does not include audio, transcripts, model files, or the Stats database.
330
+ Diagnostic log contents are excluded by default; pass `--include-logs` to add a
331
+ bounded tail of Kesha's privacy-safe NDJSON diagnostic log.
332
+
333
+ `kesha logs` manages local, rotated diagnostic logs for troubleshooting. Logs
334
+ default to `retain-on-failure` and also support explicit `off` and `on` modes.
335
+ Use `kesha logs status --json` for a stable machine-readable status contract
336
+ covering the active path, mode, size, rotation settings, and rotated-file list.
337
+ They use content-free NDJSON events: command/stage names, versions, durations,
338
+ exit codes, and coarse audio metadata only. They must not store audio,
339
+ transcripts, input text, generated speech text, file names, full paths, raw
340
+ stdout/stderr, environment variables, tokens, or URLs. See [Diagnostic logs](docs/diagnostic-logs.md).
283
341
 
284
342
  ## Local Stats privacy and lifecycle
285
343
 
package/SKILL.md CHANGED
@@ -22,8 +22,8 @@ Local voice toolkit: transcribe voice messages to text, synthesize speech, detec
22
22
  ## When to use
23
23
 
24
24
  - **Voice memo arrived** (Telegram, WhatsApp, Slack, Signal .ogg/.opus/.m4a): transcribe with `kesha --json <path>` and branch on the detected language.
25
- - **Need to reply with audio (file playback)**: synthesize with `kesha say "<text>" > reply.wav`. Auto-routes by detected language (Kokoro-82M for English, Vosk-TTS for Russian). On darwin-arm64, English Kokoro uses FluidAudio CoreML instead of ONNX. For other languages and ~180 more voices use `--voice macos-*` on macOS (zero model download).
26
- - **Need to send a voice note (Telegram, WhatsApp, Signal, Discord)**: synthesize directly into the messenger-native format with `kesha say "<text>" --format ogg-opus --out reply.ogg`. Default is mono 24 kHz @ 32 kbps — what Telegram `sendVoice` expects. No `ffmpeg` round-trip needed.
25
+ - **Need to send a voice note (Telegram, WhatsApp, Signal, Discord)**: synthesize directly into messenger-native OGG/Opus with `kesha say --format ogg-opus --out reply.ogg "<text>"`. Default is mono 24 kHz @ 32 kbps - what Telegram `sendVoice` expects. No WAV redirect and no `ffmpeg` round-trip.
26
+ - **Need local file playback/debug output**: WAV is still available with `kesha say --out reply.wav "<text>"`, but do not use WAV for Telegram voice replies. Auto-routes by detected language (Kokoro-82M for English, Vosk-TTS for Russian). On darwin-arm64, English Kokoro uses FluidAudio CoreML instead of ONNX. For other languages and ~180 more voices use `--voice macos-*` on macOS (zero model download).
27
27
  - **Need to detect what language a file is in** before choosing a pipeline: `kesha --json audio.ogg` returns both audio-based and text-based language detection with confidence scores.
28
28
 
29
29
  ## OpenClaw plugin setup
@@ -79,6 +79,33 @@ openclaw config get tools.media.audio.echoFormat
79
79
 
80
80
  Do not rely on `openclaw.plugin.json` to patch `tools.media.audio.models`; OpenClaw ignores non-schema fields such as `configPatch`. Keep the CLI route in user config.
81
81
 
82
+ For OpenClaw TTS replies, route the local TTS provider to Kesha OGG/Opus output. This is the Telegram-safe path:
83
+
84
+ ```bash
85
+ openclaw config patch --stdin <<'JSON5'
86
+ {
87
+ messages: {
88
+ tts: {
89
+ auto: "always",
90
+ provider: "tts-local-cli",
91
+ providers: {
92
+ "tts-local-cli": {
93
+ command: "kesha",
94
+ args: ["say", "--format", "ogg-opus", "--out", "{{OutputPath}}", "{{Text}}"],
95
+ outputFormat: "opus",
96
+ timeoutMs: 120000,
97
+ },
98
+ },
99
+ },
100
+ },
101
+ }
102
+ JSON5
103
+ ```
104
+
105
+ When invoking Kesha manually from an OpenClaw flow, write OGG/Opus into an OpenClaw-owned temp path, for example `kesha say --format ogg-opus --out /tmp/openclaw/reply.ogg "<text>"`, after ensuring the directory exists. The configured `tts-local-cli` provider should use OpenClaw's `{{OutputPath}}` placeholder instead of a hardcoded path.
106
+
107
+ Do not configure OpenClaw Telegram TTS as `kesha say "<text>" > reply.wav`; that creates a WAV file and will not render as a native Telegram voice note.
108
+
82
109
  ## STT: transcribe audio
83
110
 
84
111
  ```bash
@@ -135,14 +162,14 @@ kesha say --voice macos-de-DE "Guten Tag" > de.wav # any macOS system voice —
135
162
  kesha say --list-voices # Kokoro + Vosk-TTS + ~180 macos-* voices
136
163
  ```
137
164
 
138
- Output: WAV mono float32 by default. `--out <path>` writes to a file instead of stdout.
165
+ Output: WAV mono float32 by default. `--out <path>` writes to a file instead of stdout. For Telegram/OpenClaw replies, prefer `--format ogg-opus --out reply.ogg` or the OpenClaw-provided `{{OutputPath}}`.
139
166
 
140
167
  **Voice notes (Telegram / WhatsApp / Signal / Discord):** add `--format ogg-opus` to emit OGG/Opus directly — the format messenger APIs render as a native voice message:
141
168
 
142
169
  ```bash
143
- kesha say "Hello there" --format ogg-opus --out reply.ogg # 24 kHz @ 32 kbps mono — Telegram-grade
144
- kesha say "Привет" --voice ru-vosk-m02 --format ogg-opus --out reply.ogg # Russian voice note
145
- kesha say "Hi" --format ogg-opus --bitrate 16000 --out tiny.ogg # tinier file, intelligible but lossy
170
+ kesha say --format ogg-opus --out reply.ogg "Hello there" # 24 kHz @ 32 kbps mono - Telegram-grade
171
+ kesha say --voice ru-vosk-m02 --format ogg-opus --out reply.ogg "Привет" # Russian voice note
172
+ kesha say --format ogg-opus --bitrate 16000 --out tiny.ogg "Hi" # tinier file, intelligible but lossy
146
173
  ```
147
174
 
148
175
  Format is also inferred from `--out` extension (`.ogg` / `.opus` / `.oga` → OGG/Opus). `--bitrate` (6 000–510 000 bps) and `--sample-rate` (8 000 / 12 000 / 16 000 / 24 000 / 48 000 Hz) tune the encoder.
@@ -6,7 +6,7 @@ _kesha_completion() {
6
6
  COMPREPLY=()
7
7
  cur="${COMP_WORDS[COMP_CWORD]}"
8
8
  command="${COMP_WORDS[1]}"
9
- commands="completions doctor install manpage record say stats status support-bundle"
9
+ commands="completions doctor init install logs manpage record say stats status support-bundle"
10
10
 
11
11
  if [[ "$COMP_CWORD" -eq 1 ]]; then
12
12
  if [[ "$cur" == -* ]]; then
@@ -20,13 +20,15 @@ _kesha_completion() {
20
20
  case "$command" in
21
21
  completions) opts="--help -h" ;;
22
22
  doctor) opts="--help -h --json --redact" ;;
23
+ init) opts="--help -h --coreml --onnx --no-cache --plan --yes --tts --vad --diarize" ;;
23
24
  install) opts="--help -h --coreml --onnx --no-cache --plan --tts --vad --diarize" ;;
25
+ logs) opts="--help -h --json" ;;
24
26
  manpage) opts="--help -h" ;;
25
27
  record) opts="--help -h --out --max-seconds --debug" ;;
26
28
  say) opts="--help -h --voice --lang --out --rate --list-voices --ssml --format --bitrate --sample-rate --no-expand-abbrev --verbose --debug" ;;
27
29
  stats) opts="--help -h --format" ;;
28
30
  status) opts="--help -h --disk" ;;
29
- support-bundle) opts="--help -h --output" ;;
31
+ support-bundle) opts="--help -h --output --include-logs" ;;
30
32
  *) opts="--help -h --version -v --json --toon --timestamps --speakers --include-errors --verbose --format --lang --debug --vad --no-vad" ;;
31
33
  esac
32
34
 
@@ -2,7 +2,9 @@
2
2
  complete -c kesha -f
3
3
  complete -c kesha -n '__fish_use_subcommand' -a 'completions' -d 'Print shell completion script for bash, zsh, or fish'
4
4
  complete -c kesha -n '__fish_use_subcommand' -a 'doctor' -d 'Collect support diagnostics without changing local state'
5
+ complete -c kesha -n '__fish_use_subcommand' -a 'init' -d 'Interactive setup guide for Kesha features'
5
6
  complete -c kesha -n '__fish_use_subcommand' -a 'install' -d 'Download inference engine and models'
7
+ complete -c kesha -n '__fish_use_subcommand' -a 'logs' -d 'Manage local privacy-safe diagnostic logs'
6
8
  complete -c kesha -n '__fish_use_subcommand' -a 'manpage' -d 'Print the kesha(1) manpage'
7
9
  complete -c kesha -n '__fish_use_subcommand' -a 'record' -d 'Record microphone audio to a WAV file'
8
10
  complete -c kesha -n '__fish_use_subcommand' -a 'say' -d 'Synthesize speech from text (TTS). Writes audio to stdout (or --out file). Defaults to WAV; use --format ogg-opus for messenger-ready voice notes.'
@@ -30,6 +32,16 @@ complete -c kesha -n '__fish_seen_subcommand_from doctor' -l help -d 'Show help'
30
32
  complete -c kesha -n '__fish_seen_subcommand_from doctor' -s h -d 'Show help'
31
33
  complete -c kesha -n '__fish_seen_subcommand_from doctor' -l json -d 'Output diagnostics as JSON'
32
34
  complete -c kesha -n '__fish_seen_subcommand_from doctor' -l redact -d 'Redact secrets and user-home paths from diagnostic output'
35
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l help -d 'Show help'
36
+ complete -c kesha -n '__fish_seen_subcommand_from init' -s h -d 'Show help'
37
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l coreml -d 'Preselect CoreML backend (macOS arm64)'
38
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l onnx -d 'Preselect ONNX backend'
39
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l no-cache -d 'Re-download even if cached'
40
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l plan -d 'Show the selected install plan without downloading'
41
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l yes -d 'Accept defaults and run without prompts'
42
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l tts -d 'Preselect TTS models (Kokoro EN + Vosk-TTS RU, ~990MB)'
43
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l vad -d 'Preselect Silero VAD (~2.3MB) for long-audio preprocessing'
44
+ complete -c kesha -n '__fish_seen_subcommand_from init' -l diarize -d 'Preselect Sortformer speaker diarization (~245MB, darwin-arm64 only)'
33
45
  complete -c kesha -n '__fish_seen_subcommand_from install' -l help -d 'Show help'
34
46
  complete -c kesha -n '__fish_seen_subcommand_from install' -s h -d 'Show help'
35
47
  complete -c kesha -n '__fish_seen_subcommand_from install' -l coreml -d 'Force CoreML backend (macOS arm64)'
@@ -39,6 +51,9 @@ complete -c kesha -n '__fish_seen_subcommand_from install' -l plan -d 'Show down
39
51
  complete -c kesha -n '__fish_seen_subcommand_from install' -l tts -d 'Also install TTS models (Kokoro EN + Vosk-TTS RU, ~990MB)'
40
52
  complete -c kesha -n '__fish_seen_subcommand_from install' -l vad -d 'Also install Silero VAD (~2.3MB) for long-audio preprocessing'
41
53
  complete -c kesha -n '__fish_seen_subcommand_from install' -l diarize -d 'Also install the Sortformer streaming-diarization model (~245MB, darwin-arm64 only — #199)'
54
+ complete -c kesha -n '__fish_seen_subcommand_from logs' -l help -d 'Show help'
55
+ complete -c kesha -n '__fish_seen_subcommand_from logs' -s h -d 'Show help'
56
+ complete -c kesha -n '__fish_seen_subcommand_from logs' -l json -d 'Output status as JSON'
42
57
  complete -c kesha -n '__fish_seen_subcommand_from manpage' -l help -d 'Show help'
43
58
  complete -c kesha -n '__fish_seen_subcommand_from manpage' -s h -d 'Show help'
44
59
  complete -c kesha -n '__fish_seen_subcommand_from record' -l help -d 'Show help'
@@ -69,3 +84,4 @@ complete -c kesha -n '__fish_seen_subcommand_from status' -l disk -d 'Include re
69
84
  complete -c kesha -n '__fish_seen_subcommand_from support-bundle' -l help -d 'Show help'
70
85
  complete -c kesha -n '__fish_seen_subcommand_from support-bundle' -s h -d 'Show help'
71
86
  complete -c kesha -n '__fish_seen_subcommand_from support-bundle' -l output -r -d 'Write archive to this .tar.gz path'
87
+ complete -c kesha -n '__fish_seen_subcommand_from support-bundle' -l include-logs -d 'Include a bounded tail of privacy-safe diagnostic logs'
@@ -6,7 +6,9 @@ _kesha() {
6
6
  commands=(
7
7
  'completions:Print shell completion script for bash, zsh, or fish'
8
8
  'doctor:Collect support diagnostics without changing local state'
9
+ 'init:Interactive setup guide for Kesha features'
9
10
  'install:Download inference engine and models'
11
+ 'logs:Manage local privacy-safe diagnostic logs'
10
12
  'manpage:Print the kesha(1) manpage'
11
13
  'record:Record microphone audio to a WAV file'
12
14
  'say:Synthesize speech from text (TTS). Writes audio to stdout (or --out file). Defaults to WAV; use --format ogg-opus for messenger-ready voice notes.'
@@ -49,6 +51,18 @@ _kesha() {
49
51
  '--json[Output diagnostics as JSON]' \
50
52
  '--redact[Redact secrets and user-home paths from diagnostic output]'
51
53
  ;;
54
+ init)
55
+ _arguments '--help[Show help]' \
56
+ '-h[Show help]' \
57
+ '--coreml[Preselect CoreML backend (macOS arm64)]' \
58
+ '--onnx[Preselect ONNX backend]' \
59
+ '--no-cache[Re-download even if cached]' \
60
+ '--plan[Show the selected install plan without downloading]' \
61
+ '--yes[Accept defaults and run without prompts]' \
62
+ '--tts[Preselect TTS models (Kokoro EN + Vosk-TTS RU, ~990MB)]' \
63
+ '--vad[Preselect Silero VAD (~2.3MB) for long-audio preprocessing]' \
64
+ '--diarize[Preselect Sortformer speaker diarization (~245MB, darwin-arm64 only)]'
65
+ ;;
52
66
  install)
53
67
  _arguments '--help[Show help]' \
54
68
  '-h[Show help]' \
@@ -60,6 +74,11 @@ _kesha() {
60
74
  '--vad[Also install Silero VAD (~2.3MB) for long-audio preprocessing]' \
61
75
  '--diarize[Also install the Sortformer streaming-diarization model (~245MB, darwin-arm64 only — #199)]'
62
76
  ;;
77
+ logs)
78
+ _arguments '--help[Show help]' \
79
+ '-h[Show help]' \
80
+ '--json[Output status as JSON]'
81
+ ;;
63
82
  manpage)
64
83
  _arguments '--help[Show help]' \
65
84
  '-h[Show help]'
@@ -100,7 +119,8 @@ _kesha() {
100
119
  support-bundle)
101
120
  _arguments '--help[Show help]' \
102
121
  '-h[Show help]' \
103
- '--output=[Write archive to this .tar.gz path]:output:'
122
+ '--output=[Write archive to this .tar.gz path]:output:' \
123
+ '--include-logs[Include a bounded tail of privacy-safe diagnostic logs]'
104
124
  ;;
105
125
  *)
106
126
  _arguments '--help[Show help]' \
@@ -0,0 +1,93 @@
1
+ # Diagnostic Logs
2
+
3
+ Kesha diagnostic logs are local, rotated NDJSON event logs for install, engine,
4
+ and runtime troubleshooting. They are separate from Kesha Stats: Stats stores
5
+ aggregate timings in SQLite after explicit opt-in, while diagnostic logs keep a
6
+ small local ring buffer of structured events.
7
+
8
+ Diagnostic logs default to `retain-on-failure`: passing commands leave no log
9
+ file, while failed commands can preserve a small local trace for debugging.
10
+
11
+ ```bash
12
+ kesha logs status
13
+ kesha logs status --json
14
+ kesha logs enable
15
+ kesha logs disable
16
+ kesha logs mode retain-on-failure
17
+ kesha logs path
18
+ kesha logs reset
19
+ ```
20
+
21
+ ## Modes
22
+
23
+ Diagnostic logs follow a Playwright-style retention model:
24
+
25
+ - `off`: do not record diagnostic events.
26
+ - `on`: append events to the rotated local log immediately.
27
+ - `retain-on-failure`: buffer events for the current command and write them only
28
+ if the command fails. This is the default.
29
+
30
+ `kesha logs enable` is shorthand for `kesha logs mode on`; `kesha logs disable`
31
+ is shorthand for `kesha logs mode off`. `retain-on-failure` keeps passing runs
32
+ artifact-free while failed runs keep enough context to debug.
33
+
34
+ `kesha logs status --json` prints the same local status as a stable JSON object:
35
+ `dir`, `activePath`, `statePath`, `exists`, `activeSizeBytes`, `rotatedFiles`,
36
+ `totalSizeBytes`, `mode`, `maxBytes`, and `retain`.
37
+
38
+ ## Privacy Contract
39
+
40
+ Diagnostic logs are content-free. Event payloads are built from an allowlist of
41
+ typed fields such as command name, app version, platform, backend, feature flags,
42
+ stage names, exit codes, duration numbers, and stable error codes.
43
+
44
+ When enabled, `kesha install`, `kesha <audio>`, and `kesha say` record command
45
+ lifecycle events such as `command.start`, `input.audio`, `input.missing`,
46
+ `engine.exit`, and `command.finish`. These events use only counts, booleans,
47
+ format extensions, duration milliseconds, and bucket labels. In the default
48
+ `retain-on-failure` mode, successful runs still leave no log file behind.
49
+
50
+ Diagnostic logs must not store:
51
+
52
+ - audio bytes
53
+ - transcripts
54
+ - input text or generated speech text
55
+ - file names, basenames, or full file paths
56
+ - raw stdout or stderr
57
+ - environment variables
58
+ - URLs, tokens, secrets, API keys, or cloud identifiers
59
+ - model files or model contents
60
+
61
+ For audio shape, logs should use coarse metadata such as extension, duration
62
+ bucket, size bucket, sample-rate bucket, or channel count. Do not log a path or
63
+ basename even when it looks harmless; names like `therapy-session.m4a` can be
64
+ private.
65
+
66
+ ## Storage
67
+
68
+ Default paths:
69
+
70
+ - macOS: `~/Library/Logs/kesha/kesha.ndjson`
71
+ - Linux: `${XDG_STATE_HOME:-~/.local/state}/kesha/logs/kesha.ndjson`
72
+ - Windows: `%LOCALAPPDATA%\kesha\logs\kesha.ndjson`
73
+
74
+ Set `KESHA_LOG_DIR` to override the directory. The active file is
75
+ `kesha.ndjson`; rotated files are named `kesha.1.ndjson`, `kesha.2.ndjson`, and
76
+ so on.
77
+
78
+ The first implementation rotates at 10 MB and keeps 5 rotated files. `kesha logs
79
+ reset` deletes Kesha log files but preserves the selected mode.
80
+
81
+ ## Support Bundles
82
+
83
+ `kesha support-bundle` does not include diagnostic log contents by default. Use
84
+ `kesha support-bundle --include-logs` to add a bounded tail of the active
85
+ already-sanitized NDJSON log when a support issue needs recent command events.
86
+ Recommended flow for a bug report:
87
+
88
+ ```bash
89
+ kesha logs status
90
+ kesha logs mode retain-on-failure
91
+ # reproduce the failure
92
+ kesha support-bundle --include-logs --output kesha-support-with-logs.tar.gz
93
+ ```
package/man/kesha.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH KESHA 1 "May 2026" "kesha 1.18.6" "User Commands"
1
+ .TH KESHA 1 "May 2026" "kesha 1.19.0-beta.2" "User Commands"
2
2
  .SH NAME
3
3
  kesha \- open-source local voice toolkit
4
4
  .SH SYNOPSIS
@@ -17,9 +17,15 @@ Print shell completion script for bash, zsh, or fish
17
17
  .B doctor
18
18
  Collect support diagnostics without changing local state
19
19
  .TP
20
+ .B init
21
+ Interactive setup guide for Kesha features
22
+ .TP
20
23
  .B install
21
24
  Download inference engine and models
22
25
  .TP
26
+ .B logs
27
+ Manage local privacy\-safe diagnostic logs
28
+ .TP
23
29
  .B manpage
24
30
  Print the kesha(1) manpage
25
31
  .TP
@@ -79,6 +85,31 @@ Output diagnostics as JSON
79
85
  .TP
80
86
  .B \-\-redact
81
87
  Redact secrets and user\-home paths from diagnostic output
88
+ .SS init
89
+ .TP
90
+ .B \-\-coreml
91
+ Preselect CoreML backend (macOS arm64)
92
+ .TP
93
+ .B \-\-onnx
94
+ Preselect ONNX backend
95
+ .TP
96
+ .B \-\-no\-cache
97
+ Re\-download even if cached
98
+ .TP
99
+ .B \-\-plan
100
+ Show the selected install plan without downloading
101
+ .TP
102
+ .B \-\-yes
103
+ Accept defaults and run without prompts
104
+ .TP
105
+ .B \-\-tts
106
+ Preselect TTS models (Kokoro EN + Vosk\-TTS RU, ~990MB)
107
+ .TP
108
+ .B \-\-vad
109
+ Preselect Silero VAD (~2.3MB) for long\-audio preprocessing
110
+ .TP
111
+ .B \-\-diarize
112
+ Preselect Sortformer speaker diarization (~245MB, darwin\-arm64 only)
82
113
  .SS install
83
114
  .TP
84
115
  .B \-\-coreml
@@ -101,6 +132,10 @@ Also install Silero VAD (~2.3MB) for long\-audio preprocessing
101
132
  .TP
102
133
  .B \-\-diarize
103
134
  Also install the Sortformer streaming\-diarization model (~245MB, darwin\-arm64 only — #199)
135
+ .SS logs
136
+ .TP
137
+ .B \-\-json
138
+ Output status as JSON
104
139
  .SS record
105
140
  .TP
106
141
  .B \-\-out
@@ -160,6 +195,9 @@ Include recursive cache disk usage
160
195
  .TP
161
196
  .B \-\-output
162
197
  Write archive to this .tar.gz path
198
+ .TP
199
+ .B \-\-include\-logs
200
+ Include a bounded tail of privacy\-safe diagnostic logs
163
201
  .SH FILES
164
202
  .TP
165
203
  .B completions/kesha.bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drakulavich/kesha-voice-kit",
3
- "version": "1.18.6",
3
+ "version": "1.19.0-beta.2",
4
4
  "description": "Give your local tools a voice: fast STT in 25 languages (~19x faster than Whisper on Apple Silicon, ONNX CPU fallback), TTS via Kokoro/Vosk/macOS voices, VAD + 107-language detection. Rust engine, Bun CLI, OpenClaw skill.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,9 +19,9 @@
19
19
  "tsconfig.json",
20
20
  "openclaw.plugin.json",
21
21
  "openclaw-plugin.cjs",
22
+ "docs/diagnostic-logs.md",
22
23
  "docs/product-positioning.md",
23
24
  "SKILL.md",
24
- "scripts/postinstall.cjs",
25
25
  "LICENSE",
26
26
  "NOTICES.md",
27
27
  "README.md"
@@ -32,7 +32,7 @@
32
32
  ]
33
33
  },
34
34
  "keshaEngine": {
35
- "version": "1.18.6"
35
+ "version": "1.19.0-beta.2"
36
36
  },
37
37
  "scripts": {
38
38
  "test": "bun test",
@@ -49,8 +49,7 @@
49
49
  "check": "bun run lint && bun run check:versions && bun run test:cli-fast",
50
50
  "check:workflows": "bun .github/scripts/check-workflows.ts",
51
51
  "check:release-manifest": "bun .github/scripts/release-manifest.mjs --check",
52
- "check:versions": "bun .github/scripts/check-versions.ts",
53
- "postinstall": "node scripts/postinstall.cjs"
52
+ "check:versions": "bun .github/scripts/check-versions.ts"
54
53
  },
55
54
  "keywords": [
56
55
  "asr",
@@ -4,7 +4,9 @@ import { log } from "../log";
4
4
  import { suggestCommand } from "../suggest-command";
5
5
  import { completionsCommand } from "./completions";
6
6
  import { doctorCommand } from "./doctor";
7
+ import { initCommand } from "./init";
7
8
  import { installCommand } from "./install";
9
+ import { logsCommand } from "./logs";
8
10
  import { manpageCommand } from "./manpage";
9
11
  import { recordCommand } from "./record";
10
12
  import { sayCommand } from "./say";
@@ -15,7 +17,9 @@ import { mainCommand } from "./main";
15
17
 
16
18
  const SUBCOMMANDS = [
17
19
  "doctor",
20
+ "init",
18
21
  "install",
22
+ "logs",
19
23
  "status",
20
24
  "record",
21
25
  "say",
@@ -37,6 +41,11 @@ export async function runCli(rawArgs = process.argv.slice(2)): Promise<void> {
37
41
  return;
38
42
  }
39
43
 
44
+ if (firstArg === "init") {
45
+ await runMain(initCommand, { rawArgs: restArgs });
46
+ return;
47
+ }
48
+
40
49
  if (firstArg === "completions") {
41
50
  await runMain(completionsCommand, { rawArgs: restArgs });
42
51
  return;
@@ -47,6 +56,11 @@ export async function runCli(rawArgs = process.argv.slice(2)): Promise<void> {
47
56
  return;
48
57
  }
49
58
 
59
+ if (firstArg === "logs") {
60
+ await runMain(logsCommand, { rawArgs: restArgs });
61
+ return;
62
+ }
63
+
50
64
  if (firstArg === "manpage") {
51
65
  await runMain(manpageCommand, { rawArgs: restArgs });
52
66
  return;