opencode-smart-voice-notify 1.2.2 → 1.2.3

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,356 +1,356 @@
1
- {
2
- // ============================================================
3
- // OpenCode Smart Voice Notify - Full Configuration Reference
4
- // ============================================================
5
- //
6
- // IMPORTANT: This is a REFERENCE file showing ALL available options.
7
- //
8
- // To use this plugin:
9
- // 1. Copy this file to: ~/.config/opencode/smart-voice-notify.jsonc
10
- // (On Windows: C:\Users\<YourUser>\.config\opencode\smart-voice-notify.jsonc)
11
- // 2. Customize the settings below to your preference
12
- // 3. The plugin auto-creates a minimal config if none exists
13
- //
14
- // Sound files are automatically copied to ~/.config/opencode/assets/
15
- // on first run. You can also use your own custom sound files.
16
- //
17
- // ============================================================
18
-
19
- // ============================================================
20
- // PLUGIN ENABLE/DISABLE
21
- // ============================================================
22
- // Master switch to enable or disable the entire plugin.
23
- // Set to false to disable all notifications without uninstalling.
24
- "enabled": true,
25
-
26
- // ============================================================
27
- // NOTIFICATION MODE SETTINGS (Smart Notification System)
28
- // ============================================================
29
- // Controls how notifications are delivered:
30
- // 'sound-first' - Play sound immediately, TTS reminder after delay (RECOMMENDED)
31
- // 'tts-first' - Speak TTS immediately, no sound
32
- // 'both' - Play sound AND speak TTS immediately
33
- // 'sound-only' - Only play sound, no TTS at all
34
- "notificationMode": "sound-first",
35
-
36
- // ============================================================
37
- // TTS REMINDER SETTINGS (When user doesn't respond to sound)
38
- // ============================================================
39
-
40
- // Enable TTS reminder if user doesn't respond after sound notification
41
- "enableTTSReminder": true,
42
-
43
- // Delay (in seconds) before TTS reminder fires
44
- // Set globally or per-notification type
45
- "ttsReminderDelaySeconds": 30, // Global default
46
- "idleReminderDelaySeconds": 30, // For task completion notifications
47
- "permissionReminderDelaySeconds": 20, // For permission requests (more urgent)
48
-
49
- // Follow-up reminders if user STILL doesn't respond after first TTS
50
- "enableFollowUpReminders": true,
51
- "maxFollowUpReminders": 3, // Max number of follow-up TTS reminders
52
- "reminderBackoffMultiplier": 1.5, // Each follow-up waits longer (30s, 45s, 67s...)
53
-
54
- // ============================================================
55
- // PERMISSION BATCHING (Multiple permissions at once)
56
- // ============================================================
57
- // When multiple permissions arrive simultaneously (e.g., 5 at once),
58
- // batch them into a single notification instead of playing 5 overlapping sounds.
59
- // The notification will say "X permission requests require your attention".
60
-
61
- // Batch window (ms) - how long to wait for more permissions before notifying
62
- "permissionBatchWindowMs": 800,
63
-
64
- // ============================================================
65
- // TTS ENGINE SELECTION
66
- // ============================================================
67
- // 'elevenlabs' - Best quality, anime-like voices (requires API key, free tier: 10k chars/month)
68
- // 'edge' - Good quality neural voices (Free, Native Node.js implementation)
69
- // 'sapi' - Windows built-in voices (free, offline, robotic)
70
- "ttsEngine": "elevenlabs",
71
-
72
- // Enable TTS for notifications (falls back to sound files if TTS fails)
73
- "enableTTS": true,
74
-
75
- // ============================================================
76
- // ELEVENLABS SETTINGS (Best Quality - Anime-like Voices)
77
- // ============================================================
78
- // Get your API key from: https://elevenlabs.io/app/settings/api-keys
79
- // Free tier: 10,000 characters/month
80
- "elevenLabsApiKey": "YOUR_API_KEY_HERE",
81
-
82
- // Voice ID - Recommended cute/anime-like voices:
83
- // 'cgSgspJ2msm6clMCkdW9' - Jessica (Playful, Bright, Warm) - RECOMMENDED
84
- // 'FGY2WhTYpPnrIDTdsKH5' - Laura (Enthusiast, Quirky)
85
- // 'jsCqWAovK2LkecY7zXl4' - Freya (Expressive, Confident)
86
- // 'EXAVITQu4vr4xnSDxMaL' - Sarah (Soft, Warm)
87
- // Browse more at: https://elevenlabs.io/voice-library
88
- "elevenLabsVoiceId": "cgSgspJ2msm6clMCkdW9",
89
-
90
- // Model: 'eleven_turbo_v2_5' (fast, good), 'eleven_multilingual_v2' (highest quality)
91
- "elevenLabsModel": "eleven_turbo_v2_5",
92
-
93
- // Voice tuning (0.0 to 1.0)
94
- "elevenLabsStability": 0.5, // Lower = more expressive, Higher = more consistent
95
- "elevenLabsSimilarity": 0.75, // How closely to match the original voice
96
- "elevenLabsStyle": 0.5, // Style exaggeration (higher = more expressive)
97
-
98
- // ============================================================
99
- // EDGE TTS SETTINGS (Free Neural Voices - Fallback)
100
- // ============================================================
101
- // Native Node.js implementation (No external dependencies)
102
-
103
- // Voice options (run 'edge-tts --list-voices' to see all):
104
- // 'en-US-AnaNeural' - Young, cute, cartoon-like (RECOMMENDED)
105
- // 'en-US-JennyNeural' - Friendly, warm
106
- // 'en-US-AriaNeural' - Confident, clear
107
- // 'en-GB-SoniaNeural' - British, friendly
108
- // 'en-AU-NatashaNeural' - Australian, warm
109
- "edgeVoice": "en-US-AnaNeural",
110
-
111
- // Pitch adjustment: +0Hz to +100Hz (higher = more anime-like)
112
- "edgePitch": "+50Hz",
113
-
114
- // Speech rate: -50% to +100%
115
- "edgeRate": "+10%",
116
-
117
- // ============================================================
118
- // SAPI SETTINGS (Windows Built-in - Last Resort Fallback)
119
- // ============================================================
120
-
121
- // Voice (run PowerShell to list all installed voices):
122
- // Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).GetInstalledVoices() | % { $_.VoiceInfo.Name }
123
- //
124
- // Common Windows voices:
125
- // 'Microsoft Zira Desktop' - Female, US English
126
- // 'Microsoft David Desktop' - Male, US English
127
- // 'Microsoft Hazel Desktop' - Female, UK English
128
- "sapiVoice": "Microsoft Zira Desktop",
129
-
130
- // Speech rate: -10 (slowest) to +10 (fastest), 0 is normal
131
- "sapiRate": -1,
132
-
133
- // Pitch: 'x-low', 'low', 'medium', 'high', 'x-high'
134
- "sapiPitch": "medium",
135
-
136
- // Volume: 'silent', 'x-soft', 'soft', 'medium', 'loud', 'x-loud'
137
- "sapiVolume": "loud",
138
-
139
- // ============================================================
140
- // INITIAL TTS MESSAGES (Used immediately or after sound)
141
- // These are randomly selected each time for variety
142
- // ============================================================
143
-
144
- // Messages when agent finishes work (task completion)
145
- "idleTTSMessages": [
146
- "All done! Your task has been completed successfully.",
147
- "Hey there! I finished working on your request.",
148
- "Task complete! Ready for your review whenever you are.",
149
- "Good news! Everything is done and ready for you.",
150
- "Finished! Let me know if you need anything else."
151
- ],
152
-
153
- // Messages for permission requests
154
- "permissionTTSMessages": [
155
- "Attention please! I need your permission to continue.",
156
- "Hey! Quick approval needed to proceed with the task.",
157
- "Heads up! There is a permission request waiting for you.",
158
- "Excuse me! I need your authorization before I can continue.",
159
- "Permission required! Please review and approve when ready."
160
- ],
161
-
162
- // Messages for MULTIPLE permission requests (use {count} placeholder)
163
- // Used when several permissions arrive simultaneously
164
- "permissionTTSMessagesMultiple": [
165
- "Attention please! There are {count} permission requests waiting for your approval.",
166
- "Hey! {count} permissions need your approval to continue.",
167
- "Heads up! You have {count} pending permission requests.",
168
- "Excuse me! I need your authorization for {count} different actions.",
169
- "{count} permissions required! Please review and approve when ready."
170
- ],
171
-
172
- // ============================================================
173
- // TTS REMINDER MESSAGES (More urgent - used after delay if no response)
174
- // These are more personalized and urgent to get user attention
175
- // ============================================================
176
-
177
- // Reminder messages when agent finished but user hasn't responded
178
- "idleReminderTTSMessages": [
179
- "Hey, are you still there? Your task has been waiting for review.",
180
- "Just a gentle reminder - I finished your request a while ago!",
181
- "Hello? I completed your task. Please take a look when you can.",
182
- "Still waiting for you! The work is done and ready for review.",
183
- "Knock knock! Your completed task is patiently waiting for you."
184
- ],
185
-
186
- // Reminder messages when permission still needed
187
- "permissionReminderTTSMessages": [
188
- "Hey! I still need your permission to continue. Please respond!",
189
- "Reminder: There is a pending permission request. I cannot proceed without you.",
190
- "Hello? I am waiting for your approval. This is getting urgent!",
191
- "Please check your screen! I really need your permission to move forward.",
192
- "Still waiting for authorization! The task is on hold until you respond."
193
- ],
194
-
195
- // Reminder messages for MULTIPLE permissions (use {count} placeholder)
196
- "permissionReminderTTSMessagesMultiple": [
197
- "Hey! I still need your approval for {count} permissions. Please respond!",
198
- "Reminder: There are {count} pending permission requests. I cannot proceed without you.",
199
- "Hello? I am waiting for your approval on {count} items. This is getting urgent!",
200
- "Please check your screen! {count} permissions are waiting for your response.",
201
- "Still waiting for authorization on {count} requests! The task is on hold."
202
- ],
203
-
204
- // ============================================================
205
- // QUESTION TOOL MESSAGES (SDK v1.1.7+ - Agent asking user questions)
206
- // ============================================================
207
- // The "question" tool allows the LLM to ask users questions during execution.
208
- // This is useful for gathering preferences, clarifying instructions, or getting
209
- // decisions on implementation choices.
210
-
211
- // Messages when agent asks user a question
212
- "questionTTSMessages": [
213
- "Hey! I have a question for you. Please check your screen.",
214
- "Attention! I need your input to continue.",
215
- "Quick question! Please take a look when you have a moment.",
216
- "I need some clarification. Could you please respond?",
217
- "Question time! Your input is needed to proceed."
218
- ],
219
-
220
- // Messages for MULTIPLE questions (use {count} placeholder)
221
- "questionTTSMessagesMultiple": [
222
- "Hey! I have {count} questions for you. Please check your screen.",
223
- "Attention! I need your input on {count} items to continue.",
224
- "{count} questions need your attention. Please take a look!",
225
- "I need some clarifications. There are {count} questions waiting for you.",
226
- "Question time! {count} questions need your response to proceed."
227
- ],
228
-
229
- // Reminder messages for questions (more urgent - used after delay)
230
- "questionReminderTTSMessages": [
231
- "Hey! I am still waiting for your answer. Please check the questions!",
232
- "Reminder: There is a question waiting for your response.",
233
- "Hello? I need your input to continue. Please respond when you can.",
234
- "Still waiting for your answer! The task is on hold.",
235
- "Your input is needed! Please check the pending question."
236
- ],
237
-
238
- // Reminder messages for MULTIPLE questions (use {count} placeholder)
239
- "questionReminderTTSMessagesMultiple": [
240
- "Hey! I am still waiting for answers to {count} questions. Please respond!",
241
- "Reminder: There are {count} questions waiting for your response.",
242
- "Hello? I need your input on {count} items. Please respond when you can.",
243
- "Still waiting for your answers on {count} questions! The task is on hold.",
244
- "Your input is needed! {count} questions are pending your response."
245
- ],
246
-
247
- // Delay (in seconds) before question reminder fires
248
- "questionReminderDelaySeconds": 25,
249
-
250
- // Question batch window (ms) - how long to wait for more questions before notifying
251
- "questionBatchWindowMs": 800,
252
-
253
- // ============================================================
254
- // AI MESSAGE GENERATION (OpenAI-Compatible Endpoints)
255
- // ============================================================
256
- // Use a local/self-hosted AI to generate dynamic notification messages
257
- // instead of using preset static messages. The AI generates the text,
258
- // which is then spoken by your configured TTS engine (ElevenLabs, Edge, etc.)
259
- //
260
- // Supports: Ollama, LM Studio, LocalAI, vLLM, llama.cpp, Jan.ai, and any
261
- // OpenAI-compatible endpoint. You provide your own endpoint URL and API key.
262
- //
263
- // HOW IT WORKS:
264
- // 1. When a notification is triggered (task complete, permission needed, etc.)
265
- // 2. If AI is enabled, the plugin sends a prompt to your AI server
266
- // 3. The AI generates a unique, contextual notification message
267
- // 4. That message is spoken by your TTS engine (ElevenLabs, Edge, SAPI)
268
- // 5. If AI fails, it falls back to the static messages defined above
269
-
270
- // Enable AI-generated messages (experimental feature)
271
- // Default: false (uses static messages defined above)
272
- "enableAIMessages": false,
273
-
274
- // Your AI server endpoint URL
275
- // Common local AI servers and their default endpoints:
276
- // Ollama: http://localhost:11434/v1
277
- // LM Studio: http://localhost:1234/v1
278
- // LocalAI: http://localhost:8080/v1
279
- // vLLM: http://localhost:8000/v1
280
- // llama.cpp: http://localhost:8080/v1
281
- // Jan.ai: http://localhost:1337/v1
282
- // text-gen-webui: http://localhost:5000/v1
283
- "aiEndpoint": "http://localhost:11434/v1",
284
-
285
- // Model name to use (must match a model loaded in your AI server)
286
- // Examples for Ollama: "llama3", "llama3.2", "mistral", "phi3", "gemma2", "qwen2"
287
- // For LM Studio: Use the model name shown in the UI
288
- "aiModel": "llama3",
289
-
290
- // API key for your AI server
291
- // Most local servers (Ollama, LM Studio, LocalAI) don't require a key - leave empty
292
- // Only set this if your server requires authentication
293
- // For vLLM with auth disabled, use "EMPTY"
294
- "aiApiKey": "",
295
-
296
- // Request timeout in milliseconds
297
- // Local AI can be slow on first request (model loading), so 15 seconds is recommended
298
- // Increase if you have a slower machine or larger models
299
- "aiTimeout": 15000,
300
-
301
- // Fall back to static messages (defined above) if AI generation fails
302
- // Recommended: true - ensures notifications always work even if AI is down
303
- "aiFallbackToStatic": true,
304
-
305
- // Custom prompts for each notification type
306
- // You can customize these to change the AI's personality/style
307
- // The AI will generate a short message based on these prompts
308
- // TIP: Keep prompts concise - they're sent with each notification
309
- "aiPrompts": {
310
- "idle": "Generate a single brief, friendly notification sentence (max 15 words) saying a coding task is complete. Be encouraging and warm. Output only the message, no quotes.",
311
- "permission": "Generate a single brief, urgent but friendly notification sentence (max 15 words) asking the user to approve a permission request. Output only the message, no quotes.",
312
- "question": "Generate a single brief, polite notification sentence (max 15 words) saying the assistant has a question and needs user input. Output only the message, no quotes.",
313
- "idleReminder": "Generate a single brief, gentle reminder sentence (max 15 words) that a completed task is waiting for review. Be slightly more insistent. Output only the message, no quotes.",
314
- "permissionReminder": "Generate a single brief, urgent reminder sentence (max 15 words) that permission approval is still needed. Convey importance. Output only the message, no quotes.",
315
- "questionReminder": "Generate a single brief, polite but persistent reminder sentence (max 15 words) that a question is still waiting for an answer. Output only the message, no quotes."
316
- },
317
-
318
- // ============================================================
319
- // SOUND FILES (For immediate notifications)
320
- // These are played first before TTS reminder kicks in
321
- // ============================================================
322
- // Paths are relative to ~/.config/opencode/ directory
323
- // The plugin automatically copies bundled sounds to assets/ on first run
324
- // You can replace with your own custom MP3/WAV files
325
-
326
- "idleSound": "assets/Soft-high-tech-notification-sound-effect.mp3",
327
- "permissionSound": "assets/Machine-alert-beep-sound-effect.mp3",
328
- "questionSound": "assets/Machine-alert-beep-sound-effect.mp3",
329
-
330
- // ============================================================
331
- // GENERAL SETTINGS
332
- // ============================================================
333
-
334
- // Wake monitor from sleep when notifying (Windows/macOS)
335
- "wakeMonitor": true,
336
-
337
- // Force system volume up if below threshold
338
- "forceVolume": true,
339
-
340
- // Volume threshold (0-100): force volume if current level is below this
341
- "volumeThreshold": 50,
342
-
343
- // Show TUI toast notifications in OpenCode terminal
344
- "enableToast": true,
345
-
346
- // Enable audio notifications (sound files and TTS)
347
- "enableSound": true,
348
-
349
- // Consider monitor asleep after this many seconds of inactivity (Windows only)
350
- "idleThresholdSeconds": 60,
351
-
352
- // Enable debug logging to ~/.config/opencode/logs/smart-voice-notify-debug.log
353
- // The logs folder is created automatically when debug logging is enabled
354
- // Useful for troubleshooting notification issues
355
- "debugLog": false
356
- }
1
+ {
2
+ // ============================================================
3
+ // OpenCode Smart Voice Notify - Full Configuration Reference
4
+ // ============================================================
5
+ //
6
+ // IMPORTANT: This is a REFERENCE file showing ALL available options.
7
+ //
8
+ // To use this plugin:
9
+ // 1. Copy this file to: ~/.config/opencode/smart-voice-notify.jsonc
10
+ // (On Windows: C:\Users\<YourUser>\.config\opencode\smart-voice-notify.jsonc)
11
+ // 2. Customize the settings below to your preference
12
+ // 3. The plugin auto-creates a minimal config if none exists
13
+ //
14
+ // Sound files are automatically copied to ~/.config/opencode/assets/
15
+ // on first run. You can also use your own custom sound files.
16
+ //
17
+ // ============================================================
18
+
19
+ // ============================================================
20
+ // PLUGIN ENABLE/DISABLE
21
+ // ============================================================
22
+ // Master switch to enable or disable the entire plugin.
23
+ // Set to false to disable all notifications without uninstalling.
24
+ "enabled": true,
25
+
26
+ // ============================================================
27
+ // NOTIFICATION MODE SETTINGS (Smart Notification System)
28
+ // ============================================================
29
+ // Controls how notifications are delivered:
30
+ // 'sound-first' - Play sound immediately, TTS reminder after delay (RECOMMENDED)
31
+ // 'tts-first' - Speak TTS immediately, no sound
32
+ // 'both' - Play sound AND speak TTS immediately
33
+ // 'sound-only' - Only play sound, no TTS at all
34
+ "notificationMode": "sound-first",
35
+
36
+ // ============================================================
37
+ // TTS REMINDER SETTINGS (When user doesn't respond to sound)
38
+ // ============================================================
39
+
40
+ // Enable TTS reminder if user doesn't respond after sound notification
41
+ "enableTTSReminder": true,
42
+
43
+ // Delay (in seconds) before TTS reminder fires
44
+ // Set globally or per-notification type
45
+ "ttsReminderDelaySeconds": 30, // Global default
46
+ "idleReminderDelaySeconds": 30, // For task completion notifications
47
+ "permissionReminderDelaySeconds": 20, // For permission requests (more urgent)
48
+
49
+ // Follow-up reminders if user STILL doesn't respond after first TTS
50
+ "enableFollowUpReminders": true,
51
+ "maxFollowUpReminders": 3, // Max number of follow-up TTS reminders
52
+ "reminderBackoffMultiplier": 1.5, // Each follow-up waits longer (30s, 45s, 67s...)
53
+
54
+ // ============================================================
55
+ // PERMISSION BATCHING (Multiple permissions at once)
56
+ // ============================================================
57
+ // When multiple permissions arrive simultaneously (e.g., 5 at once),
58
+ // batch them into a single notification instead of playing 5 overlapping sounds.
59
+ // The notification will say "X permission requests require your attention".
60
+
61
+ // Batch window (ms) - how long to wait for more permissions before notifying
62
+ "permissionBatchWindowMs": 800,
63
+
64
+ // ============================================================
65
+ // TTS ENGINE SELECTION
66
+ // ============================================================
67
+ // 'elevenlabs' - Best quality, anime-like voices (requires API key, free tier: 10k chars/month)
68
+ // 'edge' - Good quality neural voices (Free, Native Node.js implementation)
69
+ // 'sapi' - Windows built-in voices (free, offline, robotic)
70
+ "ttsEngine": "elevenlabs",
71
+
72
+ // Enable TTS for notifications (falls back to sound files if TTS fails)
73
+ "enableTTS": true,
74
+
75
+ // ============================================================
76
+ // ELEVENLABS SETTINGS (Best Quality - Anime-like Voices)
77
+ // ============================================================
78
+ // Get your API key from: https://elevenlabs.io/app/settings/api-keys
79
+ // Free tier: 10,000 characters/month
80
+ "elevenLabsApiKey": "YOUR_API_KEY_HERE",
81
+
82
+ // Voice ID - Recommended cute/anime-like voices:
83
+ // 'cgSgspJ2msm6clMCkdW9' - Jessica (Playful, Bright, Warm) - RECOMMENDED
84
+ // 'FGY2WhTYpPnrIDTdsKH5' - Laura (Enthusiast, Quirky)
85
+ // 'jsCqWAovK2LkecY7zXl4' - Freya (Expressive, Confident)
86
+ // 'EXAVITQu4vr4xnSDxMaL' - Sarah (Soft, Warm)
87
+ // Browse more at: https://elevenlabs.io/voice-library
88
+ "elevenLabsVoiceId": "cgSgspJ2msm6clMCkdW9",
89
+
90
+ // Model: 'eleven_turbo_v2_5' (fast, good), 'eleven_multilingual_v2' (highest quality)
91
+ "elevenLabsModel": "eleven_turbo_v2_5",
92
+
93
+ // Voice tuning (0.0 to 1.0)
94
+ "elevenLabsStability": 0.5, // Lower = more expressive, Higher = more consistent
95
+ "elevenLabsSimilarity": 0.75, // How closely to match the original voice
96
+ "elevenLabsStyle": 0.5, // Style exaggeration (higher = more expressive)
97
+
98
+ // ============================================================
99
+ // EDGE TTS SETTINGS (Free Neural Voices - Fallback)
100
+ // ============================================================
101
+ // Native Node.js implementation (No external dependencies)
102
+
103
+ // Voice options (run 'edge-tts --list-voices' to see all):
104
+ // 'en-US-AnaNeural' - Young, cute, cartoon-like (RECOMMENDED)
105
+ // 'en-US-JennyNeural' - Friendly, warm
106
+ // 'en-US-AriaNeural' - Confident, clear
107
+ // 'en-GB-SoniaNeural' - British, friendly
108
+ // 'en-AU-NatashaNeural' - Australian, warm
109
+ "edgeVoice": "en-US-AnaNeural",
110
+
111
+ // Pitch adjustment: +0Hz to +100Hz (higher = more anime-like)
112
+ "edgePitch": "+50Hz",
113
+
114
+ // Speech rate: -50% to +100%
115
+ "edgeRate": "+10%",
116
+
117
+ // ============================================================
118
+ // SAPI SETTINGS (Windows Built-in - Last Resort Fallback)
119
+ // ============================================================
120
+
121
+ // Voice (run PowerShell to list all installed voices):
122
+ // Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).GetInstalledVoices() | % { $_.VoiceInfo.Name }
123
+ //
124
+ // Common Windows voices:
125
+ // 'Microsoft Zira Desktop' - Female, US English
126
+ // 'Microsoft David Desktop' - Male, US English
127
+ // 'Microsoft Hazel Desktop' - Female, UK English
128
+ "sapiVoice": "Microsoft Zira Desktop",
129
+
130
+ // Speech rate: -10 (slowest) to +10 (fastest), 0 is normal
131
+ "sapiRate": -1,
132
+
133
+ // Pitch: 'x-low', 'low', 'medium', 'high', 'x-high'
134
+ "sapiPitch": "medium",
135
+
136
+ // Volume: 'silent', 'x-soft', 'soft', 'medium', 'loud', 'x-loud'
137
+ "sapiVolume": "loud",
138
+
139
+ // ============================================================
140
+ // INITIAL TTS MESSAGES (Used immediately or after sound)
141
+ // These are randomly selected each time for variety
142
+ // ============================================================
143
+
144
+ // Messages when agent finishes work (task completion)
145
+ "idleTTSMessages": [
146
+ "All done! Your task has been completed successfully.",
147
+ "Hey there! I finished working on your request.",
148
+ "Task complete! Ready for your review whenever you are.",
149
+ "Good news! Everything is done and ready for you.",
150
+ "Finished! Let me know if you need anything else."
151
+ ],
152
+
153
+ // Messages for permission requests
154
+ "permissionTTSMessages": [
155
+ "Attention please! I need your permission to continue.",
156
+ "Hey! Quick approval needed to proceed with the task.",
157
+ "Heads up! There is a permission request waiting for you.",
158
+ "Excuse me! I need your authorization before I can continue.",
159
+ "Permission required! Please review and approve when ready."
160
+ ],
161
+
162
+ // Messages for MULTIPLE permission requests (use {count} placeholder)
163
+ // Used when several permissions arrive simultaneously
164
+ "permissionTTSMessagesMultiple": [
165
+ "Attention please! There are {count} permission requests waiting for your approval.",
166
+ "Hey! {count} permissions need your approval to continue.",
167
+ "Heads up! You have {count} pending permission requests.",
168
+ "Excuse me! I need your authorization for {count} different actions.",
169
+ "{count} permissions required! Please review and approve when ready."
170
+ ],
171
+
172
+ // ============================================================
173
+ // TTS REMINDER MESSAGES (More urgent - used after delay if no response)
174
+ // These are more personalized and urgent to get user attention
175
+ // ============================================================
176
+
177
+ // Reminder messages when agent finished but user hasn't responded
178
+ "idleReminderTTSMessages": [
179
+ "Hey, are you still there? Your task has been waiting for review.",
180
+ "Just a gentle reminder - I finished your request a while ago!",
181
+ "Hello? I completed your task. Please take a look when you can.",
182
+ "Still waiting for you! The work is done and ready for review.",
183
+ "Knock knock! Your completed task is patiently waiting for you."
184
+ ],
185
+
186
+ // Reminder messages when permission still needed
187
+ "permissionReminderTTSMessages": [
188
+ "Hey! I still need your permission to continue. Please respond!",
189
+ "Reminder: There is a pending permission request. I cannot proceed without you.",
190
+ "Hello? I am waiting for your approval. This is getting urgent!",
191
+ "Please check your screen! I really need your permission to move forward.",
192
+ "Still waiting for authorization! The task is on hold until you respond."
193
+ ],
194
+
195
+ // Reminder messages for MULTIPLE permissions (use {count} placeholder)
196
+ "permissionReminderTTSMessagesMultiple": [
197
+ "Hey! I still need your approval for {count} permissions. Please respond!",
198
+ "Reminder: There are {count} pending permission requests. I cannot proceed without you.",
199
+ "Hello? I am waiting for your approval on {count} items. This is getting urgent!",
200
+ "Please check your screen! {count} permissions are waiting for your response.",
201
+ "Still waiting for authorization on {count} requests! The task is on hold."
202
+ ],
203
+
204
+ // ============================================================
205
+ // QUESTION TOOL MESSAGES (SDK v1.1.7+ - Agent asking user questions)
206
+ // ============================================================
207
+ // The "question" tool allows the LLM to ask users questions during execution.
208
+ // This is useful for gathering preferences, clarifying instructions, or getting
209
+ // decisions on implementation choices.
210
+
211
+ // Messages when agent asks user a question
212
+ "questionTTSMessages": [
213
+ "Hey! I have a question for you. Please check your screen.",
214
+ "Attention! I need your input to continue.",
215
+ "Quick question! Please take a look when you have a moment.",
216
+ "I need some clarification. Could you please respond?",
217
+ "Question time! Your input is needed to proceed."
218
+ ],
219
+
220
+ // Messages for MULTIPLE questions (use {count} placeholder)
221
+ "questionTTSMessagesMultiple": [
222
+ "Hey! I have {count} questions for you. Please check your screen.",
223
+ "Attention! I need your input on {count} items to continue.",
224
+ "{count} questions need your attention. Please take a look!",
225
+ "I need some clarifications. There are {count} questions waiting for you.",
226
+ "Question time! {count} questions need your response to proceed."
227
+ ],
228
+
229
+ // Reminder messages for questions (more urgent - used after delay)
230
+ "questionReminderTTSMessages": [
231
+ "Hey! I am still waiting for your answer. Please check the questions!",
232
+ "Reminder: There is a question waiting for your response.",
233
+ "Hello? I need your input to continue. Please respond when you can.",
234
+ "Still waiting for your answer! The task is on hold.",
235
+ "Your input is needed! Please check the pending question."
236
+ ],
237
+
238
+ // Reminder messages for MULTIPLE questions (use {count} placeholder)
239
+ "questionReminderTTSMessagesMultiple": [
240
+ "Hey! I am still waiting for answers to {count} questions. Please respond!",
241
+ "Reminder: There are {count} questions waiting for your response.",
242
+ "Hello? I need your input on {count} items. Please respond when you can.",
243
+ "Still waiting for your answers on {count} questions! The task is on hold.",
244
+ "Your input is needed! {count} questions are pending your response."
245
+ ],
246
+
247
+ // Delay (in seconds) before question reminder fires
248
+ "questionReminderDelaySeconds": 25,
249
+
250
+ // Question batch window (ms) - how long to wait for more questions before notifying
251
+ "questionBatchWindowMs": 800,
252
+
253
+ // ============================================================
254
+ // AI MESSAGE GENERATION (OpenAI-Compatible Endpoints)
255
+ // ============================================================
256
+ // Use a local/self-hosted AI to generate dynamic notification messages
257
+ // instead of using preset static messages. The AI generates the text,
258
+ // which is then spoken by your configured TTS engine (ElevenLabs, Edge, etc.)
259
+ //
260
+ // Supports: Ollama, LM Studio, LocalAI, vLLM, llama.cpp, Jan.ai, and any
261
+ // OpenAI-compatible endpoint. You provide your own endpoint URL and API key.
262
+ //
263
+ // HOW IT WORKS:
264
+ // 1. When a notification is triggered (task complete, permission needed, etc.)
265
+ // 2. If AI is enabled, the plugin sends a prompt to your AI server
266
+ // 3. The AI generates a unique, contextual notification message
267
+ // 4. That message is spoken by your TTS engine (ElevenLabs, Edge, SAPI)
268
+ // 5. If AI fails, it falls back to the static messages defined above
269
+
270
+ // Enable AI-generated messages (experimental feature)
271
+ // Default: false (uses static messages defined above)
272
+ "enableAIMessages": false,
273
+
274
+ // Your AI server endpoint URL
275
+ // Common local AI servers and their default endpoints:
276
+ // Ollama: http://localhost:11434/v1
277
+ // LM Studio: http://localhost:1234/v1
278
+ // LocalAI: http://localhost:8080/v1
279
+ // vLLM: http://localhost:8000/v1
280
+ // llama.cpp: http://localhost:8080/v1
281
+ // Jan.ai: http://localhost:1337/v1
282
+ // text-gen-webui: http://localhost:5000/v1
283
+ "aiEndpoint": "http://localhost:11434/v1",
284
+
285
+ // Model name to use (must match a model loaded in your AI server)
286
+ // Examples for Ollama: "llama3", "llama3.2", "mistral", "phi3", "gemma2", "qwen2"
287
+ // For LM Studio: Use the model name shown in the UI
288
+ "aiModel": "llama3",
289
+
290
+ // API key for your AI server
291
+ // Most local servers (Ollama, LM Studio, LocalAI) don't require a key - leave empty
292
+ // Only set this if your server requires authentication
293
+ // For vLLM with auth disabled, use "EMPTY"
294
+ "aiApiKey": "",
295
+
296
+ // Request timeout in milliseconds
297
+ // Local AI can be slow on first request (model loading), so 15 seconds is recommended
298
+ // Increase if you have a slower machine or larger models
299
+ "aiTimeout": 15000,
300
+
301
+ // Fall back to static messages (defined above) if AI generation fails
302
+ // Recommended: true - ensures notifications always work even if AI is down
303
+ "aiFallbackToStatic": true,
304
+
305
+ // Custom prompts for each notification type
306
+ // You can customize these to change the AI's personality/style
307
+ // The AI will generate a short message based on these prompts
308
+ // TIP: Keep prompts concise - they're sent with each notification
309
+ "aiPrompts": {
310
+ "idle": "Generate a single brief, friendly notification sentence (max 15 words) saying a coding task is complete. Be encouraging and warm. Output only the message, no quotes.",
311
+ "permission": "Generate a single brief, urgent but friendly notification sentence (max 15 words) asking the user to approve a permission request. Output only the message, no quotes.",
312
+ "question": "Generate a single brief, polite notification sentence (max 15 words) saying the assistant has a question and needs user input. Output only the message, no quotes.",
313
+ "idleReminder": "Generate a single brief, gentle reminder sentence (max 15 words) that a completed task is waiting for review. Be slightly more insistent. Output only the message, no quotes.",
314
+ "permissionReminder": "Generate a single brief, urgent reminder sentence (max 15 words) that permission approval is still needed. Convey importance. Output only the message, no quotes.",
315
+ "questionReminder": "Generate a single brief, polite but persistent reminder sentence (max 15 words) that a question is still waiting for an answer. Output only the message, no quotes."
316
+ },
317
+
318
+ // ============================================================
319
+ // SOUND FILES (For immediate notifications)
320
+ // These are played first before TTS reminder kicks in
321
+ // ============================================================
322
+ // Paths are relative to ~/.config/opencode/ directory
323
+ // The plugin automatically copies bundled sounds to assets/ on first run
324
+ // You can replace with your own custom MP3/WAV files
325
+
326
+ "idleSound": "assets/Soft-high-tech-notification-sound-effect.mp3",
327
+ "permissionSound": "assets/Machine-alert-beep-sound-effect.mp3",
328
+ "questionSound": "assets/Machine-alert-beep-sound-effect.mp3",
329
+
330
+ // ============================================================
331
+ // GENERAL SETTINGS
332
+ // ============================================================
333
+
334
+ // Wake monitor from sleep when notifying (Windows/macOS)
335
+ "wakeMonitor": true,
336
+
337
+ // Force system volume up if below threshold
338
+ "forceVolume": true,
339
+
340
+ // Volume threshold (0-100): force volume if current level is below this
341
+ "volumeThreshold": 50,
342
+
343
+ // Show TUI toast notifications in OpenCode terminal
344
+ "enableToast": true,
345
+
346
+ // Enable audio notifications (sound files and TTS)
347
+ "enableSound": true,
348
+
349
+ // Consider monitor asleep after this many seconds of inactivity (Windows only)
350
+ "idleThresholdSeconds": 60,
351
+
352
+ // Enable debug logging to ~/.config/opencode/logs/smart-voice-notify-debug.log
353
+ // The logs folder is created automatically when debug logging is enabled
354
+ // Useful for troubleshooting notification issues
355
+ "debugLog": false
356
+ }