@nac3/forge-cli 0.2.0-alpha.27 → 0.2.0-alpha.28

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.
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAiyDxD"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA88DxD"}
@@ -402,6 +402,7 @@ body {
402
402
  <button type="button" class="mic" data-mic data-mic-btn aria-label="${escapeHtml(tr.micButton)}" title="${escapeHtml(tr.micButton)}">🎙</button>
403
403
  <button type="button" class="tts-toggle" data-tts-toggle aria-label="${escapeHtml(tr.ttsButton)}" title="${escapeHtml(tr.ttsButton)}">🔊</button>
404
404
  <button type="button" class="voice-mode-btn" data-voice-mode-btn aria-label="modo voz" title="modo voz">modo mic</button>
405
+ <button type="button" class="stt-provider-btn" data-stt-provider-btn aria-label="proveedor STT" title="proveedor STT">STT navegador</button>
405
406
  <input type="text" placeholder="${escapeHtml(tr.inputPlaceholder)}" aria-label="${escapeHtml(tr.inputPlaceholder)}" autocomplete="off">
406
407
  <button type="submit" class="send">${escapeHtml(tr.sendButton)}</button>
407
408
  </form>
@@ -468,6 +469,7 @@ body {
468
469
  <button type="button" class="mic" data-mic data-mic-btn aria-label="${escapeHtml(tr.micButton)}" title="${escapeHtml(tr.micButton)}">🎙</button>
469
470
  <button type="button" class="tts-toggle" data-tts-toggle aria-label="${escapeHtml(tr.ttsButton)}" title="${escapeHtml(tr.ttsButton)}">🔊</button>
470
471
  <button type="button" class="voice-mode-btn" data-voice-mode-btn aria-label="modo voz" title="modo voz">modo mic</button>
472
+ <button type="button" class="stt-provider-btn" data-stt-provider-btn aria-label="proveedor STT" title="proveedor STT">STT navegador</button>
471
473
  <input type="text" placeholder="${escapeHtml(tr.inputPlaceholder)}" aria-label="${escapeHtml(tr.inputPlaceholder)}" autocomplete="off">
472
474
  <button type="submit" class="send">${escapeHtml(tr.sendButton)}</button>
473
475
  </form>
@@ -980,6 +982,41 @@ let recordingPanelButton = null;
980
982
  let _lastInputWasVoice = false;
981
983
  let _lastVoiceButton = null;
982
984
 
985
+ /* STT provider selector (alpha.28+). Default 'browser' = Web
986
+ * Speech API (instant, free, native es-AR). 'google' = our
987
+ * existing MediaRecorder + Google Cloud STT REST path. 'whisper'
988
+ * = server routes to Whisper API.
989
+ * Per Pablo (2026-05-31): "el default queda el del navegador,
990
+ * pero quiero poder elegir Google u otro". */
991
+ const STT_PROVIDER_KEY = 'yf-stt-provider';
992
+ function sttProvider() {
993
+ try {
994
+ const v = localStorage.getItem(STT_PROVIDER_KEY);
995
+ if (v === 'google' || v === 'whisper' || v === 'browser') return v;
996
+ } catch (_) {}
997
+ return 'browser';
998
+ }
999
+ function setSttProvider(p) {
1000
+ try { localStorage.setItem(STT_PROVIDER_KEY, p); } catch (_) {}
1001
+ updateSttProviderButtons();
1002
+ }
1003
+ function updateSttProviderButtons() {
1004
+ const p = sttProvider();
1005
+ const label = p === 'browser' ? 'STT navegador'
1006
+ : p === 'google' ? 'STT Google'
1007
+ : 'STT Whisper';
1008
+ document.querySelectorAll('[data-stt-provider-btn]').forEach((b) => {
1009
+ b.textContent = label;
1010
+ b.title = 'Click para alternar entre navegador (rapido + es-AR nativo + gratis), '
1011
+ + 'Google Cloud STT (server-side, BYOK) o Whisper (server-side, BYOK).';
1012
+ });
1013
+ }
1014
+ function cycleSttProvider() {
1015
+ const order = ['browser', 'google', 'whisper'];
1016
+ const i = order.indexOf(sttProvider());
1017
+ setSttProvider(order[(i + 1) % order.length]);
1018
+ }
1019
+
983
1020
  function voiceMode() {
984
1021
  /* Default 'mic' = push-to-talk (preserves pre-2026-05-31 UX). */
985
1022
  try {
@@ -1032,12 +1069,57 @@ function setMicButtonsState(state) {
1032
1069
  });
1033
1070
  }
1034
1071
 
1072
+ /* 2026-05-31 -- Web Speech API path (browser-native STT).
1073
+ Mirrors the Pilot CRM implementation. When the browser
1074
+ exposes SpeechRecognition / webkitSpeechRecognition we use
1075
+ IT instead of MediaRecorder + Google Cloud STT REST. Why:
1076
+ - Instant (no server round-trip).
1077
+ - es-AR + es-CL + es-PE + every regional Spanish locale
1078
+ supported natively (no es-US mapping needed).
1079
+ - Free (the browser routes to Google STT for free under
1080
+ Chrome/Edge; Firefox uses its own backend).
1081
+ - Interim results (text appears as you speak).
1082
+ The Google Cloud STT path stays as a fallback for callers
1083
+ that explicitly want server-side recognition (e.g. audio
1084
+ pre-recorded files via the yf CLI). */
1085
+ let _webSpeechRecognition = null;
1086
+
1087
+ function _webSpeechAvailable() {
1088
+ return typeof window !== 'undefined'
1089
+ && (typeof window.SpeechRecognition !== 'undefined'
1090
+ || typeof window.webkitSpeechRecognition !== 'undefined');
1091
+ }
1092
+
1093
+ function _webSpeechLangFromDoc() {
1094
+ const raw = (document.documentElement.lang
1095
+ || navigator.language || 'es-AR').toString();
1096
+ /* Web Speech API takes the locale as-is, including es-AR.
1097
+ No normalisation needed. */
1098
+ return raw;
1099
+ }
1100
+
1035
1101
  async function micToggle(button) {
1102
+ if (_webSpeechRecognition) {
1103
+ /* Already listening -> stop. */
1104
+ try { _webSpeechRecognition.stop(); } catch (_) {}
1105
+ return;
1106
+ }
1036
1107
  if (mediaRecorder && mediaRecorder.state === 'recording') {
1037
1108
  /* Stop -> onstop handler dispatches transcription. */
1038
1109
  mediaRecorder.stop();
1039
1110
  return;
1040
1111
  }
1112
+ /* Provider-aware dispatch. Default 'browser' uses Web Speech
1113
+ API when available. 'google' / 'whisper' route through the
1114
+ server-side MediaRecorder + REST path. */
1115
+ const provider = sttProvider();
1116
+ if (provider === 'browser' && _webSpeechAvailable()) {
1117
+ return _micToggleWebSpeech(button);
1118
+ }
1119
+ if (provider === 'browser' && !_webSpeechAvailable()) {
1120
+ setStatus('Browser STT unavailable; using server-side fallback.');
1121
+ /* Fall through to MediaRecorder path. */
1122
+ }
1041
1123
  if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
1042
1124
  setStatus('Your browser does not support microphone access.', true);
1043
1125
  return;
@@ -1342,10 +1424,18 @@ async function _fetchTtsChunk(text) {
1342
1424
  * resolves voice from { language } if no explicit voice given. */
1343
1425
  const lang = (document && document.documentElement && document.documentElement.lang)
1344
1426
  ? document.documentElement.lang : undefined;
1427
+ /* 2026-05-31 -- speakingRate 1.05 for Spanish (mirror Pilot
1428
+ * CRM). Neural2 voices at rate 1.0 tend to swallow final
1429
+ * "s" in Latin-American Spanish; +5% rate makes the voice
1430
+ * articulate each syllable + drops the dropped-s symptom. */
1431
+ let speed;
1432
+ if (lang && /^es(-|$)/i.test(lang)) speed = 1.05;
1433
+ const body = lang ? { text, language: lang } : { text };
1434
+ if (speed) body.speed = speed;
1345
1435
  const r = await fetch('/api/voice/tts', {
1346
1436
  method: 'POST',
1347
1437
  headers: { 'content-type': 'application/json' },
1348
- body: JSON.stringify(lang ? { text, language: lang } : { text }),
1438
+ body: JSON.stringify(body),
1349
1439
  });
1350
1440
  if (!r.ok) {
1351
1441
  const data = await r.json().catch(() => ({}));
@@ -1504,12 +1594,93 @@ function cleanForTts(raw) {
1504
1594
  the audio they captured BEFORE TTS started is already in
1505
1595
  flight; we just prevent NEW captures. */
1506
1596
  function closeMicForTts() {
1597
+ if (_webSpeechRecognition) {
1598
+ try { _webSpeechRecognition.abort(); } catch (_) {}
1599
+ _webSpeechRecognition = null;
1600
+ setStatus('Mic closed while Yujin speaks (half-duplex).');
1601
+ }
1507
1602
  if (mediaRecorder && mediaRecorder.state === 'recording') {
1508
1603
  try { mediaRecorder.stop(); } catch { /* ignore */ }
1509
1604
  setStatus('Mic closed while Yujin speaks (half-duplex).');
1510
1605
  }
1511
1606
  }
1512
1607
 
1608
+ async function _micToggleWebSpeech(button) {
1609
+ const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
1610
+ recordingPanelButton = button;
1611
+ const rec = new SR();
1612
+ rec.continuous = false;
1613
+ rec.interimResults = true;
1614
+ rec.lang = _webSpeechLangFromDoc();
1615
+ let finalText = '';
1616
+ let interim = '';
1617
+ /* 2026-05-31 -- Aggressive silence cutoff. Chrome's default
1618
+ silence timeout for SpeechRecognition is ~3s; per Pablo
1619
+ "cerrar el mic mas rapido". We piggyback on interimResults:
1620
+ every time interim text changes we reset a timer; if the
1621
+ timer fires (no interim activity for SILENCE_MS) we stop
1622
+ the recogniser. */
1623
+ const SILENCE_MS = 900;
1624
+ let silenceTimer = null;
1625
+ const resetSilenceTimer = () => {
1626
+ if (silenceTimer) clearTimeout(silenceTimer);
1627
+ silenceTimer = setTimeout(() => {
1628
+ try { rec.stop(); } catch (_) {}
1629
+ }, SILENCE_MS);
1630
+ };
1631
+ rec.onresult = (e) => {
1632
+ interim = '';
1633
+ for (let i = e.resultIndex; i < e.results.length; i += 1) {
1634
+ const r = e.results[i];
1635
+ if (r.isFinal) finalText += r[0].transcript;
1636
+ else interim += r[0].transcript;
1637
+ }
1638
+ if (interim) setStatus('Listening... ' + interim);
1639
+ /* Activity heard -> reset the silence countdown. */
1640
+ resetSilenceTimer();
1641
+ };
1642
+ rec.onerror = (e) => {
1643
+ const errKind = (e && e.error) ? String(e.error) : 'unknown';
1644
+ if (errKind === 'no-speech' || errKind === 'aborted') {
1645
+ setStatus('');
1646
+ } else {
1647
+ setStatus('Mic error: ' + errKind, true);
1648
+ }
1649
+ };
1650
+ rec.onend = () => {
1651
+ if (silenceTimer) { clearTimeout(silenceTimer); silenceTimer = null; }
1652
+ _webSpeechRecognition = null;
1653
+ setMicButtonsState('idle');
1654
+ const text = (finalText || '').trim();
1655
+ if (!text) {
1656
+ if (!interim) setStatus('Did not catch that -- try again.', true);
1657
+ return;
1658
+ }
1659
+ _lastInputWasVoice = true;
1660
+ _lastVoiceButton = recordingPanelButton;
1661
+ /* Inject + submit, same as the Google-STT path. */
1662
+ const inputSel = state.mode === 'full' ? '#bar-full input' : '#bar-mini input';
1663
+ const input = $(inputSel);
1664
+ if (input) {
1665
+ input.value = text;
1666
+ send(text);
1667
+ input.value = '';
1668
+ }
1669
+ };
1670
+ try {
1671
+ _webSpeechRecognition = rec;
1672
+ rec.start();
1673
+ setMicButtonsState('recording');
1674
+ setStatus('Listening (web speech)...');
1675
+ /* Arm the silence timer immediately so a never-spoken start
1676
+ eventually times out (~900ms after start if no audio). */
1677
+ resetSilenceTimer();
1678
+ } catch (err) {
1679
+ _webSpeechRecognition = null;
1680
+ setStatus('Could not start mic: ' + (err && err.message ? err.message : String(err)), true);
1681
+ }
1682
+ }
1683
+
1513
1684
  async function playTtsForText(text) {
1514
1685
  text = cleanForTts(text);
1515
1686
  if (!ttsRepliesEnabled()) return;
@@ -1701,6 +1872,8 @@ document.addEventListener('DOMContentLoaded', () => {
1701
1872
  setVoiceMode(voiceMode() === 'auricular' ? 'mic' : 'auricular');
1702
1873
  }));
1703
1874
  updateVoiceModeButtons();
1875
+ $$('[data-stt-provider-btn]').forEach((b) => b.addEventListener('click', cycleSttProvider));
1876
+ updateSttProviderButtons();
1704
1877
  setMicButtonsState('idle');
1705
1878
  updateTtsToggleButtons();
1706
1879
 
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export declare const VERSION = "0.2.0-alpha.27";
7
+ export declare const VERSION = "0.2.0-alpha.28";
8
8
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export const VERSION = '0.2.0-alpha.27';
7
+ export const VERSION = '0.2.0-alpha.28';
8
8
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "0.2.0-alpha.27",
3
+ "version": "0.2.0-alpha.28",
4
4
  "description": "Yujin Forge -- voice-first NAC-3 React development framework. CLI + chat panel + spec ingest + 10-format document reader + voice loop.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pablo Kuschnirof <pablo@rpaforce.com>",