























@@ -741,6 +741,7 @@ export default definePluginEntry({
741741pin: normalizeOptionalString(params?.pin),
742742dtmfSequence: normalizeOptionalString(params?.dtmfSequence),
743743message: normalizeOptionalString(params?.message),
744+requesterSessionKey: normalizeOptionalString(params?.requesterSessionKey),
744745});
745746respond(true, result);
746747} catch (err) {
@@ -992,6 +993,7 @@ export default definePluginEntry({
992993pin: normalizeOptionalString(params?.pin),
993994dtmfSequence: normalizeOptionalString(params?.dtmfSequence),
994995message: normalizeOptionalString(params?.message),
996+requesterSessionKey: normalizeOptionalString(params?.requesterSessionKey),
995997});
996998respond(true, result);
997999} catch (err) {
@@ -1018,155 +1020,176 @@ export default definePluginEntry({
10181020},
10191021);
102010221021-api.registerTool({
1022-name: "google_meet",
1023-label: "Google Meet",
1024-description:
1025-"Join and track Google Meet sessions through Chrome or Twilio. Call setup_status before join/create/test_listen/test_speech; if it reports a Chrome node offline, local audio missing, or missing Twilio dial plan, surface that blocker instead of retrying or switching transports. Twilio cannot dial a Meet URL directly: provide dialInNumber plus optional pin/dtmfSequence, or configure twilio.defaultDialInNumber. Offline nodes are diagnostics only, not usable candidates. If local Chrome talk-back audio is unsupported on this OS, use mode=transcribe, transport=twilio, or a macOS chrome-node for agent/bidi Chrome. If a Meet tab is already open after a timeout, call recover_current_tab before retrying join to report login, permission, or admission blockers without opening another tab.",
1026-parameters: GoogleMeetToolSchema,
1027-async execute(_toolCallId, params) {
1028-const raw = asParamRecord(params);
1029-try {
1030-assertGoogleMeetAgentToolActionSupported({ config, raw });
1031-switch (raw.action) {
1032-case "join": {
1033-return json(await callGoogleMeetGatewayFromTool({ config, action: "join", raw }));
1034-}
1035-case "create": {
1036-return json(await callGoogleMeetGatewayFromTool({ config, action: "create", raw }));
1037-}
1038-case "test_speech": {
1039-return json(
1040-await callGoogleMeetGatewayFromTool({ config, action: "test_speech", raw }),
1041-);
1042-}
1043-case "test_listen": {
1044-return json(
1045-await callGoogleMeetGatewayFromTool({ config, action: "test_listen", raw }),
1046-);
1047-}
1048-case "status": {
1049-return json(await callGoogleMeetGatewayFromTool({ config, action: "status", raw }));
1050-}
1051-case "recover_current_tab": {
1052-return json(
1053-await callGoogleMeetGatewayFromTool({
1023+api.registerTool(
1024+(toolContext) => ({
1025+name: "google_meet",
1026+label: "Google Meet",
1027+description:
1028+"Join and track Google Meet sessions through Chrome or Twilio. Call setup_status before join/create/test_listen/test_speech; if it reports a Chrome node offline, local audio missing, or missing Twilio dial plan, surface that blocker instead of retrying or switching transports. Twilio cannot dial a Meet URL directly: provide dialInNumber plus optional pin/dtmfSequence, or configure twilio.defaultDialInNumber. Offline nodes are diagnostics only, not usable candidates. If local Chrome talk-back audio is unsupported on this OS, use mode=transcribe, transport=twilio, or a macOS chrome-node for agent/bidi Chrome. If a Meet tab is already open after a timeout, call recover_current_tab before retrying join to report login, permission, or admission blockers without opening another tab.",
1029+parameters: GoogleMeetToolSchema,
1030+async execute(_toolCallId, params) {
1031+const raw = asParamRecord(params);
1032+const requesterSessionKey = normalizeOptionalString(toolContext.sessionKey);
1033+const rawWithRequester = requesterSessionKey ? { ...raw, requesterSessionKey } : raw;
1034+try {
1035+assertGoogleMeetAgentToolActionSupported({ config, raw });
1036+switch (raw.action) {
1037+case "join": {
1038+return json(
1039+await callGoogleMeetGatewayFromTool({
1040+ config,
1041+action: "join",
1042+raw: rawWithRequester,
1043+}),
1044+);
1045+}
1046+case "create": {
1047+return json(
1048+await callGoogleMeetGatewayFromTool({
1049+ config,
1050+action: "create",
1051+raw: rawWithRequester,
1052+}),
1053+);
1054+}
1055+case "test_speech": {
1056+return json(
1057+await callGoogleMeetGatewayFromTool({
1058+ config,
1059+action: "test_speech",
1060+raw: rawWithRequester,
1061+}),
1062+);
1063+}
1064+case "test_listen": {
1065+return json(
1066+await callGoogleMeetGatewayFromTool({ config, action: "test_listen", raw }),
1067+);
1068+}
1069+case "status": {
1070+return json(await callGoogleMeetGatewayFromTool({ config, action: "status", raw }));
1071+}
1072+case "recover_current_tab": {
1073+return json(
1074+await callGoogleMeetGatewayFromTool({
1075+ config,
1076+action: "recover_current_tab",
1077+ raw,
1078+}),
1079+);
1080+}
1081+case "setup_status": {
1082+return json(
1083+await callGoogleMeetGatewayFromTool({ config, action: "setup_status", raw }),
1084+);
1085+}
1086+case "resolve_space": {
1087+const { token: _token, ...result } = await resolveSpaceFromParams(config, raw);
1088+return json(result);
1089+}
1090+case "preflight": {
1091+const { meeting, token, space } = await resolveSpaceFromParams(config, raw);
1092+return json(
1093+buildGoogleMeetPreflightReport({
1094+input: meeting,
1095+ space,
1096+previewAcknowledged: config.preview.enrollmentAcknowledged,
1097+tokenSource: token.refreshed ? "refresh-token" : "cached-access-token",
1098+}),
1099+);
1100+}
1101+case "latest": {
1102+const token = await resolveGoogleMeetTokenFromParams(config, raw);
1103+const resolved = await resolveMeetingFromParams({
10541104 config,
1055-action: "recover_current_tab",
10561105 raw,
1057-}),
1058-);
1059-}
1060-case "setup_status": {
1061-return json(
1062-await callGoogleMeetGatewayFromTool({ config, action: "setup_status", raw }),
1063-);
1064-}
1065-case "resolve_space": {
1066-const { token: _token, ...result } = await resolveSpaceFromParams(config, raw);
1067-return json(result);
1068-}
1069-case "preflight": {
1070-const { meeting, token, space } = await resolveSpaceFromParams(config, raw);
1071-return json(
1072-buildGoogleMeetPreflightReport({
1073-input: meeting,
1074- space,
1075-previewAcknowledged: config.preview.enrollmentAcknowledged,
1076-tokenSource: token.refreshed ? "refresh-token" : "cached-access-token",
1077-}),
1078-);
1079-}
1080-case "latest": {
1081-const token = await resolveGoogleMeetTokenFromParams(config, raw);
1082-const resolved = await resolveMeetingFromParams({
1083- config,
1084- raw,
1085-accessToken: token.accessToken,
1086-});
1087-return json({
1088- ...(await fetchLatestGoogleMeetConferenceRecord({
10891106accessToken: token.accessToken,
1090-meeting: resolved.meeting,
1091-})),
1092- ...(resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}),
1093-});
1094-}
1095-case "calendar_events": {
1096-const token = await resolveGoogleMeetTokenFromParams(config, raw);
1097-const window = raw.today === true ? buildGoogleMeetCalendarDayWindow() : {};
1098-return json(
1099-await listGoogleMeetCalendarEvents({
1100-accessToken: token.accessToken,
1101-calendarId: normalizeOptionalString(raw.calendarId),
1102-eventQuery: normalizeOptionalString(raw.event),
1103- ...window,
1104-}),
1105-);
1106-}
1107-case "artifacts": {
1108-const resolved = await resolveArtifactQueryFromParams(config, raw);
1109-return json(
1110-await fetchGoogleMeetArtifacts({
1111-accessToken: resolved.token.accessToken,
1112-meeting: resolved.meeting,
1113-conferenceRecord: resolved.conferenceRecord,
1114-pageSize: resolved.pageSize,
1115-includeTranscriptEntries: resolved.includeTranscriptEntries,
1116-includeDocumentBodies: resolved.includeDocumentBodies,
1117-allConferenceRecords: resolved.allConferenceRecords,
1118-}),
1119-);
1120-}
1121-case "attendance": {
1122-const resolved = await resolveArtifactQueryFromParams(config, raw);
1123-return json(
1124-await fetchGoogleMeetAttendance({
1125-accessToken: resolved.token.accessToken,
1126-meeting: resolved.meeting,
1127-conferenceRecord: resolved.conferenceRecord,
1128-pageSize: resolved.pageSize,
1129-allConferenceRecords: resolved.allConferenceRecords,
1130-mergeDuplicateParticipants: resolved.mergeDuplicateParticipants,
1131-lateAfterMinutes: resolved.lateAfterMinutes,
1132-earlyBeforeMinutes: resolved.earlyBeforeMinutes,
1133-}),
1134-);
1135-}
1136-case "export": {
1137-return json(await exportGoogleMeetBundleFromParams(config, raw));
1138-}
1139-case "leave": {
1140-const sessionId = normalizeOptionalString(raw.sessionId);
1141-if (!sessionId) {
1142-throw new Error("sessionId required");
1107+});
1108+return json({
1109+ ...(await fetchLatestGoogleMeetConferenceRecord({
1110+accessToken: token.accessToken,
1111+meeting: resolved.meeting,
1112+})),
1113+ ...(resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}),
1114+});
11431115}
1144-return json(await callGoogleMeetGatewayFromTool({ config, action: "leave", raw }));
1145-}
1146-case "end_active_conference": {
1147-return json(
1148-await callGoogleMeetGatewayFromTool({
1149- config,
1150-action: "end_active_conference",
1151- raw,
1152-}),
1153-);
1154-}
1155-case "speak": {
1156-const sessionId = normalizeOptionalString(raw.sessionId);
1157-if (!sessionId) {
1158-throw new Error("sessionId required");
1116+case "calendar_events": {
1117+const token = await resolveGoogleMeetTokenFromParams(config, raw);
1118+const window = raw.today === true ? buildGoogleMeetCalendarDayWindow() : {};
1119+return json(
1120+await listGoogleMeetCalendarEvents({
1121+accessToken: token.accessToken,
1122+calendarId: normalizeOptionalString(raw.calendarId),
1123+eventQuery: normalizeOptionalString(raw.event),
1124+ ...window,
1125+}),
1126+);
1127+}
1128+case "artifacts": {
1129+const resolved = await resolveArtifactQueryFromParams(config, raw);
1130+return json(
1131+await fetchGoogleMeetArtifacts({
1132+accessToken: resolved.token.accessToken,
1133+meeting: resolved.meeting,
1134+conferenceRecord: resolved.conferenceRecord,
1135+pageSize: resolved.pageSize,
1136+includeTranscriptEntries: resolved.includeTranscriptEntries,
1137+includeDocumentBodies: resolved.includeDocumentBodies,
1138+allConferenceRecords: resolved.allConferenceRecords,
1139+}),
1140+);
1141+}
1142+case "attendance": {
1143+const resolved = await resolveArtifactQueryFromParams(config, raw);
1144+return json(
1145+await fetchGoogleMeetAttendance({
1146+accessToken: resolved.token.accessToken,
1147+meeting: resolved.meeting,
1148+conferenceRecord: resolved.conferenceRecord,
1149+pageSize: resolved.pageSize,
1150+allConferenceRecords: resolved.allConferenceRecords,
1151+mergeDuplicateParticipants: resolved.mergeDuplicateParticipants,
1152+lateAfterMinutes: resolved.lateAfterMinutes,
1153+earlyBeforeMinutes: resolved.earlyBeforeMinutes,
1154+}),
1155+);
11591156}
1160-return json(await callGoogleMeetGatewayFromTool({ config, action: "speak", raw }));
1157+case "export": {
1158+return json(await exportGoogleMeetBundleFromParams(config, raw));
1159+}
1160+case "leave": {
1161+const sessionId = normalizeOptionalString(raw.sessionId);
1162+if (!sessionId) {
1163+throw new Error("sessionId required");
1164+}
1165+return json(await callGoogleMeetGatewayFromTool({ config, action: "leave", raw }));
1166+}
1167+case "end_active_conference": {
1168+return json(
1169+await callGoogleMeetGatewayFromTool({
1170+ config,
1171+action: "end_active_conference",
1172+ raw,
1173+}),
1174+);
1175+}
1176+case "speak": {
1177+const sessionId = normalizeOptionalString(raw.sessionId);
1178+if (!sessionId) {
1179+throw new Error("sessionId required");
1180+}
1181+return json(await callGoogleMeetGatewayFromTool({ config, action: "speak", raw }));
1182+}
1183+default:
1184+throw new Error("unknown google_meet action");
11611185}
1162- default:
1163- throw new Error("unknown google_meet action");
1186+} catch (err) {
1187+return json(formatGatewayError(err));
11641188}
1165-} catch (err) {
1166-return json(formatGatewayError(err));
1167-}
1168-},
1169-});
1189+},
1190+}),
1191+{ name: "google_meet" },
1192+);
1170119311711194api.registerNodeHostCommand({
11721195command: "googlemeet.chrome",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。