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.
- package/LICENSE +21 -21
- package/README.md +254 -66
- package/example.config.jsonc +135 -122
- package/index.js +541 -51
- package/package.json +59 -52
- package/util/ai-messages.js +73 -0
- package/util/config.js +653 -335
- package/util/desktop-notify.js +319 -0
- package/util/focus-detect.js +372 -0
- package/util/per-project-sound.js +90 -0
- package/util/sound-theme.js +129 -0
- package/util/tts.js +684 -596
- package/util/webhook.js +743 -0
package/example.config.jsonc
CHANGED
|
@@ -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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
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
|
-
//
|
|
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
|
}
|