agentvibes 4.2.0 → 4.4.1
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/.agentvibes/bmad/bmad-voices.md +69 -69
- package/.agentvibes/config.json +12 -0
- package/.claude/activation-instructions +54 -54
- package/.claude/audio/tracks/README.md +52 -52
- package/.claude/commands/agent-vibes/add.md +21 -21
- package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
- package/.claude/commands/agent-vibes/agent.md +79 -79
- package/.claude/commands/agent-vibes/background-music.md +111 -111
- package/.claude/commands/agent-vibes/bmad.md +198 -198
- package/.claude/commands/agent-vibes/clean.md +18 -18
- package/.claude/commands/agent-vibes/cleanup.md +18 -18
- package/.claude/commands/agent-vibes/commands.json +145 -145
- package/.claude/commands/agent-vibes/effects.md +97 -97
- package/.claude/commands/agent-vibes/get.md +9 -9
- package/.claude/commands/agent-vibes/hide.md +91 -91
- package/.claude/commands/agent-vibes/language.md +23 -23
- package/.claude/commands/agent-vibes/learn.md +67 -67
- package/.claude/commands/agent-vibes/list.md +13 -13
- package/.claude/commands/agent-vibes/mute.md +37 -37
- package/.claude/commands/agent-vibes/preview.md +17 -17
- package/.claude/commands/agent-vibes/provider.md +68 -68
- package/.claude/commands/agent-vibes/replay-target.md +14 -14
- package/.claude/commands/agent-vibes/sample.md +12 -12
- package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
- package/.claude/commands/agent-vibes/set-pretext.md +65 -65
- package/.claude/commands/agent-vibes/set-speed.md +41 -41
- package/.claude/commands/agent-vibes/show.md +84 -84
- package/.claude/commands/agent-vibes/switch.md +87 -87
- package/.claude/commands/agent-vibes/target-voice.md +26 -26
- package/.claude/commands/agent-vibes/target.md +30 -30
- package/.claude/commands/agent-vibes/translate.md +68 -68
- package/.claude/commands/agent-vibes/unmute.md +45 -45
- package/.claude/commands/agent-vibes/verbosity.md +89 -89
- package/.claude/commands/agent-vibes/whoami.md +7 -7
- package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
- package/.claude/commands/agent-vibes-rdp.md +24 -24
- package/.claude/config/agentvibes.json +1 -0
- package/.claude/config/audio-effects.cfg +2 -2
- package/.claude/config/audio-effects.cfg.sample +52 -52
- package/.claude/config/background-music-volume.txt +1 -0
- package/.claude/config/intro-text.txt +1 -0
- package/.claude/config/piper-speech-rate.txt +4 -0
- package/.claude/config/piper-target-speech-rate.txt +1 -0
- package/.claude/config/reverb-level.txt +1 -0
- package/.claude/config/tts-speech-rate.txt +4 -0
- package/.claude/config/tts-target-speech-rate.txt +1 -0
- package/.claude/docs/TERMUX_SETUP.md +408 -408
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/README-TTS-QUEUE.md +135 -135
- package/.claude/hooks/audio-cache-utils.sh +246 -246
- package/.claude/hooks/audio-processor.sh +433 -433
- package/.claude/hooks/background-music-manager.sh +404 -404
- package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
- package/.claude/hooks/bmad-speak.sh +269 -269
- package/.claude/hooks/bmad-tts-injector.sh +568 -568
- package/.claude/hooks/bmad-voice-manager.sh +928 -928
- package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
- package/.claude/hooks/clawdbot-receiver.sh +107 -107
- package/.claude/hooks/clean-audio-cache.sh +22 -22
- package/.claude/hooks/cleanup-cache.sh +106 -106
- package/.claude/hooks/configure-rdp-mode.sh +137 -137
- package/.claude/hooks/download-extra-voices.sh +244 -244
- package/.claude/hooks/effects-manager.sh +268 -268
- package/.claude/hooks/github-star-reminder.sh +154 -154
- package/.claude/hooks/language-manager.sh +362 -362
- package/.claude/hooks/learn-manager.sh +492 -492
- package/.claude/hooks/macos-voice-manager.sh +205 -205
- package/.claude/hooks/migrate-background-music.sh +125 -125
- package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
- package/.claude/hooks/optimize-background-music.sh +87 -87
- package/.claude/hooks/path-resolver.sh +60 -60
- package/.claude/hooks/personality-manager.sh +448 -448
- package/.claude/hooks/piper-download-voices.sh +225 -225
- package/.claude/hooks/piper-installer.sh +292 -292
- package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
- package/.claude/hooks/piper-voice-manager.sh +24 -3
- package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
- package/.claude/hooks/play-tts-enhanced.sh +105 -105
- package/.claude/hooks/play-tts-macos.sh +368 -368
- package/.claude/hooks/play-tts-piper.sh +679 -679
- package/.claude/hooks/play-tts-soprano.sh +356 -356
- package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
- package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
- package/.claude/hooks/play-tts.sh +301 -301
- package/.claude/hooks/prepare-release.sh +54 -54
- package/.claude/hooks/provider-commands.sh +617 -617
- package/.claude/hooks/provider-manager.sh +399 -399
- package/.claude/hooks/replay-target-audio.sh +95 -95
- package/.claude/hooks/requirements.txt +6 -6
- package/.claude/hooks/sentiment-manager.sh +201 -201
- package/.claude/hooks/session-start-tts.sh +81 -81
- package/.claude/hooks/soprano-gradio-synth.py +139 -139
- package/.claude/hooks/speed-manager.sh +291 -291
- package/.claude/hooks/stop-tts.sh +84 -84
- package/.claude/hooks/termux-installer.sh +261 -261
- package/.claude/hooks/translate-manager.sh +341 -341
- package/.claude/hooks/translator.py +237 -237
- package/.claude/hooks/tts-queue-worker.sh +145 -145
- package/.claude/hooks/tts-queue.sh +165 -165
- package/.claude/hooks/verbosity-manager.sh +178 -178
- package/.claude/hooks/voice-manager.sh +548 -548
- package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
- package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
- package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
- package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
- package/.claude/hooks-windows/effects-manager.ps1 +294 -0
- package/.claude/hooks-windows/language-manager.ps1 +193 -0
- package/.claude/hooks-windows/learn-manager.ps1 +241 -0
- package/.claude/hooks-windows/personality-manager.ps1 +266 -0
- package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
- package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
- package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
- package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
- package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
- package/.claude/hooks-windows/play-tts.ps1 +344 -266
- package/.claude/hooks-windows/provider-manager.ps1 +29 -10
- package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
- package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
- package/.claude/hooks-windows/speed-manager.ps1 +166 -0
- package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
- package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
- package/.claude/output-styles/agent-vibes.md +202 -202
- package/.claude/personalities/angry.md +14 -14
- package/.claude/personalities/annoying.md +14 -14
- package/.claude/personalities/crass.md +14 -14
- package/.claude/personalities/dramatic.md +14 -14
- package/.claude/personalities/dry-humor.md +50 -50
- package/.claude/personalities/flirty.md +20 -20
- package/.claude/personalities/funny.md +14 -14
- package/.claude/personalities/grandpa.md +32 -32
- package/.claude/personalities/millennial.md +14 -14
- package/.claude/personalities/moody.md +14 -14
- package/.claude/personalities/normal.md +16 -16
- package/.claude/personalities/pirate.md +14 -14
- package/.claude/personalities/poetic.md +14 -14
- package/.claude/personalities/professional.md +14 -14
- package/.claude/personalities/rapper.md +55 -55
- package/.claude/personalities/robot.md +14 -14
- package/.claude/personalities/sarcastic.md +38 -38
- package/.claude/personalities/sassy.md +14 -14
- package/.claude/personalities/surfer-dude.md +14 -14
- package/.claude/personalities/zen.md +14 -14
- package/.claude/settings.json +15 -15
- package/.claude/verbosity.txt +1 -1
- package/.clawdbot/README.md +105 -105
- package/.clawdbot/skill/SKILL.md +241 -241
- package/.mcp.json +12 -0
- package/CLAUDE.md +170 -170
- package/README.md +2029 -2007
- package/RELEASE_NOTES.md +1310 -1203
- package/WINDOWS-SETUP.md +208 -208
- package/bin/agent-vibes +39 -39
- package/bin/agentvibes-voice-browser.js +1840 -1840
- package/bin/agentvibes.js +48 -2
- package/bin/mcp-server.js +121 -121
- package/bin/mcp-server.sh +206 -206
- package/bin/test-bmad-pr +78 -78
- package/mcp-server/QUICK_START.md +203 -203
- package/mcp-server/README.md +345 -345
- package/mcp-server/WINDOWS_SETUP.md +260 -260
- package/mcp-server/docs/troubleshooting-audio.md +313 -313
- package/mcp-server/examples/claude_desktop_config.json +11 -11
- package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
- package/mcp-server/examples/custom_instructions.md +169 -169
- package/mcp-server/install-deps.js +130 -130
- package/mcp-server/pyproject.toml +52 -52
- package/mcp-server/requirements.txt +2 -2
- package/mcp-server/server.py +1465 -1453
- package/mcp-server/test_server.py +395 -395
- package/mcp-server/test_windows_script_parity.py +336 -0
- package/package.json +110 -110
- package/setup-windows.ps1 +815 -815
- package/src/bmad-detector.js +71 -71
- package/src/cli/list-personalities.js +110 -110
- package/src/cli/list-voices.js +114 -114
- package/src/commands/bmad-voices.js +394 -394
- package/src/commands/install-mcp.js +476 -476
- package/src/console/app.js +824 -824
- package/src/console/audio-env.js +20 -1
- package/src/console/brand-colors.js +13 -13
- package/src/console/constants/personalities.js +44 -44
- package/src/console/footer-config.js +50 -50
- package/src/console/modals/modal-overlay.js +247 -247
- package/src/console/navigation.js +62 -62
- package/src/console/tabs/agents-tab.js +1684 -1516
- package/src/console/tabs/help-tab.js +261 -261
- package/src/console/tabs/install-tab.js +1007 -991
- package/src/console/tabs/music-tab.js +22 -8
- package/src/console/tabs/placeholder-tab.js +53 -53
- package/src/console/tabs/readme-tab.js +267 -267
- package/src/console/tabs/receiver-tab.js +1472 -1212
- package/src/console/tabs/settings-tab.js +208 -84
- package/src/console/tabs/voices-tab.js +100 -21
- package/src/console/widgets/destroy-list.js +25 -25
- package/src/console/widgets/format-utils.js +89 -89
- package/src/console/widgets/notice.js +55 -55
- package/src/console/widgets/personality-picker.js +185 -185
- package/src/console/widgets/reverb-picker.js +94 -94
- package/src/console/widgets/track-picker.js +285 -285
- package/src/installer/music-file-input.js +304 -304
- package/src/installer.js +5895 -5829
- package/src/services/agent-voice-store.js +423 -423
- package/src/services/config-service.js +264 -264
- package/src/services/navigation-service.js +123 -123
- package/src/services/provider-service.js +143 -132
- package/src/services/verbosity-service.js +157 -157
- package/src/utils/audio-duration-validator.js +298 -298
- package/src/utils/audio-format-validator.js +277 -277
- package/src/utils/dependency-checker.js +469 -466
- package/src/utils/file-ownership-verifier.js +358 -358
- package/src/utils/list-formatter.js +194 -194
- package/src/utils/music-file-validator.js +285 -285
- package/src/utils/preview-list-prompt.js +136 -136
- package/src/utils/provider-validator.js +96 -12
- package/src/utils/secure-music-storage.js +412 -412
- package/templates/agentvibes-receiver.sh +482 -482
- package/templates/audio/welcome-music.mp3 +0 -0
- package/voice-assignments.json +8244 -8244
- package/.claude/config/background-music-position.txt +0 -1
|
@@ -1,157 +1,157 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgentVibes VerbosityService
|
|
3
|
-
* Epic 10: Stories 10.1-10.4
|
|
4
|
-
*
|
|
5
|
-
* Centralises verbosity logic for 5 levels: minimal, low, medium, high, custom.
|
|
6
|
-
*
|
|
7
|
-
* Hook types:
|
|
8
|
-
* - 'prompt-submit' — fires when user submits a prompt
|
|
9
|
-
* - 'response-complete' — fires when Claude finishes responding
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Ordered verbosity levels from quietest to most verbose.
|
|
16
|
-
* @type {string[]}
|
|
17
|
-
*/
|
|
18
|
-
export const VERBOSITY_LEVELS = Object.freeze(['minimal', 'low', 'medium', 'high', 'custom']);
|
|
19
|
-
|
|
20
|
-
// Per-level shouldSpeak configuration (fixed levels only; custom reads from config)
|
|
21
|
-
const LEVEL_SPEAK = Object.freeze({
|
|
22
|
-
minimal: { 'prompt-submit': false, 'response-complete': true },
|
|
23
|
-
low: { 'prompt-submit': false, 'response-complete': true },
|
|
24
|
-
medium: { 'prompt-submit': true, 'response-complete': true },
|
|
25
|
-
high: { 'prompt-submit': true, 'response-complete': true },
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
// Per-level static messages (null = use hook default message)
|
|
29
|
-
const LEVEL_MESSAGES = Object.freeze({
|
|
30
|
-
minimal: {
|
|
31
|
-
'prompt-submit': null,
|
|
32
|
-
'response-complete': 'Claude is ready for your input',
|
|
33
|
-
},
|
|
34
|
-
low: {
|
|
35
|
-
'prompt-submit': null,
|
|
36
|
-
'response-complete': null, // built dynamically: "Done. <summary>"
|
|
37
|
-
},
|
|
38
|
-
medium: { 'prompt-submit': null, 'response-complete': null },
|
|
39
|
-
high: { 'prompt-submit': null, 'response-complete': null },
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
|
|
44
|
-
export class VerbosityService {
|
|
45
|
-
/**
|
|
46
|
-
* @param {object} configService - AgentVibes ConfigService instance
|
|
47
|
-
*/
|
|
48
|
-
constructor(configService) {
|
|
49
|
-
this._config = configService;
|
|
50
|
-
this._migrated = false; // tracks whether migration ran in this session
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Returns the current verbosity level.
|
|
55
|
-
* Defaults to 'high' if not configured or unrecognised.
|
|
56
|
-
* @returns {'minimal'|'low'|'medium'|'high'|'custom'}
|
|
57
|
-
*/
|
|
58
|
-
getLevel() {
|
|
59
|
-
const cfg = this._config.getConfig();
|
|
60
|
-
const level = cfg.verbosity;
|
|
61
|
-
return VERBOSITY_LEVELS.includes(level) ? level : 'high';
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Returns whether TTS should speak for the given hook type.
|
|
66
|
-
*
|
|
67
|
-
* @param {'prompt-submit'|'response-complete'} hookType
|
|
68
|
-
* @returns {boolean}
|
|
69
|
-
*/
|
|
70
|
-
shouldSpeak(hookType) {
|
|
71
|
-
const level = this.getLevel();
|
|
72
|
-
if (level === 'custom') {
|
|
73
|
-
return this._customShouldSpeak(hookType);
|
|
74
|
-
}
|
|
75
|
-
const table = LEVEL_SPEAK[level] ?? LEVEL_SPEAK.high;
|
|
76
|
-
return table[hookType] ?? true;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Returns the message for the given hook type and context.
|
|
81
|
-
* Returns null to use the hook's own default message.
|
|
82
|
-
*
|
|
83
|
-
* @param {'prompt-submit'|'response-complete'} hookType
|
|
84
|
-
* @param {object} context - { summary?: string }
|
|
85
|
-
* @returns {string|null}
|
|
86
|
-
*/
|
|
87
|
-
getMessage(hookType, context) {
|
|
88
|
-
const level = this.getLevel();
|
|
89
|
-
if (level === 'high' || level === 'medium') return null;
|
|
90
|
-
|
|
91
|
-
if (level === 'low' && hookType === 'response-complete') {
|
|
92
|
-
const summary = context?.summary ?? '';
|
|
93
|
-
const trimmed = summary.slice(0, 30);
|
|
94
|
-
return trimmed.length > 0 ? `Done. ${trimmed}` : 'Done';
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (level === 'custom') return null; // custom uses hook defaults
|
|
98
|
-
|
|
99
|
-
return LEVEL_MESSAGES[level]?.[hookType] ?? null;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Checks if migration is needed (old 'low' → 'medium').
|
|
104
|
-
* If needed and not already done, performs migration and returns true.
|
|
105
|
-
* @returns {boolean} true if migration was performed, false otherwise
|
|
106
|
-
*/
|
|
107
|
-
checkMigration() {
|
|
108
|
-
const cfg = this._config.getConfig();
|
|
109
|
-
if (cfg.verbosityMigrated) return false;
|
|
110
|
-
if (cfg.verbosity !== 'low') return false;
|
|
111
|
-
|
|
112
|
-
// Migrate: old 'low' users get 'medium' in new system
|
|
113
|
-
this._config.set('verbosity', 'medium');
|
|
114
|
-
this._config.set('verbosityMigrated', true);
|
|
115
|
-
this._migrated = true;
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Returns true if a migration notice should be shown to the user.
|
|
121
|
-
* @returns {boolean}
|
|
122
|
-
*/
|
|
123
|
-
needsMigrationNotice() {
|
|
124
|
-
if (!this._migrated) return false;
|
|
125
|
-
const cfg = this._config.getConfig();
|
|
126
|
-
return !cfg.migrationNoticeDismissed;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Marks the migration notice as dismissed.
|
|
131
|
-
*/
|
|
132
|
-
dismissMigrationNotice() {
|
|
133
|
-
this._config.set('migrationNoticeDismissed', true);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// ---------------------------------------------------------------------------
|
|
137
|
-
// Private
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* shouldSpeak for CUSTOM level — reads per-hook toggles from config.customVerbosity.
|
|
141
|
-
* @param {string} hookType
|
|
142
|
-
* @returns {boolean}
|
|
143
|
-
*/
|
|
144
|
-
_customShouldSpeak(hookType) {
|
|
145
|
-
const cfg = this._config.getConfig();
|
|
146
|
-
const custom = cfg.customVerbosity ?? {};
|
|
147
|
-
const keyMap = {
|
|
148
|
-
'prompt-submit': 'promptSubmit',
|
|
149
|
-
'response-complete': 'responseComplete',
|
|
150
|
-
};
|
|
151
|
-
const key = keyMap[hookType];
|
|
152
|
-
if (key === undefined) return true;
|
|
153
|
-
return custom[key] !== false; // default true if not configured
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export default VerbosityService;
|
|
1
|
+
/**
|
|
2
|
+
* AgentVibes VerbosityService
|
|
3
|
+
* Epic 10: Stories 10.1-10.4
|
|
4
|
+
*
|
|
5
|
+
* Centralises verbosity logic for 5 levels: minimal, low, medium, high, custom.
|
|
6
|
+
*
|
|
7
|
+
* Hook types:
|
|
8
|
+
* - 'prompt-submit' — fires when user submits a prompt
|
|
9
|
+
* - 'response-complete' — fires when Claude finishes responding
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Ordered verbosity levels from quietest to most verbose.
|
|
16
|
+
* @type {string[]}
|
|
17
|
+
*/
|
|
18
|
+
export const VERBOSITY_LEVELS = Object.freeze(['minimal', 'low', 'medium', 'high', 'custom']);
|
|
19
|
+
|
|
20
|
+
// Per-level shouldSpeak configuration (fixed levels only; custom reads from config)
|
|
21
|
+
const LEVEL_SPEAK = Object.freeze({
|
|
22
|
+
minimal: { 'prompt-submit': false, 'response-complete': true },
|
|
23
|
+
low: { 'prompt-submit': false, 'response-complete': true },
|
|
24
|
+
medium: { 'prompt-submit': true, 'response-complete': true },
|
|
25
|
+
high: { 'prompt-submit': true, 'response-complete': true },
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Per-level static messages (null = use hook default message)
|
|
29
|
+
const LEVEL_MESSAGES = Object.freeze({
|
|
30
|
+
minimal: {
|
|
31
|
+
'prompt-submit': null,
|
|
32
|
+
'response-complete': 'Claude is ready for your input',
|
|
33
|
+
},
|
|
34
|
+
low: {
|
|
35
|
+
'prompt-submit': null,
|
|
36
|
+
'response-complete': null, // built dynamically: "Done. <summary>"
|
|
37
|
+
},
|
|
38
|
+
medium: { 'prompt-submit': null, 'response-complete': null },
|
|
39
|
+
high: { 'prompt-submit': null, 'response-complete': null },
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
export class VerbosityService {
|
|
45
|
+
/**
|
|
46
|
+
* @param {object} configService - AgentVibes ConfigService instance
|
|
47
|
+
*/
|
|
48
|
+
constructor(configService) {
|
|
49
|
+
this._config = configService;
|
|
50
|
+
this._migrated = false; // tracks whether migration ran in this session
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Returns the current verbosity level.
|
|
55
|
+
* Defaults to 'high' if not configured or unrecognised.
|
|
56
|
+
* @returns {'minimal'|'low'|'medium'|'high'|'custom'}
|
|
57
|
+
*/
|
|
58
|
+
getLevel() {
|
|
59
|
+
const cfg = this._config.getConfig();
|
|
60
|
+
const level = cfg.verbosity;
|
|
61
|
+
return VERBOSITY_LEVELS.includes(level) ? level : 'high';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns whether TTS should speak for the given hook type.
|
|
66
|
+
*
|
|
67
|
+
* @param {'prompt-submit'|'response-complete'} hookType
|
|
68
|
+
* @returns {boolean}
|
|
69
|
+
*/
|
|
70
|
+
shouldSpeak(hookType) {
|
|
71
|
+
const level = this.getLevel();
|
|
72
|
+
if (level === 'custom') {
|
|
73
|
+
return this._customShouldSpeak(hookType);
|
|
74
|
+
}
|
|
75
|
+
const table = LEVEL_SPEAK[level] ?? LEVEL_SPEAK.high;
|
|
76
|
+
return table[hookType] ?? true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Returns the message for the given hook type and context.
|
|
81
|
+
* Returns null to use the hook's own default message.
|
|
82
|
+
*
|
|
83
|
+
* @param {'prompt-submit'|'response-complete'} hookType
|
|
84
|
+
* @param {object} context - { summary?: string }
|
|
85
|
+
* @returns {string|null}
|
|
86
|
+
*/
|
|
87
|
+
getMessage(hookType, context) {
|
|
88
|
+
const level = this.getLevel();
|
|
89
|
+
if (level === 'high' || level === 'medium') return null;
|
|
90
|
+
|
|
91
|
+
if (level === 'low' && hookType === 'response-complete') {
|
|
92
|
+
const summary = context?.summary ?? '';
|
|
93
|
+
const trimmed = summary.slice(0, 30);
|
|
94
|
+
return trimmed.length > 0 ? `Done. ${trimmed}` : 'Done';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (level === 'custom') return null; // custom uses hook defaults
|
|
98
|
+
|
|
99
|
+
return LEVEL_MESSAGES[level]?.[hookType] ?? null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Checks if migration is needed (old 'low' → 'medium').
|
|
104
|
+
* If needed and not already done, performs migration and returns true.
|
|
105
|
+
* @returns {boolean} true if migration was performed, false otherwise
|
|
106
|
+
*/
|
|
107
|
+
checkMigration() {
|
|
108
|
+
const cfg = this._config.getConfig();
|
|
109
|
+
if (cfg.verbosityMigrated) return false;
|
|
110
|
+
if (cfg.verbosity !== 'low') return false;
|
|
111
|
+
|
|
112
|
+
// Migrate: old 'low' users get 'medium' in new system
|
|
113
|
+
this._config.set('verbosity', 'medium');
|
|
114
|
+
this._config.set('verbosityMigrated', true);
|
|
115
|
+
this._migrated = true;
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Returns true if a migration notice should be shown to the user.
|
|
121
|
+
* @returns {boolean}
|
|
122
|
+
*/
|
|
123
|
+
needsMigrationNotice() {
|
|
124
|
+
if (!this._migrated) return false;
|
|
125
|
+
const cfg = this._config.getConfig();
|
|
126
|
+
return !cfg.migrationNoticeDismissed;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Marks the migration notice as dismissed.
|
|
131
|
+
*/
|
|
132
|
+
dismissMigrationNotice() {
|
|
133
|
+
this._config.set('migrationNoticeDismissed', true);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Private
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* shouldSpeak for CUSTOM level — reads per-hook toggles from config.customVerbosity.
|
|
141
|
+
* @param {string} hookType
|
|
142
|
+
* @returns {boolean}
|
|
143
|
+
*/
|
|
144
|
+
_customShouldSpeak(hookType) {
|
|
145
|
+
const cfg = this._config.getConfig();
|
|
146
|
+
const custom = cfg.customVerbosity ?? {};
|
|
147
|
+
const keyMap = {
|
|
148
|
+
'prompt-submit': 'promptSubmit',
|
|
149
|
+
'response-complete': 'responseComplete',
|
|
150
|
+
};
|
|
151
|
+
const key = keyMap[hookType];
|
|
152
|
+
if (key === undefined) return true;
|
|
153
|
+
return custom[key] !== false; // default true if not configured
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export default VerbosityService;
|