@openclaw/google-meet 2026.7.2-beta.5 → 2026.8.1-beta.2

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.
Files changed (130) hide show
  1. package/dist/chrome-create-PKAyxCiL.js +325 -0
  2. package/dist/{cli-GeuAaEIy.js → cli-o7RWVqDb.js} +166 -234
  3. package/dist/{config-BcaS1BDr.js → config-wBK8loBb.js} +97 -221
  4. package/dist/{create-af1MDlus.js → create-UHeaRzsH.js} +3 -14
  5. package/dist/google-meet-platform-adapter-C3J-iFRE.js +791 -0
  6. package/dist/google-meet-platform-constants-Bs5iAg3E.js +25 -0
  7. package/dist/index.js +185 -2639
  8. package/dist/meet-url-BP2Jlvjs.js +17 -0
  9. package/dist/node-host-BXtXbsMa.js +49 -0
  10. package/dist/node-invoke-policy-B0gOlLJR.js +24 -0
  11. package/dist/{oauth-DOfMKlGp.js → oauth-9sUJ68Mw.js} +3 -14
  12. package/dist/{chrome-create-DMKruRFW.js → plugin-helpers-CfeT1SYY.js} +335 -355
  13. package/dist/plugin-registration-rSOssQmm.js +141 -0
  14. package/dist/runtime-B8d1beHo.js +1308 -0
  15. package/openclaw.plugin.json +8 -47
  16. package/package.json +4 -4
  17. /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/LICENSE +0 -0
  18. /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/README.md +0 -0
  19. /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/lib/util.js +0 -0
  20. /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/package.json +0 -0
  21. /package/node_modules/{immediate → jszip/node_modules/immediate}/LICENSE.txt +0 -0
  22. /package/node_modules/{immediate → jszip/node_modules/immediate}/README.md +0 -0
  23. /package/node_modules/{immediate → jszip/node_modules/immediate}/dist/immediate.js +0 -0
  24. /package/node_modules/{immediate → jszip/node_modules/immediate}/dist/immediate.min.js +0 -0
  25. /package/node_modules/{immediate → jszip/node_modules/immediate}/lib/browser.js +0 -0
  26. /package/node_modules/{immediate → jszip/node_modules/immediate}/lib/index.js +0 -0
  27. /package/node_modules/{immediate → jszip/node_modules/immediate}/package.json +0 -0
  28. /package/node_modules/{inherits → jszip/node_modules/inherits}/LICENSE +0 -0
  29. /package/node_modules/{inherits → jszip/node_modules/inherits}/README.md +0 -0
  30. /package/node_modules/{inherits → jszip/node_modules/inherits}/inherits.js +0 -0
  31. /package/node_modules/{inherits → jszip/node_modules/inherits}/inherits_browser.js +0 -0
  32. /package/node_modules/{inherits → jszip/node_modules/inherits}/package.json +0 -0
  33. /package/node_modules/{isarray → jszip/node_modules/isarray}/.npmignore +0 -0
  34. /package/node_modules/{isarray → jszip/node_modules/isarray}/.travis.yml +0 -0
  35. /package/node_modules/{isarray → jszip/node_modules/isarray}/Makefile +0 -0
  36. /package/node_modules/{isarray → jszip/node_modules/isarray}/README.md +0 -0
  37. /package/node_modules/{isarray → jszip/node_modules/isarray}/component.json +0 -0
  38. /package/node_modules/{isarray → jszip/node_modules/isarray}/index.js +0 -0
  39. /package/node_modules/{isarray → jszip/node_modules/isarray}/package.json +0 -0
  40. /package/node_modules/{isarray → jszip/node_modules/isarray}/test.js +0 -0
  41. /package/node_modules/{lie → jszip/node_modules/lie}/README.md +0 -0
  42. /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.js +0 -0
  43. /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.min.js +0 -0
  44. /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.polyfill.js +0 -0
  45. /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.polyfill.min.js +0 -0
  46. /package/node_modules/{lie → jszip/node_modules/lie}/lib/browser.js +0 -0
  47. /package/node_modules/{lie → jszip/node_modules/lie}/lib/index.js +0 -0
  48. /package/node_modules/{lie → jszip/node_modules/lie}/license.md +0 -0
  49. /package/node_modules/{lie → jszip/node_modules/lie}/lie.d.ts +0 -0
  50. /package/node_modules/{lie → jszip/node_modules/lie}/package.json +0 -0
  51. /package/node_modules/{lie → jszip/node_modules/lie}/polyfill.js +0 -0
  52. /package/node_modules/{pako → jszip/node_modules/pako}/CHANGELOG.md +0 -0
  53. /package/node_modules/{pako → jszip/node_modules/pako}/LICENSE +0 -0
  54. /package/node_modules/{pako → jszip/node_modules/pako}/README.md +0 -0
  55. /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako.js +0 -0
  56. /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako.min.js +0 -0
  57. /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_deflate.js +0 -0
  58. /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_deflate.min.js +0 -0
  59. /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_inflate.js +0 -0
  60. /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_inflate.min.js +0 -0
  61. /package/node_modules/{pako → jszip/node_modules/pako}/index.js +0 -0
  62. /package/node_modules/{pako → jszip/node_modules/pako}/lib/deflate.js +0 -0
  63. /package/node_modules/{pako → jszip/node_modules/pako}/lib/inflate.js +0 -0
  64. /package/node_modules/{pako → jszip/node_modules/pako}/lib/utils/common.js +0 -0
  65. /package/node_modules/{pako → jszip/node_modules/pako}/lib/utils/strings.js +0 -0
  66. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/README +0 -0
  67. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/adler32.js +0 -0
  68. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/constants.js +0 -0
  69. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/crc32.js +0 -0
  70. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/deflate.js +0 -0
  71. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/gzheader.js +0 -0
  72. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inffast.js +0 -0
  73. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inflate.js +0 -0
  74. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inftrees.js +0 -0
  75. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/messages.js +0 -0
  76. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/trees.js +0 -0
  77. /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/zstream.js +0 -0
  78. /package/node_modules/{pako → jszip/node_modules/pako}/package.json +0 -0
  79. /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/index.js +0 -0
  80. /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/license.md +0 -0
  81. /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/package.json +0 -0
  82. /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/readme.md +0 -0
  83. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/.travis.yml +0 -0
  84. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/CONTRIBUTING.md +0 -0
  85. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/GOVERNANCE.md +0 -0
  86. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/LICENSE +0 -0
  87. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/README.md +0 -0
  88. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/doc/wg-meetings/2015-01-30.md +0 -0
  89. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/duplex-browser.js +0 -0
  90. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/duplex.js +0 -0
  91. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_duplex.js +0 -0
  92. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_passthrough.js +0 -0
  93. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_readable.js +0 -0
  94. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_transform.js +0 -0
  95. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_writable.js +0 -0
  96. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/BufferList.js +0 -0
  97. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/destroy.js +0 -0
  98. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/stream-browser.js +0 -0
  99. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/stream.js +0 -0
  100. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/package.json +0 -0
  101. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/passthrough.js +0 -0
  102. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/readable-browser.js +0 -0
  103. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/readable.js +0 -0
  104. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/transform.js +0 -0
  105. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/writable-browser.js +0 -0
  106. /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/writable.js +0 -0
  107. /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/LICENSE +0 -0
  108. /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/README.md +0 -0
  109. /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/index.d.ts +0 -0
  110. /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/index.js +0 -0
  111. /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/package.json +0 -0
  112. /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/LICENSE.txt +0 -0
  113. /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/package.json +0 -0
  114. /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/setImmediate.js +0 -0
  115. /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/.travis.yml +0 -0
  116. /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/LICENSE +0 -0
  117. /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/README.md +0 -0
  118. /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/lib/string_decoder.js +0 -0
  119. /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/package.json +0 -0
  120. /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/History.md +0 -0
  121. /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/LICENSE +0 -0
  122. /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/README.md +0 -0
  123. /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/browser.js +0 -0
  124. /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/node.js +0 -0
  125. /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/package.json +0 -0
  126. /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/index.d.ts +0 -0
  127. /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/index.js +0 -0
  128. /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/license +0 -0
  129. /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/package.json +0 -0
  130. /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/readme.md +0 -0
