@kodelyth/google-meet 2026.5.39

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