@goodandready/dsh-voice 0.8.12 → 0.8.14

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/lib/client.js CHANGED
@@ -343,10 +343,10 @@ window.__ModuleLoader__.load({
343
343
  '.dvo-dash-name{font-size:12px;font-weight:600;color:var(--dsw-alias-label-primary)}' +
344
344
  '.dvo-dash-row{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--dsw-alias-label-secondary)}' +
345
345
  '.dvo-badge{display:inline-flex;align-items:center;font-size:11px;padding:1px 6px;border-radius:6px;font-weight:600}' +
346
- '.dvo-badge-fast{background:rgba(16,185,129,0.15);color:#10b981}' +
347
- '.dvo-badge-norm{background:rgba(245,158,11,0.15);color:#f59e0b}' +
348
- '.dvo-badge-slow{background:rgba(249,115,22,0.15);color:#f97316}' +
349
- '.dvo-badge-err{background:rgba(239,68,68,0.15);color:#ef4444}' +
346
+ '.dvo-badge-fast{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-state-success-primary);border:1px solid var(--dsw-alias-state-success-primary)}' +
347
+ '.dvo-badge-norm{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-state-warning-primary);border:1px solid var(--dsw-alias-state-warning-primary)}' +
348
+ '.dvo-badge-slow{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-state-warning-primary);border:1px solid var(--dsw-alias-border-l2)}' +
349
+ '.dvo-badge-err{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary)}' +
350
350
  '.dvo-badge-idle{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary)}'
351
351
  const cssId = 'dsh-voice/client.module.css'
352
352
  if (typeof document !== 'undefined' && !document.querySelector('style[data-plugin-css="' + cssId + '"]')) {
@@ -736,7 +736,8 @@ window.__ModuleLoader__.load({
736
736
  rec.cutting = false
737
737
  if (blob.size < 1200) return // слишком короткий кусок — это не речь
738
738
  try {
739
- const text = await sendAudio(blob, rec.mime, 'dictation')
739
+ const out = await sendAudio(blob, rec.mime, 'dictation')
740
+ const text = out && out.text ? out.text : ''
740
741
  const delay = Number(voice.settings.sendDelayMs) || 0
741
742
  if (text && delay > 0 && !voice.holding) {
742
743
  // Отложенная вставка с окном отмены (#29-5): текст уже вставлен,
package/lib/index.js CHANGED
@@ -158,7 +158,7 @@ export const Config = z.object({
158
158
  .description('Realtime streaming provider: "openai" (OpenAI Realtime API) or "sherpa-onnx" (local streaming).'),
159
159
  realtimeModel: z.string().default('gpt-4o-realtime-preview')
160
160
  .description('Realtime model identifier.'),
161
- visualizerStyle: z.enum(['liquid-wave', 'dynamic-orb', 'bars', 'off']).default('liquid-wave')
161
+ visualizerStyle: z.union(['liquid-wave', 'dynamic-orb', 'bars', 'off']).default('liquid-wave')
162
162
  .description('Audio visualizer animation style in the recording pill: "liquid-wave", "dynamic-orb", "bars", or "off".'),
163
163
  })
164
164
 
@@ -442,7 +442,7 @@ export function apply(ctx, baseConfig) {
442
442
  realtimeProvider: cfg.realtimeProvider || 'openai',
443
443
  realtimeModel: cfg.realtimeModel || 'gpt-4o-realtime-preview',
444
444
  visualizerStyle: cfg.visualizerStyle || 'liquid-wave',
445
- providerStats: getProviderStats(),
445
+ providerStats: statsTracker.get(),
446
446
  })
447
447
  },
448
448
  }), 'dsh-voice: /status route')
@@ -565,7 +565,7 @@ export function apply(ctx, baseConfig) {
565
565
  if (info.size > cfg.maxFileBytes) {
566
566
  throw new Error(`transcribe_audio: file too large (${info.size} bytes, max ${cfg.maxFileBytes})`)
567
567
  }
568
- if (info.size < 100) throw new Error('transcribe_audio: file is empty or too small')
568
+ if (info.size < 44) throw new Error('transcribe_audio: file is empty or too small')
569
569
  const mime = MIME_BY_EXT[path.extname(filePath).toLowerCase()] || 'audio/wav'
570
570
  const bytes = await readFile(filePath)
571
571
  const modeCfg = { ...cfg.message, language: String(args.language || cfg.message.language) }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-voice",
3
- "version": "0.8.12",
3
+ "version": "0.8.14",
4
4
  "description": "Voice input for DeepSeek Harness: dictation chunked by pauses and voice messages, each with its own provider fallback chain (Deepgram, Groq, HuggingFace, local whisper.cpp, plus any OpenAI-compatible API of your own).",
5
5
  "license": "MIT",
6
6
  "type": "module",