@@ -1,178 +1,6 @@
1
- import { t as googleApiError } from "./google-api-errors-CDUYkIcK.js";
2
- import { asRecord, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeOptionalTrimmedStringList } from "openclaw/plugin-sdk/string-coerce-runtime";
3
- import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
4
- import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
5
- import { buildMeetingSoxAudioCommands } from "openclaw/plugin-sdk/meeting-runtime";
1
+ import { asBoolean, asRecord, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeOptionalTrimmedStringList, parseBooleanValue } from "openclaw/plugin-sdk/string-coerce-runtime";
6
2
  import { addTimerTimeoutGraceMs, resolvePositiveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
7
3
  import { REALTIME_VOICE_AGENT_CONSULT_TOOL_NAME, resolveRealtimeVoiceAgentConsultToolPolicy } from "openclaw/plugin-sdk/realtime-voice";
8
- //#region extensions/google-meet/src/meet-url.ts
9
- function normalizeOptionalString$1(value) {
10
- if (typeof value !== "string") return;
11
- return value.trim() || void 0;
12
- }
13
- function normalizeMeetUrl(input) {
14
- const raw = normalizeOptionalString$1(input);
15
- if (!raw) throw new Error("url required");
16
- let url;
17
- try {
18
- url = new URL(raw);
19
- } catch {
20
- throw new Error("url must be a valid Google Meet URL");
21
- }
22
- if (url.protocol !== "https:" || url.hostname.toLowerCase() !== "meet.google.com" || url.port || url.username || url.password) throw new Error("url must be an explicit https://meet.google.com/... URL");
23
- if (!/^\/[a-z]{3}-[a-z]{4}-[a-z]{3}(?:$|[/?#])/i.test(url.pathname)) throw new Error("url must include a Google Meet meeting code");
24
- return url.toString();
25
- }
26
- //#endregion
27
- //#region extensions/google-meet/src/calendar.ts
28
- const GOOGLE_CALENDAR_API_BASE_URL = "https://www.googleapis.com/calendar/v3";
29
- const GOOGLE_CALENDAR_API_HOST = "www.googleapis.com";
30
- const GOOGLE_CALENDAR_EVENTS_SCOPE = "https://www.googleapis.com/auth/calendar.events.readonly";
31
- const GOOGLE_CALENDAR_REQUEST_TIMEOUT_MS = 3e4;
32
- function appendQuery(url, query) {
33
- const parsed = new URL(url);
34
- for (const [key, value] of Object.entries(query)) if (value !== void 0) parsed.searchParams.set(key, String(value));
35
- return parsed.toString();
36
- }
37
- function normalizeGoogleMeetCalendarUri(value) {
38
- if (!value?.trim()) return;
39
- try {
40
- const url = new URL(value);
41
- if (url.protocol !== "http:" && url.protocol !== "https:") return;
42
- if (url.hostname.toLowerCase() !== "meet.google.com" || url.port || url.username || url.password) return;
43
- url.protocol = "https:";
44
- return normalizeMeetUrl(url.toString());
45
- } catch {
46
- return;
47
- }
48
- }
49
- function extractGoogleMeetUriFromText(value) {
50
- const matches = value?.matchAll(/https:\/\/meet\.google\.com\/[a-z0-9-]+/gi);
51
- for (const match of matches ?? []) {
52
- const uri = normalizeGoogleMeetCalendarUri(match[0]);
53
- if (uri) return uri;
54
- }
55
- }
56
- function findFirstGoogleMeetCalendarUri(entryPoints, predicate = () => true) {
57
- for (const entry of entryPoints) {
58
- if (!predicate(entry)) continue;
59
- const uri = normalizeGoogleMeetCalendarUri(entry.uri);
60
- if (uri) return uri;
61
- }
62
- }
63
- function extractGoogleMeetUriFromCalendarEvent(event) {
64
- const hangoutLink = normalizeGoogleMeetCalendarUri(event.hangoutLink);
65
- if (hangoutLink) return hangoutLink;
66
- const entryPoints = event.conferenceData?.entryPoints ?? [];
67
- const videoEntryUri = findFirstGoogleMeetCalendarUri(entryPoints, (entry) => entry.entryPointType === "video");
68
- if (videoEntryUri) return videoEntryUri;
69
- const meetEntryUri = findFirstGoogleMeetCalendarUri(entryPoints);
70
- if (meetEntryUri) return meetEntryUri;
71
- return extractGoogleMeetUriFromText(event.location) ?? extractGoogleMeetUriFromText(event.description);
72
- }
73
- function buildGoogleMeetCalendarDayWindow(now = /* @__PURE__ */ new Date()) {
74
- const start = new Date(now);
75
- start.setHours(0, 0, 0, 0);
76
- const end = new Date(start);
77
- end.setDate(start.getDate() + 1);
78
- return {
79
- timeMin: start.toISOString(),
80
- timeMax: end.toISOString()
81
- };
82
- }
83
- function parseCalendarEventTime(value) {
84
- const raw = value?.dateTime ?? value?.date;
85
- if (!raw) return;
86
- const parsed = Date.parse(raw);
87
- return Number.isFinite(parsed) ? parsed : void 0;
88
- }
89
- function rankCalendarEvent(event, nowMs) {
90
- const startMs = parseCalendarEventTime(event.start) ?? Number.POSITIVE_INFINITY;
91
- const endMs = parseCalendarEventTime(event.end) ?? startMs;
92
- if (startMs <= nowMs && endMs >= nowMs) return 0;
93
- if (startMs > nowMs) return startMs - nowMs;
94
- return nowMs - startMs + 720 * 60 * 60 * 1e3;
95
- }
96
- function chooseBestMeetCalendarEvent(events, now) {
97
- const nowMs = now.getTime();
98
- let selected;
99
- let selectedRank = Number.POSITIVE_INFINITY;
100
- for (const event of events) {
101
- if (event.status === "cancelled" || !extractGoogleMeetUriFromCalendarEvent(event)) continue;
102
- const rank = rankCalendarEvent(event, nowMs);
103
- if (!selected || rank < selectedRank) {
104
- selected = event;
105
- selectedRank = rank;
106
- }
107
- }
108
- return selected;
109
- }
110
- async function fetchGoogleCalendarEvents(params) {
111
- const calendarId = params.calendarId?.trim() || "primary";
112
- const now = params.now ?? /* @__PURE__ */ new Date();
113
- const defaultTimeMax = new Date(now);
114
- defaultTimeMax.setDate(defaultTimeMax.getDate() + 7);
115
- const { response, release } = await fetchWithSsrFGuard({
116
- url: appendQuery(`${GOOGLE_CALENDAR_API_BASE_URL}/calendars/${encodeURIComponent(calendarId)}/events`, {
117
- maxResults: params.maxResults ?? 50,
118
- orderBy: "startTime",
119
- q: params.eventQuery?.trim() || void 0,
120
- showDeleted: false,
121
- singleEvents: true,
122
- timeMin: params.timeMin ?? now.toISOString(),
123
- timeMax: params.timeMax ?? defaultTimeMax.toISOString()
124
- }),
125
- init: { headers: {
126
- Authorization: `Bearer ${params.accessToken}`,
127
- Accept: "application/json"
128
- } },
129
- policy: { allowedHostnames: [GOOGLE_CALENDAR_API_HOST] },
130
- auditContext: "google-meet.calendar.events.list",
131
- timeoutMs: GOOGLE_CALENDAR_REQUEST_TIMEOUT_MS
132
- });
133
- try {
134
- if (!response.ok) throw await googleApiError({
135
- response,
136
- prefix: "Google Calendar events.list",
137
- scopes: [GOOGLE_CALENDAR_EVENTS_SCOPE]
138
- });
139
- const payload = await readProviderJsonResponse(response, "Google Calendar events.list");
140
- if (payload.items !== void 0 && !Array.isArray(payload.items)) throw new Error("Google Calendar events.list response had non-array items");
141
- return {
142
- calendarId,
143
- events: payload.items ?? [],
144
- now
145
- };
146
- } finally {
147
- await release();
148
- }
149
- }
150
- async function listGoogleMeetCalendarEvents(params) {
151
- const { calendarId, events, now } = await fetchGoogleCalendarEvents(params);
152
- const best = chooseBestMeetCalendarEvent(events, now);
153
- return {
154
- calendarId,
155
- events: events.map((event) => {
156
- const meetingUri = extractGoogleMeetUriFromCalendarEvent(event);
157
- return meetingUri ? {
158
- event,
159
- meetingUri,
160
- selected: event === best
161
- } : void 0;
162
- }).filter((event) => Boolean(event))
163
- };
164
- }
165
- async function findGoogleMeetCalendarEvent(params) {
166
- const result = await listGoogleMeetCalendarEvents(params);
167
- const selected = result.events.find((event) => event.selected) ?? result.events[0];
168
- if (!selected) throw new Error("No Google Calendar event with a Google Meet link matched the query");
169
- return {
170
- calendarId: result.calendarId,
171
- event: selected.event,
172
- meetingUri: selected.meetingUri
173
- };
174
- }
175
- //#endregion
176
4
  //#region extensions/google-meet/src/config.ts
177
5
  function resolveGoogleMeetGatewayOperationTimeoutMs(config) {
178
6
  return Math.max(6e4, addTimerTimeoutGraceMs(config.chrome.joinTimeoutMs, 3e4) ?? 1, addTimerTimeoutGraceMs(config.voiceCall.requestTimeoutMs, 1e4) ?? 1);
@@ -181,31 +9,85 @@ const SOX_DEFAULT_BUFFER_BYTES = 8192;
181
9
  const SOX_MIN_BUFFER_BYTES = 17;
182
10
  const DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES = SOX_DEFAULT_BUFFER_BYTES / 2;
183
11
  const PLAIN_DECIMAL_NUMBER_RE = /^\d+(?:\.\d+)?$/;
184
- function buildGoogleMeetSoxAudioCommands(format, bufferBytes) {
185
- return format === "g711-ulaw-8khz" ? buildMeetingSoxAudioCommands({
186
- bufferBytes,
187
- format: {
188
- sampleRate: 8e3,
189
- channels: 1,
190
- encoding: "mu-law",
191
- bits: 8
192
- }
193
- }) : buildMeetingSoxAudioCommands({
194
- bufferBytes,
195
- device: "BlackHole 2ch",
196
- deviceType: "coreaudio",
197
- format: {
198
- sampleRate: 24e3,
199
- channels: 1,
200
- encoding: "signed-integer",
201
- bits: 16,
202
- endian: "little"
203
- }
204
- });
12
+ function buildGoogleMeetAudioCommands(backend, format, bufferBytes) {
13
+ const pipeWire = backend === "pipewire-pulse" || backend === "auto" && process.platform === "linux";
14
+ const sampleRate = format === "g711-ulaw-8khz" ? 8e3 : 24e3;
15
+ const bits = format === "g711-ulaw-8khz" ? 8 : 16;
16
+ if (pipeWire) {
17
+ const pulseFormat = format === "g711-ulaw-8khz" ? "ulaw" : "s16le";
18
+ const latencyMs = Math.max(1, Math.ceil(bufferBytes / (sampleRate * Math.ceil(bits / 8)) * 1e3));
19
+ const common = [
20
+ "--device=openclaw_meeting_audio",
21
+ `--format=${pulseFormat}`,
22
+ `--rate=${sampleRate}`,
23
+ "--channels=1",
24
+ `--latency-msec=${latencyMs}`
25
+ ];
26
+ return {
27
+ inputCommand: [
28
+ "parec",
29
+ "--raw",
30
+ ...common
31
+ ],
32
+ outputCommand: [
33
+ "pacat",
34
+ "--raw",
35
+ "--playback",
36
+ ...common
37
+ ]
38
+ };
39
+ }
40
+ const wire = format === "g711-ulaw-8khz" ? [
41
+ "-t",
42
+ "raw",
43
+ "-r",
44
+ "8000",
45
+ "-c",
46
+ "1",
47
+ "-e",
48
+ "mu-law",
49
+ "-b",
50
+ "8",
51
+ "-"
52
+ ] : [
53
+ "-t",
54
+ "raw",
55
+ "-r",
56
+ "24000",
57
+ "-c",
58
+ "1",
59
+ "-e",
60
+ "signed-integer",
61
+ "-b",
62
+ "16",
63
+ "-L",
64
+ "-"
65
+ ];
66
+ const withBuffer = (executable, args) => [
67
+ executable,
68
+ "-q",
69
+ "--buffer",
70
+ String(bufferBytes),
71
+ ...args
72
+ ];
73
+ return {
74
+ inputCommand: withBuffer("sox", [
75
+ "-t",
76
+ "coreaudio",
77
+ "BlackHole 2ch",
78
+ ...wire
79
+ ]),
80
+ outputCommand: withBuffer("sox", [
81
+ ...wire,
82
+ "-t",
83
+ "coreaudio",
84
+ "BlackHole 2ch"
85
+ ])
86
+ };
205
87
  }
206
- const DEFAULT_GOOGLE_MEET_SOX_COMMANDS = buildGoogleMeetSoxAudioCommands("pcm16-24khz", DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES);
207
- const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND = DEFAULT_GOOGLE_MEET_SOX_COMMANDS.inputCommand;
208
- const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = DEFAULT_GOOGLE_MEET_SOX_COMMANDS.outputCommand;
88
+ const DEFAULT_GOOGLE_MEET_AUDIO_COMMANDS = buildGoogleMeetAudioCommands("blackhole-2ch", "pcm16-24khz", DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES);
89
+ const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND = DEFAULT_GOOGLE_MEET_AUDIO_COMMANDS.inputCommand;
90
+ const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = DEFAULT_GOOGLE_MEET_AUDIO_COMMANDS.outputCommand;
209
91
  const DEFAULT_GOOGLE_MEET_CHROME_AUDIO_FORMAT = "pcm16-24khz";
210
92
  const DEFAULT_GOOGLE_MEET_BARGE_IN_RMS_THRESHOLD = 650;
211
93
  const DEFAULT_GOOGLE_MEET_BARGE_IN_PEAK_THRESHOLD = 2500;
@@ -219,7 +101,7 @@ const DEFAULT_GOOGLE_MEET_CONFIG = {
219
101
  defaultTransport: "chrome",
220
102
  defaultMode: "agent",
221
103
  chrome: {
222
- audioBackend: "blackhole-2ch",
104
+ audioBackend: "auto",
223
105
  audioFormat: DEFAULT_GOOGLE_MEET_CHROME_AUDIO_FORMAT,
224
106
  audioBufferBytes: DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES,
225
107
  launch: true,
@@ -262,7 +144,7 @@ const GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT_KEYS = ["OPENCLAW_GOOGLE_MEET_ACCESS_T
262
144
  const GOOGLE_MEET_DEFAULT_MEETING_KEYS = ["OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING", "GOOGLE_MEET_DEFAULT_MEETING"];
263
145
  const GOOGLE_MEET_PREVIEW_ACK_KEYS = ["OPENCLAW_GOOGLE_MEET_PREVIEW_ACK", "GOOGLE_MEET_PREVIEW_ACK"];
264
146
  function resolveBoolean(value, fallback) {
265
- return typeof value === "boolean" ? value : fallback;
147
+ return asBoolean(value) ?? fallback;
266
148
  }
267
149
  function resolveNumber(value, fallback) {
268
150
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : fallback;
@@ -288,20 +170,7 @@ function normalizeStringAllowEmpty(value) {
288
170
  return typeof value === "string" ? value.trim() : void 0;
289
171
  }
290
172
  function readEnvBoolean(env, keys) {
291
- const normalized = normalizeOptionalLowercaseString(readEnvString(env, keys));
292
- if (!normalized) return;
293
- if ([
294
- "1",
295
- "true",
296
- "yes",
297
- "on"
298
- ].includes(normalized)) return true;
299
- if ([
300
- "0",
301
- "false",
302
- "no",
303
- "off"
304
- ].includes(normalized)) return false;
173
+ return parseBooleanValue(readEnvString(env, keys));
305
174
  }
306
175
  function readEnvNumber(env, keys) {
307
176
  return resolveOptionalNumber(readEnvString(env, keys));
@@ -351,11 +220,15 @@ function resolveAudioBufferBytes(value, fallback) {
351
220
  if (!Number.isFinite(number) || number <= 0) return fallback;
352
221
  return Math.max(SOX_MIN_BUFFER_BYTES, Math.trunc(number));
353
222
  }
354
- function defaultAudioInputCommand(format, bufferBytes) {
355
- return buildGoogleMeetSoxAudioCommands(format, bufferBytes).inputCommand;
223
+ function defaultAudioInputCommand(backend, format, bufferBytes) {
224
+ return buildGoogleMeetAudioCommands(backend, format, bufferBytes).inputCommand;
225
+ }
226
+ function defaultAudioOutputCommand(backend, format, bufferBytes) {
227
+ return buildGoogleMeetAudioCommands(backend, format, bufferBytes).outputCommand;
356
228
  }
357
- function defaultAudioOutputCommand(format, bufferBytes) {
358
- return buildGoogleMeetSoxAudioCommands(format, bufferBytes).outputCommand;
229
+ function resolveAudioBackend(value) {
230
+ const normalized = normalizeOptionalLowercaseString(value)?.replaceAll("_", "-");
231
+ return normalized === "blackhole-2ch" || normalized === "pipewire-pulse" ? normalized : "auto";
359
232
  }
360
233
  function resolveGoogleMeetConfig(input) {
361
234
  return resolveGoogleMeetConfigWithEnv(input);
@@ -370,6 +243,7 @@ function resolveGoogleMeetConfigWithEnv(input, env = process.env) {
370
243
  const hasCustomAudioCommand = configuredAudioInputCommand !== void 0 || configuredAudioOutputCommand !== void 0;
371
244
  const audioFormat = resolveChromeAudioFormat(chrome.audioFormat) ?? (hasCustomAudioCommand ? "g711-ulaw-8khz" : DEFAULT_GOOGLE_MEET_CONFIG.chrome.audioFormat);
372
245
  const audioBufferBytes = resolveAudioBufferBytes(chrome.audioBufferBytes, DEFAULT_GOOGLE_MEET_CONFIG.chrome.audioBufferBytes);
246
+ const audioBackend = resolveAudioBackend(chrome.audioBackend);
373
247
  const chromeNode = asRecord(raw.chromeNode);
374
248
  const twilio = asRecord(raw.twilio);
375
249
  const voiceCall = asRecord(raw.voiceCall);
@@ -385,7 +259,7 @@ function resolveGoogleMeetConfigWithEnv(input, env = process.env) {
385
259
  defaultTransport: resolveTransport(raw.defaultTransport, DEFAULT_GOOGLE_MEET_CONFIG.defaultTransport),
386
260
  defaultMode: resolveMode(raw.defaultMode, DEFAULT_GOOGLE_MEET_CONFIG.defaultMode),
387
261
  chrome: {
388
- audioBackend: "blackhole-2ch",
262
+ audioBackend,
389
263
  audioFormat,
390
264
  audioBufferBytes,
391
265
  launch: resolveBoolean(chrome.launch, DEFAULT_GOOGLE_MEET_CONFIG.chrome.launch),
@@ -395,8 +269,10 @@ function resolveGoogleMeetConfigWithEnv(input, env = process.env) {
395
269
  autoJoin: resolveBoolean(chrome.autoJoin, DEFAULT_GOOGLE_MEET_CONFIG.chrome.autoJoin),
396
270
  joinTimeoutMs: resolveTimerConfigMs(chrome.joinTimeoutMs, DEFAULT_GOOGLE_MEET_CONFIG.chrome.joinTimeoutMs),
397
271
  waitForInCallMs: resolveTimerConfigMs(chrome.waitForInCallMs, DEFAULT_GOOGLE_MEET_CONFIG.chrome.waitForInCallMs),
398
- audioInputCommand: configuredAudioInputCommand ?? defaultAudioInputCommand(audioFormat, audioBufferBytes),
399
- audioOutputCommand: configuredAudioOutputCommand ?? defaultAudioOutputCommand(audioFormat, audioBufferBytes),
272
+ audioInputCommand: configuredAudioInputCommand ?? defaultAudioInputCommand(audioBackend, audioFormat, audioBufferBytes),
273
+ audioOutputCommand: configuredAudioOutputCommand ?? defaultAudioOutputCommand(audioBackend, audioFormat, audioBufferBytes),
274
+ audioInputCommandOverride: configuredAudioInputCommand,
275
+ audioOutputCommandOverride: configuredAudioOutputCommand,
400
276
  bargeInInputCommand: resolveStringArray(chrome.bargeInInputCommand),
401
277
  bargeInRmsThreshold: resolveNumber(chrome.bargeInRmsThreshold, DEFAULT_GOOGLE_MEET_CONFIG.chrome.bargeInRmsThreshold),
402
278
  bargeInPeakThreshold: resolveNumber(chrome.bargeInPeakThreshold, DEFAULT_GOOGLE_MEET_CONFIG.chrome.bargeInPeakThreshold),
@@ -447,4 +323,4 @@ function resolveGoogleMeetConfigWithEnv(input, env = process.env) {
447
323
  };
448
324
  }
449
325
  //#endregion
450
- export { buildGoogleMeetCalendarDayWindow as a, normalizeMeetUrl as c, resolveGoogleMeetGatewayOperationTimeoutMs as i, DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND as n, findGoogleMeetCalendarEvent as o, resolveGoogleMeetConfig as r, listGoogleMeetCalendarEvents as s, DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND as t };
326
+ export { resolveGoogleMeetGatewayOperationTimeoutMs as i, DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND as n, resolveGoogleMeetConfig as r, DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND as t };
@@ -1,18 +1,7 @@
1
- import { g as createGoogleMeetSpace, t as createMeetWithBrowserProxyOnNode } from "./chrome-create-DMKruRFW.js";
2
- import { resolveGoogleMeetAccessToken } from "./oauth-DOfMKlGp.js";
1
+ import { h as __exportAll, l as createGoogleMeetSpace } from "./plugin-helpers-CfeT1SYY.js";
2
+ import { resolveGoogleMeetAccessToken } from "./oauth-9sUJ68Mw.js";
3
+ import { t as createMeetWithBrowserProxyOnNode } from "./chrome-create-PKAyxCiL.js";
3
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
- //#region \0rolldown/runtime.js
5
- var __defProp = Object.defineProperty;
6
- var __exportAll = (all, no_symbols) => {
7
- let target = {};
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: true
11
- });
12
- if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
13
- return target;
14
- };
15
- //#endregion
16
5
  //#region extensions/google-meet/src/create.ts
17
6
  var create_exports = /* @__PURE__ */ __exportAll({
18
7
  createAndJoinMeetFromParams: () => createAndJoinMeetFromParams,