opencode-smart-voice-notify 1.2.4 → 1.3.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.
@@ -16,6 +16,9 @@
16
16
  //
17
17
  // ============================================================
18
18
 
19
+ // Internal version tracking - DO NOT REMOVE
20
+ "_configVersion": "1.2.5",
21
+
19
22
  // ============================================================
20
23
  // PLUGIN ENABLE/DISABLE
21
24
  // ============================================================
@@ -23,6 +26,25 @@
23
26
  // Set to false to disable all notifications without uninstalling.
24
27
  "enabled": true,
25
28
 
29
+ // ============================================================
30
+ // GRANULAR NOTIFICATION CONTROL
31
+ // ============================================================
32
+ // Enable or disable notifications for specific event types.
33
+ // If disabled, no sound, TTS, desktop, or webhook notifications
34
+ // will be sent for that specific category.
35
+ "enableIdleNotification": true, // Agent finished work
36
+ "enablePermissionNotification": true, // Agent needs permission
37
+ "enableQuestionNotification": true, // Agent asks a question
38
+ "enableErrorNotification": false, // Agent encountered an error
39
+
40
+ // Enable or disable reminders for specific event types.
41
+ // If disabled, the initial notification will still fire, but no
42
+ // follow-up TTS reminders will be scheduled.
43
+ "enableIdleReminder": true,
44
+ "enablePermissionReminder": true,
45
+ "enableQuestionReminder": true,
46
+ "enableErrorReminder": false,
47
+
26
48
  // ============================================================
27
49
  // NOTIFICATION MODE SETTINGS (Smart Notification System)
28
50
  // ============================================================
@@ -51,19 +73,10 @@
51
73
  "maxFollowUpReminders": 3, // Max number of follow-up TTS reminders
52
74
  "reminderBackoffMultiplier": 1.5, // Each follow-up waits longer (30s, 45s, 67s...)
53
75
 
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
76
  // ============================================================
65
77
  // TTS ENGINE SELECTION
66
78
  // ============================================================
79
+ // 'openai' - OpenAI-compatible TTS (Self-hosted/Cloud, e.g. Kokoro, LocalAI)
67
80
  // 'elevenlabs' - Best quality, anime-like voices (requires API key, free tier: 10k chars/month)
68
81
  // 'edge' - Good quality neural voices (Free, Native Node.js implementation)
69
82
  // 'sapi' - Windows built-in voices (free, offline, robotic)
@@ -120,11 +133,6 @@
120
133
 
121
134
  // Voice (run PowerShell to list all installed voices):
122
135
  // 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
136
  "sapiVoice": "Microsoft Zira Desktop",
129
137
 
130
138
  // Speech rate: -10 (slowest) to +10 (fastest), 0 is normal
@@ -137,11 +145,34 @@
137
145
  "sapiVolume": "loud",
138
146
 
139
147
  // ============================================================
140
- // INITIAL TTS MESSAGES (Used immediately or after sound)
141
- // These are randomly selected each time for variety
148
+ // OPENAI-COMPATIBLE TTS SETTINGS (Kokoro, LocalAI, OpenAI, etc.)
142
149
  // ============================================================
150
+ // Any OpenAI-compatible /v1/audio/speech endpoint.
151
+ // Examples: Kokoro, OpenAI, LocalAI, Coqui, AllTalk, etc.
152
+
153
+ // Base URL for your TTS server (e.g., "http://192.168.86.43:8880")
154
+ "openaiTtsEndpoint": "",
155
+
156
+ // API key (leave empty if your server doesn't require auth)
157
+ "openaiTtsApiKey": "",
158
+
159
+ // Model name (server-dependent, e.g., "tts-1", "kokoro", "xtts")
160
+ "openaiTtsModel": "tts-1",
161
+
162
+ // Voice name (server-dependent)
163
+ // Kokoro voices: "af_heart", "af_bella", "am_adam", etc.
164
+ // OpenAI voices: "alloy", "echo", "fable", "onyx", "nova", "shimmer"
165
+ "openaiTtsVoice": "alloy",
143
166
 
144
- // Messages when agent finishes work (task completion)
167
+ // Audio format: "mp3", "opus", "aac", "flac", "wav", "pcm"
168
+ "openaiTtsFormat": "mp3",
169
+
170
+ // Speech speed: 0.25 to 4.0 (1.0 = normal)
171
+ "openaiTtsSpeed": 1.0,
172
+
173
+ // ============================================================
174
+ // INITIAL TTS MESSAGES (Used immediately or after sound)
175
+ // ============================================================
145
176
  "idleTTSMessages": [
146
177
  "All done! Your task has been completed successfully.",
147
178
  "Hey there! I finished working on your request.",
@@ -149,8 +180,6 @@
149
180
  "Good news! Everything is done and ready for you.",
150
181
  "Finished! Let me know if you need anything else."
151
182
  ],
