agentvibes 4.4.1 → 4.5.0

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.
Files changed (50) hide show
  1. package/.agentvibes/config.json +4 -4
  2. package/.claude/config/reverb-level.txt +1 -1
  3. package/.claude/github-star-reminder.txt +1 -1
  4. package/.claude/hooks-windows/bmad-speak.ps1 +112 -0
  5. package/.claude/hooks-windows/play-tts-piper.ps1 +3 -4
  6. package/.claude/hooks-windows/play-tts-sapi.ps1 +3 -4
  7. package/.claude/hooks-windows/play-tts-soprano.ps1 +2 -3
  8. package/.claude/hooks-windows/play-tts-termux-ssh.ps1 +138 -0
  9. package/.claude/hooks-windows/play-tts.ps1 +14 -6
  10. package/.claude/hooks-windows/provider-manager.ps1 +16 -1
  11. package/CLAUDE.md +4 -0
  12. package/README.md +39 -9
  13. package/RELEASE_NOTES.md +39 -0
  14. package/bin/agent-vibes +1 -1
  15. package/bin/agentvibes-voice-browser.js +1 -1
  16. package/bin/bmad-speak.js +52 -0
  17. package/bin/mcp-server.js +1 -1
  18. package/bin/test-bmad-pr +1 -1
  19. package/package.json +1 -1
  20. package/setup-windows.ps1 +4 -4
  21. package/src/console/app.js +58 -11
  22. package/src/console/tabs/agents-tab.js +61 -65
  23. package/src/console/tabs/help-tab.js +107 -54
  24. package/src/console/tabs/install-tab.js +107 -47
  25. package/src/console/tabs/music-tab.js +1030 -1011
  26. package/src/console/tabs/placeholder-tab.js +27 -0
  27. package/src/console/tabs/readme-tab.js +9 -7
  28. package/src/console/tabs/receiver-tab.js +23 -12
  29. package/src/console/tabs/settings-tab.js +4001 -3783
  30. package/src/console/tabs/voices-tab.js +1680 -1653
  31. package/src/console/widgets/personality-picker.js +35 -7
  32. package/src/console/widgets/reverb-picker.js +9 -6
  33. package/src/console/widgets/track-picker.js +6 -1
  34. package/src/i18n/de.js +201 -0
  35. package/src/i18n/en.js +201 -0
  36. package/src/i18n/es.js +201 -0
  37. package/src/i18n/fr.js +201 -0
  38. package/src/i18n/hi.js +201 -0
  39. package/src/i18n/ja.js +201 -0
  40. package/src/i18n/ko.js +201 -0
  41. package/src/i18n/pt.js +201 -0
  42. package/src/i18n/strings.js +54 -0
  43. package/src/i18n/zh-CN.js +201 -0
  44. package/src/installer/language-screen.js +31 -0
  45. package/src/installer.js +79 -25
  46. package/src/services/language-service.js +47 -0
  47. package/src/utils/file-ownership-verifier.js +2 -2
  48. package/src/utils/provider-validator.js +9 -13
  49. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +0 -209
  50. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +0 -108
@@ -6,6 +6,8 @@
6
6
  */
7
7
 
8
8
  import path from 'node:path';
9
+ import fs from 'node:fs';
10
+ import os from 'node:os';
9
11
  import { spawn } from 'node:child_process';
10
12
  import { destroyList } from './destroy-list.js';
11
13
  import { buildAudioEnv } from '../audio-env.js';
