agentvibes 4.6.8 → 5.1.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 (40) hide show
  1. package/.agentvibes/bmad-voice-map.json +104 -0
  2. package/.agentvibes/config.json +13 -12
  3. package/.agentvibes/copilot-sessions.log +4 -0
  4. package/.claude/audio/tracks/Drifting Down the Hall.mp3 +0 -0
  5. package/.claude/audio/tracks/Late Night Hip Hop Groove.mp3 +0 -0
  6. package/.claude/audio/tracks/Midnight Charleston Stomp.mp3 +0 -0
  7. package/.claude/audio/tracks/README.md +51 -52
  8. package/.claude/config/audio-effects-bmad.cfg +50 -0
  9. package/.claude/config/audio-effects.cfg +4 -4
  10. package/.claude/config/background-music-enabled.txt +1 -0
  11. package/.claude/config/personality.txt +1 -0
  12. package/.claude/hooks/play-tts-piper.sh +3 -1
  13. package/.claude/hooks/play-tts.sh +380 -301
  14. package/.claude/hooks/session-start-tts.sh +81 -81
  15. package/.claude/hooks-windows/audio-processor.ps1 +181 -0
  16. package/.claude/hooks-windows/play-tts-piper.ps1 +259 -245
  17. package/.claude/hooks-windows/play-tts.ps1 +28 -6
  18. package/.claude/hooks-windows/session-start-tts.ps1 +114 -114
  19. package/README.md +112 -6
  20. package/RELEASE_NOTES.md +83 -0
  21. package/bin/bmad-speak.js +16 -8
  22. package/mcp-server/server.py +15 -8
  23. package/package.json +1 -1
  24. package/src/console/app.js +899 -897
  25. package/src/console/footer-config.js +50 -50
  26. package/src/console/navigation.js +65 -65
  27. package/src/console/tabs/agents-tab.js +1899 -1886
  28. package/src/console/tabs/music-tab.js +1076 -1039
  29. package/src/console/tabs/placeholder-tab.js +81 -80
  30. package/src/console/tabs/settings-tab.js +941 -3988
  31. package/src/console/tabs/setup-tab.js +2071 -0
  32. package/src/console/tabs/voices-tab.js +1843 -1714
  33. package/src/console/widgets/format-utils.js +92 -89
  34. package/src/console/widgets/track-picker.js +325 -322
  35. package/src/installer.js +6147 -6092
  36. package/src/services/llm-provider-service.js +486 -0
  37. package/src/services/navigation-service.js +123 -123
  38. package/src/services/tts-engine-service.js +69 -0
  39. package/.claude/audio/tracks/dreamy_house_loop.mp3 +0 -0
  40. package/src/console/tabs/install-tab.js +0 -1081