152
-
153
- // Messages for permission requests
154
183
  "permissionTTSMessages": [
155
184
  "Attention please! I need your permission to continue.",
156
185
  "Hey! Quick approval needed to proceed with the task.",
@@ -158,9 +187,6 @@
158
187
  "Excuse me! I need your authorization before I can continue.",
159
188
  "Permission required! Please review and approve when ready."
160
189
  ],
161
-
162
- // Messages for MULTIPLE permission requests (use {count} placeholder)
163
- // Used when several permissions arrive simultaneously
164
190
  "permissionTTSMessagesMultiple": [
165
191
  "Attention please! There are {count} permission requests waiting for your approval.",
166
192
  "Hey! {count} permissions need your approval to continue.",
@@ -170,11 +196,8 @@
170
196
  ],
171
197
 
172
198
  // ============================================================
173
- // TTS REMINDER MESSAGES (More urgent - used after delay if no response)
174
- // These are more personalized and urgent to get user attention
199
+ // TTS REMINDER MESSAGES (More urgent)
175
200
  // ============================================================
176
-
177
- // Reminder messages when agent finished but user hasn't responded
178
201
  "idleReminderTTSMessages": [
179
202
  "Hey, are you still there? Your task has been waiting for review.",
180
203
  "Just a gentle reminder - I finished your request a while ago!",
@@ -182,8 +205,6 @@
182
205
  "Still waiting for you! The work is done and ready for review.",
183
206
  "Knock knock! Your completed task is patiently waiting for you."
184
207
  ],
185
-
186
- // Reminder messages when permission still needed
187
208
  "permissionReminderTTSMessages": [
188
209
  "Hey! I still need your permission to continue. Please respond!",
189
210
  "Reminder: There is a pending permission request. I cannot proceed without you.",
@@ -191,8 +212,6 @@
191
212
  "Please check your screen! I really need your permission to move forward.",
192
213
  "Still waiting for authorization! The task is on hold until you respond."
193
214
  ],
194
-
195
- // Reminder messages for MULTIPLE permissions (use {count} placeholder)
196
215
  "permissionReminderTTSMessagesMultiple": [
197
216
  "Hey! I still need your approval for {count} permissions. Please respond!",
198
217
  "Reminder: There are {count} pending permission requests. I cannot proceed without you.",
@@ -200,15 +219,15 @@
200
219
  "Please check your screen! {count} permissions are waiting for your response.",
201
220
  "Still waiting for authorization on {count} requests! The task is on hold."
202
221
  ],
203
-
222
+
204
223
  // ============================================================
205
- // QUESTION TOOL MESSAGES (SDK v1.1.7+ - Agent asking user questions)
224
+ // PERMISSION BATCHING
225
+ // ============================================================
226
+ "permissionBatchWindowMs": 800,
227
+
228
+ // ============================================================
229
+ // QUESTION TOOL MESSAGES (SDK v1.1.7+)
206
230
  // ============================================================
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
231
  "questionTTSMessages": [
213
232
  "Hey! I have a question for you. Please check your screen.",
214
233
  "Attention! I need your input to continue.",
@@ -216,8 +235,6 @@
216
235
  "I need some clarification. Could you please respond?",
217
236
  "Question time! Your input is needed to proceed."
218
237
  ],
219
-
220
- // Messages for MULTIPLE questions (use {count} placeholder)
221
238
  "questionTTSMessagesMultiple": [
222
239
  "Hey! I have {count} questions for you. Please check your screen.",
223
240
  "Attention! I need your input on {count} items to continue.",
@@ -225,8 +242,6 @@
225
242
  "I need some clarifications. There are {count} questions waiting for you.",
226
243
  "Question time! {count} questions need your response to proceed."
227
244
  ],
228
-
229
- // Reminder messages for questions (more urgent - used after delay)
230
245
  "questionReminderTTSMessages": [
231
246
  "Hey! I am still waiting for your answer. Please check the questions!",
232
247
  "Reminder: There is a question waiting for your response.",
@@ -234,8 +249,6 @@
234
249
  "Still waiting for your answer! The task is on hold.",
235
250
  "Your input is needed! Please check the pending question."
236
251
  ],
237
-
238
- // Reminder messages for MULTIPLE questions (use {count} placeholder)
239
252
  "questionReminderTTSMessagesMultiple": [
240
253
  "Hey! I am still waiting for answers to {count} questions. Please respond!",
241
254
  "Reminder: There are {count} questions waiting for your response.",
@@ -243,114 +256,114 @@
243
256
  "Still waiting for your answers on {count} questions! The task is on hold.",
244
257
  "Your input is needed! {count} questions are pending your response."
245
258
  ],
246
-
247
- // Delay (in seconds) before question reminder fires
248
259
  "questionReminderDelaySeconds": 25,
249
-
250
- // Question batch window (ms) - how long to wait for more questions before notifying
251
260
  "questionBatchWindowMs": 800,
252
-
261
+
253
262
  // ============================================================
