@gakr-gakr/google-meet 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,532 @@
1
+ {
2
+ "id": "google-meet",
3
+ "name": "Google Meet",
4
+ "description": "Join Google Meet calls through Chrome or Twilio transports.",
5
+ "enabledByDefault": false,
6
+ "commandAliases": [{ "name": "googlemeet" }],
7
+ "activation": {
8
+ "onStartup": true,
9
+ "onCommands": ["googlemeet"],
10
+ "onCapabilities": ["tool"]
11
+ },
12
+ "contracts": {
13
+ "tools": ["google_meet"]
14
+ },
15
+ "uiHints": {
16
+ "defaults.meeting": {
17
+ "label": "Default Meeting",
18
+ "help": "Meet URL, meeting code, or spaces/{id} used when commands omit a meeting."
19
+ },
20
+ "preview.enrollmentAcknowledged": {
21
+ "label": "Preview Acknowledged",
22
+ "help": "Confirms you understand the Google Meet Media API is still Developer Preview.",
23
+ "advanced": true
24
+ },
25
+ "defaultTransport": {
26
+ "label": "Default Transport",
27
+ "help": "Chrome uses a signed-in browser profile. Chrome-node runs Chrome on a paired node. Twilio uses Meet dial-in numbers."
28
+ },
29
+ "defaultMode": {
30
+ "label": "Default Mode",
31
+ "help": "Agent uses realtime transcription plus regular AutoBot TTS. Bidi uses the realtime voice model directly. Transcribe observes only."
32
+ },
33
+ "chrome.audioBackend": {
34
+ "label": "Chrome Audio Backend",
35
+ "help": "BlackHole 2ch is required for local duplex audio routing."
36
+ },
37
+ "chrome.launch": {
38
+ "label": "Launch Chrome"
39
+ },
40
+ "chrome.browserProfile": {
41
+ "label": "Chrome Profile",
42
+ "advanced": true
43
+ },
44
+ "chrome.guestName": {
45
+ "label": "Guest Name",
46
+ "help": "Used when Chrome lands on the signed-out Meet guest-name screen."
47
+ },
48
+ "chrome.reuseExistingTab": {
49
+ "label": "Reuse Existing Meet Tab",
50
+ "help": "Avoids opening duplicate tabs for the same Meet URL."
51
+ },
52
+ "chrome.autoJoin": {
53
+ "label": "Auto Join Guest Screen",
54
+ "help": "Best-effort guest-name fill and Join Now click through AutoBot browser automation."
55
+ },
56
+ "chrome.waitForInCallMs": {
57
+ "label": "Wait For In-Call (ms)",
58
+ "help": "Waits for Chrome to report that the Meet tab is in-call before the realtime intro speaks.",
59
+ "advanced": true
60
+ },
61
+ "chrome.audioInputCommand": {
62
+ "label": "Audio Input Command",
63
+ "help": "Command that writes meeting audio to stdout in chrome.audioFormat.",
64
+ "advanced": true
65
+ },
66
+ "chrome.audioOutputCommand": {
67
+ "label": "Audio Output Command",
68
+ "help": "Command that reads assistant audio from stdin in chrome.audioFormat.",
69
+ "advanced": true
70
+ },
71
+ "chrome.bargeInInputCommand": {
72
+ "label": "Barge-In Input Command",
73
+ "help": "Optional Gateway-hosted microphone command that writes signed 16-bit little-endian mono PCM for human interruption detection while assistant playback is active.",
74
+ "advanced": true
75
+ },
76
+ "chrome.bargeInRmsThreshold": {
77
+ "label": "Barge-In RMS Threshold",
78
+ "help": "RMS level on chrome.bargeInInputCommand that counts as a human interruption.",
79
+ "advanced": true
80
+ },
81
+ "chrome.bargeInPeakThreshold": {
82
+ "label": "Barge-In Peak Threshold",
83
+ "help": "Peak level on chrome.bargeInInputCommand that counts as a human interruption.",
84
+ "advanced": true
85
+ },
86
+ "chrome.bargeInCooldownMs": {
87
+ "label": "Barge-In Cooldown (ms)",
88
+ "help": "Minimum delay between repeated barge-in clears.",
89
+ "advanced": true
90
+ },
91
+ "chrome.audioFormat": {
92
+ "label": "Audio Format",
93
+ "help": "Command-pair audio format. PCM16 24 kHz is the default Chrome/Meet path; G.711 mu-law 8 kHz remains available for legacy command pairs.",
94
+ "advanced": true
95
+ },
96
+ "chrome.audioBufferBytes": {
97
+ "label": "Audio Buffer Bytes",
98
+ "help": "SoX processing buffer for generated Chrome command-pair audio commands. Lower values reduce latency but may underrun on busy hosts.",
99
+ "advanced": true
100
+ },
101
+ "chrome.audioBridgeCommand": {
102
+ "label": "Audio Bridge Command",
103
+ "advanced": true
104
+ },
105
+ "chrome.audioBridgeHealthCommand": {
106
+ "label": "Audio Bridge Health Command",
107
+ "advanced": true
108
+ },
109
+ "chromeNode.node": {
110
+ "label": "Chrome Node",
111
+ "help": "Node id/name/IP that owns Chrome, BlackHole, and SoX for chrome-node transport.",
112
+ "advanced": true
113
+ },
114
+ "twilio.defaultDialInNumber": {
115
+ "label": "Default Dial-In Number",
116
+ "placeholder": "+15551234567"
117
+ },
118
+ "twilio.defaultPin": {
119
+ "label": "Default PIN",
120
+ "advanced": true
121
+ },
122
+ "twilio.defaultDtmfSequence": {
123
+ "label": "Default DTMF Sequence",
124
+ "advanced": true
125
+ },
126
+ "voiceCall.enabled": {
127
+ "label": "Delegate To Voice Call"
128
+ },
129
+ "voiceCall.gatewayUrl": {
130
+ "label": "Voice Call Gateway URL",
131
+ "advanced": true
132
+ },
133
+ "voiceCall.token": {
134
+ "label": "Voice Call Gateway Token",
135
+ "sensitive": true,
136
+ "advanced": true
137
+ },
138
+ "voiceCall.requestTimeoutMs": {
139
+ "label": "Voice Call Request Timeout (ms)",
140
+ "advanced": true
141
+ },
142
+ "voiceCall.dtmfDelayMs": {
143
+ "label": "Legacy DTMF Delay (ms)",
144
+ "help": "Compatibility setting from the old post-connect DTMF flow. Twilio Meet joins now play DTMF before realtime connect.",
145
+ "advanced": true
146
+ },
147
+ "voiceCall.postDtmfSpeechDelayMs": {
148
+ "label": "Legacy Post-DTMF Speech Delay (ms)",
149
+ "help": "Compatibility setting from the old delayed-speech flow. Twilio Meet joins now carry the intro as the initial Voice Call message.",
150
+ "advanced": true
151
+ },
152
+ "voiceCall.introMessage": {
153
+ "label": "Voice Call Intro Message",
154
+ "advanced": true
155
+ },
156
+ "realtime.strategy": {
157
+ "label": "Realtime Strategy",
158
+ "help": "Legacy realtime alias setting. Use mode=agent or mode=bidi for new Meet joins."
159
+ },
160
+ "realtime.provider": {
161
+ "label": "Speech Provider",
162
+ "help": "Compatibility fallback for both realtime transcription and bidi voice. Prefer realtime.transcriptionProvider and realtime.voiceProvider for new configs."
163
+ },
164
+ "realtime.transcriptionProvider": {
165
+ "label": "Realtime Transcription Provider",
166
+ "help": "Agent mode uses this provider to transcribe meeting audio before regular AutoBot TTS answers."
167
+ },
168
+ "realtime.voiceProvider": {
169
+ "label": "Bidi Voice Provider",
170
+ "help": "Bidi mode uses this realtime voice provider. Falls back to realtime.provider when unset."
171
+ },
172
+ "realtime.model": {
173
+ "label": "Bidi Realtime Model",
174
+ "help": "Only used by mode=bidi. Agent mode answers with the configured AutoBot agent and regular TTS.",
175
+ "advanced": true
176
+ },
177
+ "realtime.instructions": {
178
+ "label": "Realtime Instructions",
179
+ "advanced": true
180
+ },
181
+ "realtime.introMessage": {
182
+ "label": "Realtime Intro Message",
183
+ "help": "Spoken once when the realtime bridge is ready. Set to an empty string to join silently."
184
+ },
185
+ "realtime.agentId": {
186
+ "label": "Realtime Consult Agent",
187
+ "help": "AutoBot agent id used by autobot_agent_consult. Defaults to \"main\".",
188
+ "advanced": true
189
+ },
190
+ "realtime.toolPolicy": {
191
+ "label": "Realtime Tool Policy",
192
+ "help": "Safe read-only tools are available by default; owner requests can unlock broader tools.",
193
+ "advanced": true
194
+ },
195
+ "oauth.clientId": {
196
+ "label": "OAuth Client ID"
197
+ },
198
+ "oauth.clientSecret": {
199
+ "label": "OAuth Client Secret",
200
+ "sensitive": true
201
+ },
202
+ "oauth.refreshToken": {
203
+ "label": "OAuth Refresh Token",
204
+ "sensitive": true
205
+ },
206
+ "oauth.accessToken": {
207
+ "label": "Cached Access Token",
208
+ "sensitive": true,
209
+ "advanced": true
210
+ },
211
+ "oauth.expiresAt": {
212
+ "label": "Cached Access Token Expiry",
213
+ "help": "Unix epoch milliseconds used only for the cached access-token fast path.",
214
+ "advanced": true
215
+ }
216
+ },
217
+ "configSchema": {
218
+ "type": "object",
219
+ "additionalProperties": false,
220
+ "properties": {
221
+ "enabled": {
222
+ "type": "boolean"
223
+ },
224
+ "defaults": {
225
+ "type": "object",
226
+ "additionalProperties": false,
227
+ "properties": {
228
+ "meeting": {
229
+ "type": "string"
230
+ }
231
+ }
232
+ },
233
+ "preview": {
234
+ "type": "object",
235
+ "additionalProperties": false,
236
+ "properties": {
237
+ "enrollmentAcknowledged": {
238
+ "type": "boolean"
239
+ }
240
+ }
241
+ },
242
+ "defaultTransport": {
243
+ "type": "string",
244
+ "enum": ["chrome", "chrome-node", "twilio"],
245
+ "default": "chrome"
246
+ },
247
+ "defaultMode": {
248
+ "type": "string",
249
+ "enum": ["agent", "bidi", "transcribe"],
250
+ "default": "agent"
251
+ },
252
+ "chrome": {
253
+ "type": "object",
254
+ "additionalProperties": false,
255
+ "properties": {
256
+ "audioBackend": {
257
+ "type": "string",
258
+ "enum": ["blackhole-2ch"],
259
+ "default": "blackhole-2ch"
260
+ },
261
+ "launch": {
262
+ "type": "boolean",
263
+ "default": true
264
+ },
265
+ "browserProfile": {
266
+ "type": "string"
267
+ },
268
+ "guestName": {
269
+ "type": "string",
270
+ "default": "AutoBot Agent"
271
+ },
272
+ "reuseExistingTab": {
273
+ "type": "boolean",
274
+ "default": true
275
+ },
276
+ "autoJoin": {
277
+ "type": "boolean",
278
+ "default": true
279
+ },
280
+ "joinTimeoutMs": {
281
+ "type": "number",
282
+ "default": 30000
283
+ },
284
+ "waitForInCallMs": {
285
+ "type": "number",
286
+ "default": 20000
287
+ },
288
+ "audioFormat": {
289
+ "type": "string",
290
+ "enum": ["pcm16-24khz", "g711-ulaw-8khz"],
291
+ "default": "pcm16-24khz"
292
+ },
293
+ "audioBufferBytes": {
294
+ "type": "number",
295
+ "default": 4096
296
+ },
297
+ "audioInputCommand": {
298
+ "type": "array",
299
+ "default": [
300
+ "sox",
301
+ "-q",
302
+ "--buffer",
303
+ "4096",
304
+ "-t",
305
+ "coreaudio",
306
+ "BlackHole 2ch",
307
+ "-t",
308
+ "raw",
309
+ "-r",
310
+ "24000",
311
+ "-c",
312
+ "1",
313
+ "-e",
314
+ "signed-integer",
315
+ "-b",
316
+ "16",
317
+ "-L",
318
+ "-"
319
+ ],
320
+ "items": {
321
+ "type": "string"
322
+ }
323
+ },
324
+ "audioOutputCommand": {
325
+ "type": "array",
326
+ "default": [
327
+ "sox",
328
+ "-q",
329
+ "--buffer",
330
+ "4096",
331
+ "-t",
332
+ "raw",
333
+ "-r",
334
+ "24000",
335
+ "-c",
336
+ "1",
337
+ "-e",
338
+ "signed-integer",
339
+ "-b",
340
+ "16",
341
+ "-L",
342
+ "-",
343
+ "-t",
344
+ "coreaudio",
345
+ "BlackHole 2ch"
346
+ ],
347
+ "items": {
348
+ "type": "string"
349
+ }
350
+ },
351
+ "bargeInInputCommand": {
352
+ "type": "array",
353
+ "items": {
354
+ "type": "string"
355
+ }
356
+ },
357
+ "bargeInRmsThreshold": {
358
+ "type": "number",
359
+ "default": 650
360
+ },
361
+ "bargeInPeakThreshold": {
362
+ "type": "number",
363
+ "default": 2500
364
+ },
365
+ "bargeInCooldownMs": {
366
+ "type": "number",
367
+ "default": 900
368
+ },
369
+ "audioBridgeCommand": {
370
+ "type": "array",
371
+ "items": {
372
+ "type": "string"
373
+ }
374
+ },
375
+ "audioBridgeHealthCommand": {
376
+ "type": "array",
377
+ "items": {
378
+ "type": "string"
379
+ }
380
+ }
381
+ }
382
+ },
383
+ "chromeNode": {
384
+ "type": "object",
385
+ "additionalProperties": false,
386
+ "properties": {
387
+ "node": {
388
+ "type": "string"
389
+ }
390
+ }
391
+ },
392
+ "twilio": {
393
+ "type": "object",
394
+ "additionalProperties": false,
395
+ "properties": {
396
+ "defaultDialInNumber": {
397
+ "type": "string"
398
+ },
399
+ "defaultPin": {
400
+ "type": "string"
401
+ },
402
+ "defaultDtmfSequence": {
403
+ "type": "string"
404
+ }
405
+ }
406
+ },
407
+ "voiceCall": {
408
+ "type": "object",
409
+ "additionalProperties": false,
410
+ "properties": {
411
+ "enabled": {
412
+ "type": "boolean",
413
+ "default": true
414
+ },
415
+ "gatewayUrl": {
416
+ "type": "string"
417
+ },
418
+ "token": {
419
+ "type": "string"
420
+ },
421
+ "requestTimeoutMs": {
422
+ "type": "number",
423
+ "default": 30000
424
+ },
425
+ "dtmfDelayMs": {
426
+ "type": "number",
427
+ "default": 2500
428
+ },
429
+ "postDtmfSpeechDelayMs": {
430
+ "type": "number",
431
+ "default": 5000
432
+ },
433
+ "introMessage": {
434
+ "type": "string"
435
+ }
436
+ }
437
+ },
438
+ "realtime": {
439
+ "type": "object",
440
+ "additionalProperties": false,
441
+ "properties": {
442
+ "strategy": {
443
+ "type": "string",
444
+ "enum": ["agent", "bidi"],
445
+ "default": "agent"
446
+ },
447
+ "provider": {
448
+ "type": "string",
449
+ "default": "openai"
450
+ },
451
+ "transcriptionProvider": {
452
+ "type": "string",
453
+ "default": "openai"
454
+ },
455
+ "voiceProvider": {
456
+ "type": "string"
457
+ },
458
+ "model": {
459
+ "type": "string"
460
+ },
461
+ "instructions": {
462
+ "type": "string",
463
+ "default": "You are joining a private Google Meet as an AutoBot voice transport. Keep spoken replies brief and natural. In agent mode, wait for AutoBot consult results and speak them exactly. In bidi mode, answer directly and call autobot_agent_consult for deeper reasoning, current information, or tools."
464
+ },
465
+ "introMessage": {
466
+ "type": "string",
467
+ "default": "Say exactly: I'm here and listening."
468
+ },
469
+ "agentId": {
470
+ "type": "string",
471
+ "description": "AutoBot agent id used by autobot_agent_consult. Defaults to \"main\"."
472
+ },
473
+ "toolPolicy": {
474
+ "type": "string",
475
+ "enum": ["safe-read-only", "owner", "none"],
476
+ "default": "safe-read-only"
477
+ },
478
+ "providers": {
479
+ "type": "object",
480
+ "additionalProperties": {
481
+ "type": "object",
482
+ "additionalProperties": true
483
+ }
484
+ }
485
+ }
486
+ },
487
+ "oauth": {
488
+ "type": "object",
489
+ "additionalProperties": false,
490
+ "properties": {
491
+ "clientId": {
492
+ "type": "string"
493
+ },
494
+ "clientSecret": {
495
+ "type": "string"
496
+ },
497
+ "refreshToken": {
498
+ "type": "string"
499
+ },
500
+ "accessToken": {
501
+ "type": "string"
502
+ },
503
+ "expiresAt": {
504
+ "type": "number"
505
+ }
506
+ }
507
+ },
508
+ "auth": {
509
+ "type": "object",
510
+ "additionalProperties": false,
511
+ "properties": {
512
+ "provider": {
513
+ "type": "string",
514
+ "enum": ["google-oauth"]
515
+ },
516
+ "clientId": {
517
+ "type": "string"
518
+ },
519
+ "clientSecret": {
520
+ "type": "string"
521
+ },
522
+ "tokenPath": {
523
+ "type": "string"
524
+ }
525
+ }
526
+ }
527
+ }
528
+ },
529
+ "configContracts": {
530
+ "compatibilityMigrationPaths": ["plugins.entries.google-meet.config.realtime.provider"]
531
+ }
532
+ }
@@ -0,0 +1 @@
1
+ export { legacyConfigRules, normalizeCompatibilityConfig } from "./src/config-compat.js";