@@ -105,7 +107,12 @@ export function openPersonalityPicker(screen, currentPersonality, onSelect, onCl
105
107
 
106
108
  function _killPickerTts() {
107
109
  if (_pickerTtsProc) {
108
- try { process.kill(-_pickerTtsProc.pid, 'SIGTERM'); } catch {}
110
+ const _isWin = process.platform === 'win32' && !process.env.WSL_DISTRO_NAME;
111
+ if (_isWin) {
112
+ try { _pickerTtsProc.kill(); } catch {}
113
+ } else {
114
+ try { process.kill(-_pickerTtsProc.pid, 'SIGTERM'); } catch {}
115
+ }
109
116
  _pickerTtsProc = null;
110
117
  }
111
118
  if (_playingItemIdx >= 0) {
@@ -118,12 +125,25 @@ export function openPersonalityPicker(screen, currentPersonality, onSelect, onCl
118
125
  _killPickerTts();
119
126
  const phrase = PERSONALITY_PREVIEW_PHRASES[personality];
120
127
  if (!phrase) return;
121
- const ttsScript = path.join(process.cwd(), '.claude', 'hooks', 'play-tts.sh');
122
- _pickerTtsProc = spawn('bash', [ttsScript, phrase], {
123
- stdio: 'ignore',
124
- detached: true,
125
- env: buildAudioEnv(),
126
- });
128
+ const _isWin = process.platform === 'win32' && !process.env.WSL_DISTRO_NAME;
129
+ const _env = buildAudioEnv();
130
+ if (_isWin) {
131
+ // Prefer project-local install, fall back to global ~/.claude install
132
+ const _cwdScript = path.join(process.cwd(), '.claude', 'hooks-windows', 'play-tts.ps1');
133
+ const _homeScript = path.join(os.homedir(), '.claude', 'hooks-windows', 'play-tts.ps1');
134
+ const ttsScript = fs.existsSync(_cwdScript) ? _cwdScript : _homeScript;
135
+ _pickerTtsProc = spawn('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', ttsScript, phrase], {
136
+ stdio: 'ignore',
137
+ env: _env,
138
+ });
139
+ } else {
140
+ const ttsScript = path.join(process.cwd(), '.claude', 'hooks', 'play-tts.sh');
141
+ _pickerTtsProc = spawn('bash', [ttsScript, phrase], {
142
+ stdio: 'ignore',
143
+ detached: true,
144
+ env: _env,
145
+ });
146
+ }
127
147
  _playingItemIdx = list.selected;
128
148
  _setItemPlaying(_playingItemIdx, true);
129
149
  screen.render();
@@ -135,6 +155,14 @@ export function openPersonalityPicker(screen, currentPersonality, onSelect, onCl
135
155
  }
136
156
  _pickerTtsProc = null;
137
157
  });
158
+ _pickerTtsProc.on('error', () => {
159
+ _pickerTtsProc = null;
160
+ if (_playingItemIdx >= 0) {
161
+ _setItemPlaying(_playingItemIdx, false);
162
+ _playingItemIdx = -1;
163
+ screen.render();
164
+ }
165
+ });
138
166
  _pickerTtsProc.unref();
139
167
  }
140
168
 