254
- // AI MESSAGE GENERATION (OpenAI-Compatible Endpoints)
263
+ // ERROR NOTIFICATION SETTINGS
264
+ // ============================================================
265
+ "errorTTSMessages": [
266
+ "Oops! Something went wrong. Please check for errors.",
267
+ "Alert! The agent encountered an error and needs your attention.",
268
+ "Error detected! Please review the issue when you can.",
269
+ "Houston, we have a problem! An error occurred during the task.",
270
+ "Heads up! There was an error that requires your attention."
271
+ ],
272
+ "errorTTSMessagesMultiple": [
273
+ "Oops! There are {count} errors that need your attention.",
274
+ "Alert! The agent encountered {count} errors. Please review.",
275
+ "{count} errors detected! Please check when you can.",
276
+ "Houston, we have {count} problems! Multiple errors occurred.",
277
+ "Heads up! {count} errors require your attention."
278
+ ],
279
+ "errorReminderTTSMessages": [
280
+ "Hey! There's still an error waiting for your attention.",
281
+ "Reminder: An error occurred and hasn't been addressed yet.",
282
+ "The agent is stuck! Please check the error when you can.",
283
+ "Still waiting! That error needs your attention.",
284
+ "Don't forget! There's an unresolved error in your session."
285
+ ],
286
+ "errorReminderTTSMessagesMultiple": [
287
+ "Hey! There are still {count} errors waiting for your attention.",
288
+ "Reminder: {count} errors occurred and haven't been addressed yet.",
289
+ "The agent is stuck! Please check the {count} errors when you can.",
290
+ "Still waiting! {count} errors need your attention.",
291
+ "Don't forget! There are {count} unresolved errors in your session."
292
+ ],
293
+ "errorReminderDelaySeconds": 20,
294
+
295
+ // ============================================================
296
+ // AI MESSAGE GENERATION
255
297
  // ============================================================
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
298
  "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
299
  "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
300
  "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
301
  "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
302
  "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
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
304
  "aiPrompts": {
310
305
  "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
306
  "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
307
  "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.",
308
+ "error": "Generate a single brief, concerned but calm notification sentence (max 15 words) saying an error occurred and needs attention. Output only the message, no quotes.",
313
309
  "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
310
  "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."
311
+ "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.",
312
+ "errorReminder": "Generate a single brief, urgent reminder sentence (max 15 words) that an error still needs attention. Convey urgency. Output only the message, no quotes."
316
313
  },
317
-
314
+
318
315
  // ============================================================
319
- // SOUND FILES (For immediate notifications)
320
- // These are played first before TTS reminder kicks in
316
+ // SOUND FILES
321
317
  // ============================================================
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
318
  "idleSound": "assets/Soft-high-tech-notification-sound-effect.mp3",
327
319
  "permissionSound": "assets/Machine-alert-beep-sound-effect.mp3",
328
320
  "questionSound": "assets/Machine-alert-beep-sound-effect.mp3",
329
-
321
+ "errorSound": "assets/Machine-alert-beep-sound-effect.mp3",
322
+
330
323
  // ============================================================
331
324
  // GENERAL SETTINGS
332
325
  // ============================================================
333
-
334
- // Wake monitor from sleep when notifying (Windows/macOS)
335
326
  "wakeMonitor": true,
336
-
337
- // Force system volume up if below threshold
338
327
  "forceVolume": true,
339
-
340
- // Volume threshold (0-100): force volume if current level is below this
341
328
  "volumeThreshold": 50,
342
-
343
- // Show TUI toast notifications in OpenCode terminal
344
329
  "enableToast": true,
345
-
346
- // Enable audio notifications (sound files and TTS)
347
330
  "enableSound": true,
348
-
349
- // Consider monitor asleep after this many seconds of inactivity (Windows only)
331
+
332
+ // ============================================================
333
+ // DESKTOP NOTIFICATION SETTINGS
334
+ // ============================================================
335
+ "enableDesktopNotification": true,
336
+ "desktopNotificationTimeout": 5,
337
+ "showProjectInNotification": true,
338
+
339
+ // ============================================================
340
+ // FOCUS DETECTION SETTINGS
341
+ // ============================================================
342
+ "suppressWhenFocused": true,
343
+ "alwaysNotify": false,
344
+
345
+ // ============================================================
346
+ // WEBHOOK NOTIFICATION SETTINGS
347
+ // ============================================================
348
+ "enableWebhook": false,
349
+ "webhookUrl": "",
350
+ "webhookUsername": "OpenCode Notify",
351
+ "webhookEvents": ["idle", "permission", "error", "question"],
352
+ "webhookMentionOnPermission": false,
353
+
354
+ // ============================================================
355
+ // SOUND THEME SETTINGS
356
+ // ============================================================
357
+ "soundThemeDir": "",
358
+ "randomizeSoundFromTheme": true,
359
+
360
+ // ============================================================
361
+ // PER-PROJECT SOUND SETTINGS
362
+ // ============================================================
363
+ "perProjectSounds": false,
364
+ "projectSoundSeed": 0,
365
+
366
+ // General options
350
367
  "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
368
  "debugLog": false
356
369
  }