@@ -1,89 +1,92 @@
1
- /**
2
- * AgentVibes TUI — Shared Format Utilities
3
- *
4
- * Pure formatting functions extracted from settings-tab.js to avoid
5
- * circular imports between widgets and tabs.
6
- */
7
-
8
- const TRACK_NAMES = Object.freeze({
9
- 'agentvibes_soft_flamenco_loop.mp3': '🎻 Soft Flamenco',
10
- 'agent_vibes_bachata_v1_loop.mp3': '🎺 Bachata',
11
- 'agent_vibes_salsa_v2_loop.mp3': '💃 Salsa',
12
- 'agent_vibes_cumbia_v1_loop.mp3': '🎸 Cumbia',
13
- 'agent_vibes_bossa_nova_v2_loop.mp3': '🌸 Bossa Nova',
14
- 'agent_vibes_japanese_city_pop_v1_loop.mp3': '🌆 Japanese City Pop',
15
- 'agent_vibes_chillwave_v2_loop.mp3': '🌊 Chillwave',
16
- 'agent_vibes_dark_chill_step_loop.mp3': '🌙 Dark Chill Step',
17
- 'agent_vibes_goa_trance_v2_loop.mp3': '🌀 Goa Trance',
18
- 'agent_vibes_harpsichord_v2_loop.mp3': '🎼 Harpsichord',
19
- 'agent_vibes_celtic_harp_v1_loop.mp3': '🎻 Celtic Harp',
20
- 'agent_vibes_hawaiian_slack_key_guitar_v2_loop.mp3': '🌺 Hawaiian Slack Key Guitar',
21
- 'agent_vibes_arabic_v2_loop.mp3': '🎵 Arabic Oud',
22
- 'agent_vibes_ganawa_ambient_v2_loop.mp3': '🪘 Gnawa Ambient',
23
- 'agent_vibes_tabla_dream_pop_v1_loop.mp3': '🥁 Tabla Dream Pop',
24
- });
25
-
26
- /**
27
- * @param {string} track - filename (e.g. 'agentvibes_soft_flamenco_loop.mp3')
28
- * @returns {string}
29
- */
30
- export function formatTrackName(track) {
31
- if (!track) return 'None';
32
- if (TRACK_NAMES[track]) return TRACK_NAMES[track];
33
- return track
34
- .replace(/\.[^.]+$/, '')
35
- .replace(/^agentvibes_|^agent_vibes_/, '')
36
- .replace(/_v\d+_loop$|_loop$|_v\d+$/, '')
37
- .replace(/_/g, ' ')
38
- .replace(/\b\w/g, c => c.toUpperCase());
39
- }
40
-
41
- /**
42
- * Beautify a raw voice identifier for display in narrow table columns.
43
- *
44
- * Examples:
45
- * 16Speakers::Rose_Ibex → Rose Ibex
46
- * 16Speakers::Emily_Cripps → Emily Cripps
47
- * en_US-kusal-medium → Kusal
48
- * en_US-lessac-high Lessac
49
- * en_US-libritts_r-medium Libritts R
50
- * kristin Kristin
51
- *
52
- * @param {string} voice - raw voice identifier
53
- * @returns {string}
54
- */
55
- export function formatVoiceName(voice) {
56
- if (!voice) return '(global)';
57
-
58
- let name;
59
- if (voice.includes('::')) {
60
- // 16Speakers::Rose_Ibex → extract after '::'
61
- name = voice.split('::')[1];
62
- } else {
63
- const parts = voice.split('-');
64
- const QUALITIES = new Set(['high', 'medium', 'low']);
65
- if (parts.length >= 2 && /^[a-z]{2}_[A-Z]{2}$/.test(parts[0])) {
66
- // Strip locale prefix and quality suffix
67
- name = parts.slice(1).filter(p => !QUALITIES.has(p)).join(' ');
68
- } else {
69
- name = voice;
70
- }
71
- }
72
-
73
- // Replace underscores with spaces, title-case each word
74
- return name
75
- .replace(/_/g, ' ')
76
- .split(' ')
77
- .filter(Boolean)
78
- .map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
79
- .join(' ') || '(global)';
80
- }
81
-
82
- /**
83
- * @param {string} preset - 'off' | 'light' | 'medium' | 'heavy' | 'cathedral'
84
- * @returns {string}
85
- */
86
- export function formatReverbState(preset) {
87
- const LABELS = { off: 'Off', light: 'Light (Small room)', medium: 'Medium (Conference room)', heavy: 'Heavy (Large hall)', cathedral: 'Cathedral (Epic space)' };
88
- return LABELS[preset] ?? LABELS.light;
89
- }
1
+ /**
2
+ * AgentVibes TUI — Shared Format Utilities
3
+ *
4
+ * Pure formatting functions extracted from settings-tab.js to avoid
5
+ * circular imports between widgets and tabs.
6
+ */
7
+
8
+ const TRACK_NAMES = Object.freeze({
9
+ 'agentvibes_soft_flamenco_loop.mp3': '🎻 Soft Flamenco',
10
+ 'agent_vibes_bachata_v1_loop.mp3': '🎺 Bachata',
11
+ 'agent_vibes_salsa_v2_loop.mp3': '💃 Salsa',
12
+ 'agent_vibes_cumbia_v1_loop.mp3': '🎸 Cumbia',
13
+ 'agent_vibes_bossa_nova_v2_loop.mp3': '🌸 Bossa Nova',
14
+ 'agent_vibes_japanese_city_pop_v1_loop.mp3': '🌆 Japanese City Pop',
15
+ 'agent_vibes_chillwave_v2_loop.mp3': '🌊 Chillwave',
16
+ 'agent_vibes_dark_chill_step_loop.mp3': '🌙 Dark Chill Step',
17
+ 'agent_vibes_goa_trance_v2_loop.mp3': '🌀 Goa Trance',
18
+ 'agent_vibes_harpsichord_v2_loop.mp3': '🎼 Harpsichord',
19
+ 'agent_vibes_celtic_harp_v1_loop.mp3': '🎻 Celtic Harp',
20
+ 'agent_vibes_hawaiian_slack_key_guitar_v2_loop.mp3': '🌺 Hawaiian Slack Key Guitar',
21
+ 'agent_vibes_arabic_v2_loop.mp3': '🎵 Arabic Oud',
22
+ 'agent_vibes_ganawa_ambient_v2_loop.mp3': '🪘 Gnawa Ambient',
23
+ 'agent_vibes_tabla_dream_pop_v1_loop.mp3': '🥁 Tabla Dream Pop',
24
+ 'Late Night Hip Hop Groove.mp3': '🎤 Late Night Hip Hop Groove',
25
+ 'Drifting Down the Hall.mp3': '🌃 Drifting Down the Hall',
26
+ 'Midnight Charleston Stomp.mp3': '🎩 Midnight Charleston Stomp',
27
+ });
28
+
29
+ /**
30
+ * @param {string} track - filename (e.g. 'agentvibes_soft_flamenco_loop.mp3')
31
+ * @returns {string}
32
+ */
33
+ export function formatTrackName(track) {
34
+ if (!track) return 'None';
35
+ if (TRACK_NAMES[track]) return TRACK_NAMES[track];
36
+ return track
37
+ .replace(/\.[^.]+$/, '')
38
+ .replace(/^agentvibes_|^agent_vibes_/, '')
39
+ .replace(/_v\d+_loop$|_loop$|_v\d+$/, '')
40
+ .replace(/_/g, ' ')
41
+ .replace(/\b\w/g, c => c.toUpperCase());
42
+ }
43
+
44
+ /**
45
+ * Beautify a raw voice identifier for display in narrow table columns.
46
+ *
47
+ * Examples:
48
+ * 16Speakers::Rose_Ibex Rose Ibex
49
+ * 16Speakers::Emily_Cripps Emily Cripps
50
+ * en_US-kusal-medium Kusal
51
+ * en_US-lessac-high → Lessac
52
+ * en_US-libritts_r-medium → Libritts R
53
+ * kristin → Kristin
54
+ *
55
+ * @param {string} voice - raw voice identifier
56
+ * @returns {string}
57
+ */
58
+ export function formatVoiceName(voice) {
59
+ if (!voice) return '(global)';
60
+
61
+ let name;
62
+ if (voice.includes('::')) {
63
+ // 16Speakers::Rose_Ibex extract after '::'
64
+ name = voice.split('::')[1];
65
+ } else {
66
+ const parts = voice.split('-');
67
+ const QUALITIES = new Set(['high', 'medium', 'low']);
68
+ if (parts.length >= 2 && /^[a-z]{2}_[A-Z]{2}$/.test(parts[0])) {
69
+ // Strip locale prefix and quality suffix
70
+ name = parts.slice(1).filter(p => !QUALITIES.has(p)).join(' ');
71
+ } else {
72
+ name = voice;
73
+ }
74
+ }
75
+
76
+ // Replace underscores with spaces, title-case each word
77
+ return name
78
+ .replace(/_/g, ' ')
79
+ .split(' ')
80
+ .filter(Boolean)
81
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
82
+ .join(' ') || '(global)';
83
+ }
84
+
85
+ /**
86
+ * @param {string} preset - 'off' | 'light' | 'medium' | 'heavy' | 'cathedral'
87
+ * @returns {string}
88
+ */
89
+ export function formatReverbState(preset) {
90
+ const LABELS = { off: 'Off', light: 'Light (Small room)', medium: 'Medium (Conference room)', heavy: 'Heavy (Large hall)', cathedral: 'Cathedral (Epic space)' };
91
+ return LABELS[preset] ?? LABELS.light;
92
+ }