@@ -75,12 +75,15 @@ export function openReverbPicker(screen, currentPreset, onSelect, onClose, opts
75
75
  if (!selected) return;
76
76
 
77
77
  if (applyToEffectsManager) {
78
- const effectsScript = path.join(process.cwd(), '.claude', 'hooks', 'effects-manager.sh');
79
- spawnSync('bash', [effectsScript, 'set-reverb', selected.value, 'default'], {
80
- stdio: 'ignore',
81
- timeout: 5000,
82
- env: { ...process.env },
83
- });
78
+ const _isWin = process.platform === 'win32' && !process.env.WSL_DISTRO_NAME;
79
+ if (!_isWin) {
80
+ const effectsScript = path.join(process.cwd(), '.claude', 'hooks', 'effects-manager.sh');
81
+ spawnSync('bash', [effectsScript, 'set-reverb', selected.value, 'default'], {
82
+ stdio: 'ignore',
83
+ timeout: 5000,
84
+ env: { ...process.env },
85
+ });
86
+ }
84
87
  }
85
88
 
86
89
  // Call onSelect before destroying to avoid stale-state re-renders
@@ -199,7 +199,12 @@ export function openTrackPicker(screen, currentTrack, currentVolume, onSelect, o
199
199
 
200
200
  function _killPreview() {
201
201
  if (_previewProc) {
202
- try { process.kill(-_previewProc.pid, 'SIGTERM'); } catch {}
202
+ const _isWin = process.platform === 'win32' && !process.env.WSL_DISTRO_NAME;
203
+ if (_isWin) {
204
+ try { _previewProc.kill(); } catch {}
205
+ } else {
206
+ try { process.kill(-_previewProc.pid, 'SIGTERM'); } catch {}
207
+ }
203
208
  _previewProc = null;
204
209
  }
205
210
  _previewTrackId = null;
package/src/i18n/de.js ADDED
@@ -0,0 +1,201 @@
1
+ export default {
2
+ languageSelectTitle: "🌐 Select Language / Seleccionar Idioma / Choisir la langue / Sprache wählen / Selecionar Idioma / 言語を選択 / भाषा चुनें / 选择语言 / 언어 선택",
3
+ languageApplied: "Sprache angewendet",
4
+ welcomeTitle: "Willkommen bei AgentVibes!",
5
+ installDetails: "Installationsdetails",
6
+ installLocation: "Installationsort",
7
+ packageVersion: "Paketversion",
8
+ readyToConfigure: "Bereit zum Konfigurieren von AgentVibes?",
9
+ installationCancelled: "Installation abgebrochen.",
10
+ startInstall: "Installation starten",
11
+ installationCancelledMsg: "Die Installation wurde vom Benutzer abgebrochen.",
12
+ installedSuccess: "AgentVibes erfolgreich installiert!",
13
+ installComplete: "Installation abgeschlossen",
14
+ installationFailed: "Installation fehlgeschlagen",
15
+ installing: "AgentVibes wird installiert...",
16
+ providerLabel: "Anbieter",
17
+ voiceLabel: "Stimme",
18
+ locationLabel: "Ort",
19
+ versionLabel: "Version",
20
+ configurationSetup: "Konfiguration",
21
+ configurationIntro: "Bitte konfigurieren Sie Ihre AgentVibes-Installation.",
22
+ navigationHint: "Verwenden Sie die Pfeiltasten, um zwischen Seiten zu navigieren.",
23
+ nonInteractiveDetected: "Nicht-interaktiver Modus erkannt",
24
+ installError: "Installation fehlgeschlagen",
25
+ continuePrompt: "Weiter",
26
+ cancelPrompt: "Abbrechen",
27
+ setupWizard: "Einrichtungsassistent",
28
+ setupWizardSubtitle: "TTS für KI-Assistenten mit Persönlichkeit.",
29
+ dependencyCheck: "Abhängigkeitsprüfung",
30
+ checkingDependencies: "Abhängigkeiten werden überprüft...",
31
+ depColumn: "Abhängigkeit",
32
+ statusColumn: "Status",
33
+ installed: "Installiert",
34
+ notFound: "Nicht gefunden",
35
+ ffmpegMissing: "Nicht gefunden (für Hintergrundmusik benötigt)",
36
+ ttsDetected: "TTS-Anbieter erkannt",
37
+ noTtsFound: "Kein TTS-Anbieter gefunden. Installieren Sie zuerst Piper oder Soprano.",
38
+ providerSelection: "Anbieterauswahl",
39
+ availableProviders: "Verfügbare TTS-Anbieter:",
40
+ providerAndVoice: "Anbieter & Stimme",
41
+ voiceChangeHint: "(nach der Installation in Einstellungen änderbar)",
42
+ introText: "Einleitungstext",
43
+ introTextLabel: "Einleitungstext",
44
+ none: "keiner",
45
+ example: "Beispiel",
46
+ screen1Hint: "Bildschirm 1/5: Willkommen | [←/→] Navigieren | [Enter] Beginnen | [Esc] Beenden",
47
+ screen2Hint: "Bildschirm 2/5: Abhängigkeiten | [←] Zurück | [Enter] Weiter",
48
+ screen3Hint: "Bildschirm 3/5: Anbieter | [←] Zurück | [↑↓] Wählen | [Enter/→] Bestätigen",
49
+ screen4Hint: "Bildschirm 4/5: Konfiguration | [Esc] Zurück | [E] Bearbeiten | [↓] Akzeptieren & Installieren",
50
+ screen5HintDone: "Bildschirm 5/5: Abgeschlossen | [Enter] OK — Fertig",
51
+ screen5HintWait: "Bildschirm 5/5: Installieren... | Bitte warten",
52
+ languageSettings: "Sprache",
53
+ languageSettingsSubtitle: "Oberflächensprache auswählen",
54
+ currentLanguage: "Aktuelle Sprache",
55
+ changeLanguage: "Sprache ändern",
56
+ beginBtn: "▶ Beginnen",
57
+ exitBtn: "✗ Beenden",
58
+ footerText: "[Enter] Weiter/Fertig [Esc] Zurück/Beenden [C] Konsole [S/V/M/A/R] Tab [Q] Beenden",
59
+ customizationTool: "Anpassungswerkzeug",
60
+ quitLabel: "[Q] Beenden",
61
+ tabInstall: "Installieren",
62
+ tabSettings: "Einstellungen",
63
+ tabVoices: "Stimmen",
64
+ tabMusic: "Musik",
65
+ tabBmad: "BMad",
66
+ tabReceiver: "Empfänger",
67
+ tabReadme: "Liesmich",
68
+ tabHelp: "Hilfe",
69
+ subTabVoice: " [V] Stimme ",
70
+ subTabEffects: " [E] Effekte ",
71
+ subTabPersonality: " [P] Persönlichkeit ",
72
+ subTabOutput: " [O] Ausgabe ",
73
+ subTabLanguage: " [L] Sprache ",
74
+ sectionProviderVoice: " 🎤 Anbieter & Stimme ",
75
+ sectionAudioEffects: " ⚡ Audioeffekte ",
76
+ sectionBgMusic: " 🎸 Hintergrundmusik ",
77
+ sectionStyle: " 🎭 Stil ",
78
+ sectionIntroText: " ✍️ Einleitungstext ",
79
+ sectionAudioDest: " 📡 Audioziel ",
80
+ sectionConfigStorage: " 💾 Konfigurationsspeicher ",
81
+ sectionLanguage: " 🌐 Sprache ",
82
+ providerRowLabel: "Anbieter:",
83
+ currentVoiceLabel: "Aktuelle Stimme:",
84
+ reverbLabel: "Hall:",
85
+ trackLabel: "Titel:",
86
+ volumeLabel: "Lautstärke:",
87
+ verbosityLabel: "Ausführlichkeit:",
88
+ personalityLabel: "Persönlichkeit:",
89
+ introTextRowLabel: "Einleitungstext:",
90
+ destinationLabel: "Ziel:",
91
+ sshAliasLabel: "SSH-Alias:",
92
+ globalLabel: "Global:",
93
+ localLabel: "Lokal:",
94
+ languageLabel: "Sprache:",
95
+ switchBtn: "Wechseln",
96
+ changeBtn: "Ändern",
97
+ playBtn: "▶ Abspielen",
98
+ stopBtn: "■ Stop",
99
+ previewBtn: "▶ Vorschau",
100
+ fullPreviewBtn: "▶ Vollvorschau",
101
+ saveGloballyBtn: "Global Speichern",
102
+ saveLocallyBtn: "Lokal Speichern",
103
+ cancelChangesBtn: "Änderungen Verwerfen",
104
+ editBtn: "Bearbeiten",
105
+ clearBtn: "Löschen",
106
+ applyLanguageBtn: "✓ Sprache Anwenden",
107
+ enabledBtn: "Aktiviert",
108
+ disabledBtn: "Deaktiviert",
109
+ okSaveBtn: "OK — Speichern",
110
+ enableBtn: "Aktivieren",
111
+ streamingTextBtn: "Nur Text Streaming ✓",
112
+ streamingPulseBtn: "Pulse-Audio Streaming",
113
+ continueArrowBtn: "Weiter →",
114
+ acceptInstallBtn: "✓ Akzeptieren & Installieren",
115
+ okDoneBtn: "✓ OK — Fertig",
116
+ editInstallBtn: "Bearbeiten",
117
+ musicDisabledMsg: "Musik deaktiviert. Jetzt aktivieren?",
118
+ settingsFooter: "[↑↓] Gruppe [←→] Geschwister/Sub-Tab [Enter/Space] Aktivieren [Tab] Tab Wechseln [Q] Beenden",
119
+ voicesFooter: "[↑↓/jk] Navigieren [Space] Vorschau [Enter] Auswählen [F] Favorit [/] Suchen",
120
+ musicFooter: "[↑↓/jk] Navigieren [Space] Vorschau [Enter] Auswählen [M] Umschalten [*] Favorit [F] Filtern [Q] Beenden",
121
+ helpFooter: "[↑↓/jk] Scrollen [/] Suchen [PgUp/PgDn] Seite [S/V/M/A/R] Tab [Q] Beenden",
122
+ readmeFooter: "[↑↓/jk] Scrollen [PgUp/PgDn] Seite [/] Suchen [S/V/M/A/R] Tab [Q] Beenden",
123
+ receiverFooter: "SSH-Empfänger [Q] Beenden",
124
+ searchLabel: "Suchen:",
125
+ settingsSavedMsg: "Einstellungen Gespeichert",
126
+ changesRevertedMsg: "Änderungen zurückgesetzt",
127
+ musicBuiltInHeader: "── Eingebaute Tracks ",
128
+ musicStatusHeader: "── Musikstatus ",
129
+ musicStatusLabel: "Musik:",
130
+ musicActiveTrack: "Aktiver Track:",
131
+ musicFilterLabel: "Filter:",
132
+ musicFilterAll: "Alle",
133
+ musicFilterFavs: "Favoriten",
134
+ musicToggleBtn: "[Musik umschalten]",
135
+ musicAddCustomBtn: "[Eigenen Track hinzufügen]",
136
+ voicesHeader: "── Stimmen ",
137
+ voicesColName: "Name",
138
+ voicesColGender: "Geschlecht",
139
+ voicesColProvider: "Anbieter",
140
+ voicesInfoHeader: "── Stimmeninfo ",
141
+ voicesSwitchBtn: "[Stimme wechseln]",
142
+ voicesFavoriteBtn: "[★ Favorit]",
143
+ voicesDownloadBtn: "[Stimme herunterladen]",
144
+ voicesRowHintInstalled: "[Space] Vorschau [Enter] Auswählen [*] Favorit",
145
+ voicesRowHintUninstalled: "[Enter] Herunterladen und installieren",
146
+ musicRowHint: "[Space] Abspielen [Enter] Auswählen [*] Favorit",
147
+ musicHintText: "[Space] Vorschau [Enter] Track festlegen [*] Favorit",
148
+ genderFemale: "Weiblich",
149
+ genderMale: "Männlich",
150
+ voiceInfoVoice: "Stimme:",
151
+ voiceInfoGender: "Geschlecht:",
152
+ voiceInfoLanguage: "Sprache:",
153
+ voiceInfoQuality: "Qualität:",
154
+ voiceInfoProvider: "Anbieter:",
155
+ voiceInfoId: "ID:",
156
+ voiceInfoSpeaker: "Sprecher:",
157
+ voiceInfoModel: "Modell:",
158
+ voiceInfoSpeakerId: "Sprecher-ID:",
159
+ voiceInfoDownload: "⬇ [Enter] drücken zum Herunterladen und Installieren",
160
+ voicePlaying: "(wird abgespielt)",
161
+ bmadTitle: "🧙 BMAD-Agenten",
162
+ bmadWhatIsHeader: "Was ist BMAD?",
163
+ bmadDesc: "Die BMad-Methode (Build More Architect Dreams) ist ein KI-gesteuertes\nEntwicklungs-Framework-Modul, das Ihnen hilft, Software von der Ideenfindung\nbis zur agentischen Implementierung zu entwickeln. Es bietet spezialisierte\nKI-Agenten, geführte Workflows und intelligente Planung.\n\nWenn Sie mit KI-Codierassistenten wie Claude, Cursor oder GitHub Copilot\nvertraut sind, können Sie sofort loslegen.",
164
+ bmadInstallHeader: "BMAD in Ihrem Projekt installieren:",
165
+ bmadLearnMoreHeader: "Mehr erfahren:",
166
+ bmadInstalledNote: "Sobald BMAD installiert ist, zeigt dieser Tab alle Ihre Agenten an und\nermöglicht es Ihnen, Stimme, Prätext, Nachhall, Persönlichkeit und\nHintergrundmusik jedes Agenten unabhängig anzupassen.",
167
+ receiverWhatIsTitle: "Was ist SSH-Empfänger?",
168
+ receiverDesc: "Der SSH-Empfänger ermöglicht es Ihren Remote-Servern, über diese Maschine\nzu sprechen. Wenn ein KI-Assistent auf einem Remote-Server TTS-Audio\nabspielen muss, sendet er den Text per SSH an diese Maschine, die das\nAudio generiert und über Ihre Lautsprecher abspielt.\n\nEntfernter KI ──[SSH]──► Diese Maschine ──[piper+sox+ffmpeg]──► Ihre Lautsprecher",
169
+ helpSectionGlobal: "Globale Tastenkürzel",
170
+ helpSectionNavigation: "Navigationstastenkürzel",
171
+ helpSectionColors: "Tab-Farbführer",
172
+ helpQuit: "Konsole beenden",
173
+ helpForceQuit: "Erzwungenes Beenden",
174
+ helpSwitchSettings: "Zum Tab Einstellungen wechseln",
175
+ helpSwitchVoices: "Zum Tab Stimmen wechseln",
176
+ helpSwitchMusic: "Zum Tab Musik wechseln",
177
+ helpSwitchReadme: "Zum Tab Readme wechseln",
178
+ helpSwitchHelp: "Zum Tab Hilfe wechseln",
179
+ helpSwitchInstall: "Zum Tab Installieren wechseln",
180
+ helpCloseModal: "Modal schließen / zurück",
181
+ helpNavigateLists: "Listen navigieren",
182
+ helpSelectActivate: "Auswählen / aktivieren",
183
+ helpTogglePreview: "Umschalten / Vorschau",
184
+ helpNextButton: "Nächste Schaltfläche",
185
+ helpPrevButton: "Vorherige Schaltfläche",
186
+ helpOpenSearch: "Suche/Filter öffnen",
187
+ helpToggleFavFilter: "Favoritenfilter umschalten (Stimmen/Musik)",
188
+ helpToggleFav: "Favorit umschalten (Musik-Tab)",
189
+ helpToggleMusic: "Musik ein-/ausschalten (Musik-Tab)",
190
+ helpColorSettings: "Einstellungen-Tab-Fußzeile",
191
+ helpColorVoices: "Stimmen-Tab-Fußzeile",
192
+ helpColorMusic: "Musik-Tab-Fußzeile",
193
+ helpColorReadme: "Readme-Tab-Fußzeile",
194
+ helpColorHelp: "Hilfe-Tab-Fußzeile",
195
+ helpColorInstall: "Installieren-Tab-Fußzeile",
196
+ helpSearchLabel: "Suche:",
197
+ readmeScrollMore: "↓ Scrollen für mehr Inhalt ↓",
198
+ readmeNotFound: "*(Keine README.md im aktuellen Verzeichnis gefunden)*",
199
+ bmadFooterNobmad: "[Tab] Tab wechseln [Q] Beenden",
200
+ bmadFooterBmad: "[↑↓/jk] Navigieren [Space] Vorschau [Enter] Konfigurieren [A] Auto-zuweisen [B] Stapel [X] Zurücksetzen [Q] Beenden",
201
+ };
package/src/i18n/en.js ADDED
@@ -0,0 +1,201 @@
1
+ export default {
2
+ languageSelectTitle: "🌐 Select Language / Seleccionar Idioma / Choisir la langue / Sprache wählen / Selecionar Idioma / 言語を選択 / भाषा चुनें / 选择语言 / 언어 선택",
3
+ languageApplied: "Language applied",
4
+ welcomeTitle: "Welcome to AgentVibes!",
5
+ installDetails: "Installation Details",
6
+ installLocation: "Install location",
7
+ packageVersion: "Package version",
8
+ readyToConfigure: "Ready to configure AgentVibes?",
9
+ installationCancelled: "Installation cancelled.",
10
+ startInstall: "Start Install",
11
+ installationCancelledMsg: "Installation was cancelled by the user.",
12
+ installedSuccess: "AgentVibes installed successfully!",
13
+ installComplete: "Installation Complete",
14
+ installationFailed: "Installation Failed",
15
+ installing: "Installing AgentVibes...",
16
+ providerLabel: "Provider",
17
+ voiceLabel: "Voice",
18
+ locationLabel: "Location",
19
+ versionLabel: "Version",
20
+ configurationSetup: "Configuration Setup",
21
+ configurationIntro: "Please configure your AgentVibes installation.",
22
+ navigationHint: "Use arrow keys to navigate between pages.",
23
+ nonInteractiveDetected: "Non-interactive mode detected",
24
+ installError: "Installation failed",
25
+ continuePrompt: "Continue",
26
+ cancelPrompt: "Cancel",
27
+ setupWizard: "Setup Wizard",
28
+ setupWizardSubtitle: "TTS for AI assistants with personality.",
29
+ dependencyCheck: "Dependency Check",
30
+ checkingDependencies: "Checking dependencies...",
31
+ depColumn: "Dependency",
32
+ statusColumn: "Status",
33
+ installed: "Installed",
34
+ notFound: "Not found",
35
+ ffmpegMissing: "Not found (needed for background music)",
36
+ ttsDetected: "TTS Providers Detected",
37
+ noTtsFound: "No TTS provider found. Install Piper or Soprano first.",
38
+ providerSelection: "Provider Selection",
39
+ availableProviders: "Available TTS providers:",
40
+ providerAndVoice: "Provider & Voice",
41
+ voiceChangeHint: "(after installation, you can change in Settings)",
42
+ introText: "Intro Text",
43
+ introTextLabel: "Intro text",
44
+ none: "none",
45
+ example: "Example",
46
+ screen1Hint: "Screen 1/5: Welcome | [←/→] Navigate | [Enter] Begin | [Esc] Exit",
47
+ screen2Hint: "Screen 2/5: Dependencies | [←] Back | [Enter] Next",
48
+ screen3Hint: "Screen 3/5: Provider | [←] Back | [↑↓] Choose | [Enter/→] Confirm & Continue",
49
+ screen4Hint: "Screen 4/5: Config | [Esc] Back | [E] Edit | [↓] Accept & Install",
50
+ screen5HintDone: "Screen 5/5: Complete | [Enter] OK — Done",
51
+ screen5HintWait: "Screen 5/5: Installing... | Please wait",
52
+ languageSettings: "Language",
53
+ languageSettingsSubtitle: "Select interface language",
54
+ currentLanguage: "Current language",
55
+ changeLanguage: "Change language",
56
+ beginBtn: "▶ Begin",
57
+ exitBtn: "✗ Exit",
58
+ footerText: "[Enter] Continue/Finish [Esc] Back/Exit [C] Open Console [S/V/M/A/R] Tab [Q] Quit",
59
+ customizationTool: "Customization Tool",
60
+ quitLabel: "[Q] Quit",
61
+ tabInstall: "Install",
62
+ tabSettings: "Settings",
63
+ tabVoices: "Voices",
64
+ tabMusic: "Music",
65
+ tabBmad: "BMad",
66
+ tabReceiver: "Receiver",
67
+ tabReadme: "Readme",
68
+ tabHelp: "Help",
69
+ subTabVoice: " [V] Voice ",
70
+ subTabEffects: " [E] Effects ",
71
+ subTabPersonality: " [P] Personality ",
72
+ subTabOutput: " [O] Output ",
73
+ subTabLanguage: " [L] Language ",
74
+ sectionProviderVoice: " 🎤 Provider & Voice ",
75
+ sectionAudioEffects: " ⚡ Audio Effects ",
76
+ sectionBgMusic: " 🎸 Background Music ",
77
+ sectionStyle: " 🎭 Style ",
78
+ sectionIntroText: " ✍️ Intro Text ",
79
+ sectionAudioDest: " 📡 Audio Destination ",
80
+ sectionConfigStorage: " 💾 Config Storage ",
81
+ sectionLanguage: " 🌐 Language ",
82
+ providerRowLabel: "Provider:",
83
+ currentVoiceLabel: "Current Voice:",
84
+ reverbLabel: "Reverb:",
85
+ trackLabel: "Track:",
86
+ volumeLabel: "Volume:",
87
+ verbosityLabel: "Verbosity:",
88
+ personalityLabel: "Personality:",
89
+ introTextRowLabel: "Intro Text:",
90
+ destinationLabel: "Destination:",
91
+ sshAliasLabel: "SSH Alias:",
92
+ globalLabel: "Global:",
93
+ localLabel: "Local:",
94
+ languageLabel: "Language:",
95
+ switchBtn: "Switch",
96
+ changeBtn: "Change",
97
+ playBtn: "▶ Play",
98
+ stopBtn: "■ Stop",
99
+ previewBtn: "▶ Preview",
100
+ fullPreviewBtn: "▶ Full Preview",
101
+ saveGloballyBtn: "Save Globally",
102
+ saveLocallyBtn: "Save Locally",
103
+ cancelChangesBtn: "Cancel Changes",
104
+ editBtn: "Edit",
105
+ clearBtn: "Clear",
106
+ applyLanguageBtn: "✓ Apply Language",
107
+ enabledBtn: "Enabled",
108
+ disabledBtn: "Disabled",
109
+ okSaveBtn: "OK — Save",
110
+ enableBtn: "Enable",
111
+ streamingTextBtn: "Streaming Text Only ✓",
112
+ streamingPulseBtn: "Streaming Pulse Audio",
113
+ continueArrowBtn: "Continue →",
114
+ acceptInstallBtn: "✓ Accept & Install",
115
+ okDoneBtn: "✓ OK — Done",
116
+ editInstallBtn: "Edit",
117
+ musicDisabledMsg: "Music is disabled. Enable it now?",
118
+ settingsFooter: "[↑↓] Group [←→] Sibling/Sub-tab [Enter/Space] Activate [Tab] Switch Tab [Q] Quit",
119
+ voicesFooter: "[↑↓/jk] Navigate [Space] Preview [Enter] Select/Install [F] Favorite [/] Search",
120
+ musicFooter: "[↑↓/jk] Navigate [Space] Preview [Enter] Select [M] Toggle [*] Favorite [F] Filter [Q] Quit",
121
+ helpFooter: "[↑↓/jk] Scroll [/] Search [PgUp/PgDn] Page [S/V/M/A/R] Tab [Q] Quit",
122
+ readmeFooter: "[↑↓/jk] Scroll [PgUp/PgDn] Page [/] Search [S/V/M/A/R] Tab [Q] Quit",
123
+ receiverFooter: "SSH Receiver [Q] Quit",
124
+ searchLabel: "Search:",
125
+ settingsSavedMsg: "Settings Saved",
126
+ changesRevertedMsg: "Changes reverted",
127
+ musicBuiltInHeader: "── Built-in Tracks ",
128
+ musicStatusHeader: "── Music Status ",
129
+ musicStatusLabel: "Music:",
130
+ musicActiveTrack: "Active Track:",
131
+ musicFilterLabel: "Filter:",
132
+ musicFilterAll: "All",
133
+ musicFilterFavs: "Favorites",
134
+ musicToggleBtn: "[Toggle Music]",
135
+ musicAddCustomBtn: "[Add Custom Track]",
136
+ voicesHeader: "── Voices ",
137
+ voicesColName: "Name",
138
+ voicesColGender: "Gender",
139
+ voicesColProvider: "Provider",
140
+ voicesInfoHeader: "── Voice Info ",
141
+ voicesSwitchBtn: "[Switch Voice]",
142
+ voicesFavoriteBtn: "[★ Favorite]",
143
+ voicesDownloadBtn: "[Download Voice]",
144
+ voicesRowHintInstalled: "[Space] Preview [Enter] Select [*] Favorite",
145
+ voicesRowHintUninstalled: "[Enter] Download & Install",
146
+ musicRowHint: "[Space] Play [Enter] Select [*] Favorite",
147
+ musicHintText: "[Space] preview [Enter] set as background track [*] favorite",
148
+ genderFemale: "Female",
149
+ genderMale: "Male",
150
+ voiceInfoVoice: "Voice:",
151
+ voiceInfoGender: "Gender:",
152
+ voiceInfoLanguage: "Language:",
153
+ voiceInfoQuality: "Quality:",
154
+ voiceInfoProvider: "Provider:",
155
+ voiceInfoId: "ID:",
156
+ voiceInfoSpeaker: "Speaker:",
157
+ voiceInfoModel: "Model:",
158
+ voiceInfoSpeakerId: "Speaker ID:",
159
+ voiceInfoDownload: "⬇ Press [Enter] to download and install",
160
+ voicePlaying: "(playing)",
161
+ bmadTitle: "🧙 BMAD Agents",
162
+ bmadWhatIsHeader: "What is BMAD?",
163
+ bmadDesc: "The BMad Method (Build More Architect Dreams) is an AI-driven development\nframework module within the BMad Method Ecosystem that helps you build\nsoftware through the whole process from ideation and planning all the way\nthrough agentic implementation. It provides specialized AI agents, guided\nworkflows, and intelligent planning that adapts to your project's\ncomplexity, whether you're fixing a bug or building an enterprise platform.\n\nIf you're comfortable working with AI coding assistants like Claude,\nCursor, or GitHub Copilot, you're ready to get started.",
164
+ bmadInstallHeader: "Install BMAD in your project:",
165
+ bmadLearnMoreHeader: "Learn more:",
166
+ bmadInstalledNote: "Once BMAD is installed, this tab will show all your agents and let you\ncustomize each agent's voice, pretext, reverb, personality, and background\nmusic independently.",
167
+ receiverWhatIsTitle: "What is SSH Receiver?",
168
+ receiverDesc: "SSH Receiver lets your remote servers speak through this machine.\nWhen an AI assistant on a remote server (VPS, cloud, dev box) needs\nto play TTS audio, it sends the text over SSH to this machine, which\ngenerates and plays the audio through your speakers locally.\n\nRemote AI ──[SSH]──► This Machine ──[piper+sox+ffmpeg]──► Your Speakers",
169
+ helpSectionGlobal: "Global Shortcuts",
170
+ helpSectionNavigation: "Navigation Shortcuts",
171
+ helpSectionColors: "Tab Color Guide",
172
+ helpQuit: "Quit the console",
173
+ helpForceQuit: "Force quit",
174
+ helpSwitchSettings: "Switch to Settings tab",
175
+ helpSwitchVoices: "Switch to Voices tab",
176
+ helpSwitchMusic: "Switch to Music tab",
177
+ helpSwitchReadme: "Switch to Readme tab",
178
+ helpSwitchHelp: "Switch to Help tab",
179
+ helpSwitchInstall: "Switch to Install tab",
180
+ helpCloseModal: "Close modal / go back",
181
+ helpNavigateLists: "Navigate lists",
182
+ helpSelectActivate: "Select / activate",
183
+ helpTogglePreview: "Toggle / preview",
184
+ helpNextButton: "Next button",
185
+ helpPrevButton: "Previous button",
186
+ helpOpenSearch: "Open search/filter",
187
+ helpToggleFavFilter: "Toggle favorites filter (Voices/Music)",
188
+ helpToggleFav: "Toggle favorite (Music tab)",
189
+ helpToggleMusic: "Toggle music on/off (Music tab)",
190
+ helpColorSettings: "Settings tab footer",
191
+ helpColorVoices: "Voices tab footer",
192
+ helpColorMusic: "Music tab footer",
193
+ helpColorReadme: "Readme tab footer",
194
+ helpColorHelp: "Help tab footer",
195
+ helpColorInstall: "Install tab footer",
196
+ helpSearchLabel: "Search:",
197
+ readmeScrollMore: "↓ Scroll for more content ↓",
198
+ readmeNotFound: "*(No README.md found in current directory)*",
199
+ bmadFooterNobmad: "[Tab] Switch Tab [Q] Quit",
200
+ bmadFooterBmad: "[↑↓/jk] Navigate [Space] Preview [Enter] Configure [A] Auto-assign [B] Bulk [X] Reset [Q] Quit",
201
+ };