openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
2,713 lines • 106 kB
TypeScript
import { r as OpenClawConfig } from "../types.openclaw-yUy4bDSr.js";
import { $x as RealtimeTranscriptionProviderPlugin, AS as RealtimeVoiceTool, Ct as RuntimeLogger, Gt as OpenClawPluginConfigSchema, Kt as OpenClawPluginApi, Sc as PluginRuntime, _S as TranscriptsStopResult, eS as RealtimeVoiceProviderPlugin, gS as TranscriptsStartResult, hS as TranscriptStopRequest, jS as RealtimeVoiceToolCallEvent, lc as OpenClawPluginNodeInvokePolicy, mS as TranscriptStartRequest, rC as PluginStateKeyedStore, sc as OpenClawPluginCliRootCommandDescriptor } from "../config-contracts-DzLaG7FV.js";
import { t as SchemaContract } from "../schema-contract-v05QRSzC.js";
import "../config-BqyL0TqI.js";
import { T as TalkEventInput } from "../diagnostic-events-Ji9KAhB2.js";
import { n as callGatewayFromCli } from "../gateway-rpc-Bg3n2Bm7.js";
import { n as RealtimeVoiceBridgeSession, r as RealtimeVoiceAgentConsultToolPolicy, t as RealtimeVoiceSessionHarness } from "../realtime-session-harness-BfBa6KMV.js";
import { z } from "zod";
import { TObject } from "typebox";
import { Writable } from "node:stream";
import { Command } from "commander";
//#region src/meeting-bot/realtime-audio-format.d.ts
type MeetingRealtimeAudioFormat = "pcm16-24khz" | "g711-ulaw-8khz";
export declare function convertMeetingTtsAudioForBridge(audio: Buffer, sampleRate: number, audioFormat: MeetingRealtimeAudioFormat, outputFormat?: string, platformName?: string): Buffer;
//#endregion
//#region src/meeting-bot/output-loopback-verifier.d.ts
type MeetingOutputLoopbackHealth = {
lastOutputLoopbackAt?: string;
lastOutputLoopbackCorrelation?: number;
lastOutputLoopbackPeak?: number;
lastOutputLoopbackRms?: number;
/** Non-silent sink audio observed again on the meeting microphone capture path. */
outputLoopbackSignalBytes: number;
outputGeneration: number;
verifiedOutputGeneration?: number;
};
//#endregion
//#region src/meeting-bot/realtime-audio-transport.d.ts
type MeetingRealtimeAudioTransportHealth = Partial<MeetingOutputLoopbackHealth> & {
consecutiveInputErrors?: number;
lastInputError?: string;
};
interface MeetingRealtimeAudioTransport {
/** Input contains browser playback only, excluding native microphone injection. */
inputAudioIsolated?: boolean;
/** Delivers a prior failure immediately so provider setup cannot outrun transport teardown. */
onFatal(handler: () => void): void;
startInput(onAudio: (audio: Buffer) => void): void;
/** Starts one assistant-output generation so loopback proof cannot reuse older audio. */
beginOutput?(): void;
stop(): Promise<void>;
writeOutput(audio: Buffer): Promise<void>;
clearOutput(): Promise<void>;
dispose(): Promise<void>;
getHealth?(): MeetingRealtimeAudioTransportHealth;
startBargeInMonitor?(onBargeIn: (audio: Buffer) => boolean): void;
}
//#endregion
//#region src/meeting-bot/realtime-engine.d.ts
type MeetingRuntimePlatform = {
/** Adapter-owned identity keeps platform names and log prefixes out of core. */
displayName: string;
logScope: string;
sessionIdPrefix: string;
};
type MeetingRealtimeEngineConfig = {
chrome: {
audioFormat: MeetingRealtimeAudioFormat;
};
realtime: {
strategy: string;
agentId?: string;
provider?: string;
transcriptionProvider?: string;
voiceProvider?: string;
model?: string;
instructions?: string;
introMessage?: string;
toolPolicy?: RealtimeVoiceAgentConsultToolPolicy;
providers: Record<string, Record<string, unknown>>;
};
};
type MeetingAgentConsultParams = {
meetingSessionId: string;
requesterSessionKey?: string;
args: unknown;
transcript: Array<{
role: "user" | "assistant";
text: string;
}>;
/** Meeting-owned cancellation for the active consult. */
abortSignal?: AbortSignal;
};
type MeetingRealtimeToolCallParams = {
strategy: string;
session: RealtimeVoiceBridgeSession;
event: RealtimeVoiceToolCallEvent;
meetingSessionId: string;
requesterSessionKey?: string;
transcript: Array<{
role: "user" | "assistant";
text: string;
}>;
onTalkEvent: (event: TalkEventInput) => void;
};
type MeetingRealtimeAudioEngineHealth = ReturnType<RealtimeVoiceSessionHarness["getHealth"]> & MeetingRealtimeAudioTransportHealth & {
lastClearAt?: string;
clearCount?: number;
bridgeClosed: boolean;
};
type MeetingRealtimeAudioEngineHandle = {
providerId: string;
speak: (instructions?: string) => void;
getHealth: () => MeetingRealtimeAudioEngineHealth;
stop: () => Promise<void>;
};
export declare function startMeetingRealtimeEngine(params: {
config: MeetingRealtimeEngineConfig;
fullConfig: OpenClawConfig;
runtime: PluginRuntime;
platform: MeetingRuntimePlatform;
meetingSessionId: string;
requesterSessionKey?: string;
logPrefix?: "node";
talkSessionId?: string;
talkContext?: {
nodeId: string;
bridgeId: string;
};
transport: MeetingRealtimeAudioTransport;
logger: RuntimeLogger;
providers?: RealtimeVoiceProviderPlugin[];
consultAgent: (params: MeetingAgentConsultParams) => Promise<{
text: string;
}>;
tools: RealtimeVoiceTool[];
handleToolCall: (params: MeetingRealtimeToolCallParams) => Promise<void>;
}): Promise<MeetingRealtimeAudioEngineHandle>;
//#endregion
//#region src/meeting-bot/realtime-agent-engine.d.ts
export declare function startMeetingAgentRealtimeEngine(params: Omit<Parameters<typeof startMeetingRealtimeEngine>[0], "providers" | "talkSessionId" | "talkContext" | "tools" | "handleToolCall"> & {
providers?: RealtimeTranscriptionProviderPlugin[];
}): Promise<MeetingRealtimeAudioEngineHandle>;
//#endregion
//#region src/meeting-bot/bridge-process.d.ts
type MeetingBridgeProcess = {
exitCode: number | null;
signalCode: NodeJS.Signals | null;
kill(signal?: NodeJS.Signals): boolean;
once(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
off(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
};
//#endregion
//#region src/meeting-bot/realtime-local-audio-transport.d.ts
type BridgeProcess = MeetingBridgeProcess & {
pid?: number;
killed?: boolean;
stdin?: Writable | null;
stdout?: {
on(event: "data", listener: (chunk: Buffer | string) => void): unknown;
on(event: "error", listener: (error: Error) => void): unknown;
} | null;
stderr?: {
on(event: "data", listener: (chunk: Buffer | string) => void): unknown;
on(event: "error", listener: (error: Error) => void): unknown;
} | null;
on(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
on(event: "error", listener: (error: Error) => void): unknown;
};
type MeetingRealtimeAudioSpawn = (command: string, args: string[], options: {
stdio: ["pipe" | "ignore", "pipe" | "ignore", "pipe" | "ignore"];
}) => BridgeProcess;
export declare function createLocalMeetingRealtimeAudioTransport(params: {
inputCommand: string[];
outputCommand: string[];
bargeInInputCommand?: string[];
bargeInRmsThreshold: number;
bargeInPeakThreshold: number;
bargeInCooldownMs: number;
logger: RuntimeLogger;
logScope: string;
audioFormat?: MeetingRealtimeAudioFormat;
spawn?: MeetingRealtimeAudioSpawn;
}): MeetingRealtimeAudioTransport;
//#endregion
//#region src/meeting-bot/realtime-node-audio-transport.d.ts
export declare function createNodeMeetingRealtimeAudioTransport(params: {
runtime: PluginRuntime;
nodeId: string;
bridgeId: string;
logger: RuntimeLogger;
/** Platform registration owns this stable command name; paired nodes call it verbatim. */
commandName: string;
logScope: string;
logPrefix: string;
audioFormat?: MeetingRealtimeAudioFormat;
}): MeetingRealtimeAudioTransport;
//#endregion
//#region src/meeting-bot/audio-backend.d.ts
type MeetingAudioBackend = "blackhole-2ch" | "pipewire-pulse";
type MeetingAudioBackendSelection = "auto" | MeetingAudioBackend;
type MeetingAudioRuntime = {
backend: MeetingAudioBackend;
deviceLabel: string;
inputCommand: string[];
outputCommand: string[];
};
type MeetingAudioCommandResult = {
code: number;
stdout?: string;
stderr?: string;
};
declare function resolveMeetingAudioRuntimeForFormat(params: {
backend?: MeetingAudioBackendSelection;
bufferBytes: number;
format: MeetingRealtimeAudioFormat;
inputCommand?: readonly string[];
outputCommand?: readonly string[];
platform?: NodeJS.Platform;
}): MeetingAudioRuntime;
declare function ensureMeetingAudioBackend(params: {
backend: MeetingAudioBackend;
run(argv: string[], timeoutMs: number): Promise<MeetingAudioCommandResult>;
timeoutMs: number;
}): Promise<void>;
//#endregion
//#region src/meeting-bot/session-types.d.ts
declare const meetingObservationProvenanceSchema: z.ZodObject<{
observer: z.ZodString;
observationId: z.ZodOptional<z.ZodString>;
sessionId: z.ZodOptional<z.ZodString>;
epoch: z.ZodOptional<z.ZodString>;
observedAt: z.ZodOptional<z.ZodISODateTime>;
speaker: z.ZodOptional<z.ZodString>;
self: z.ZodEnum<{
other: "other";
self: "self";
unknown: "unknown";
}>;
}, z.core.$strip>;
declare const meetingCaptionSourceSchema: z.ZodObject<{
id: z.ZodString;
epoch: z.ZodString;
revision: z.ZodString;
finalized: z.ZodBoolean;
ownEcho: z.ZodOptional<z.ZodBoolean>;
}, z.core.$strip>;
/** Generic lifecycle state shared by browser and dial-in meeting sessions. */
type MeetingSessionState = "active" | "ended";
type MeetingResolvedJoin<TTransport extends string, TMode extends string> = {
url: string;
transport: TTransport;
mode: TMode;
agentId: string;
};
/** Descriptive facts for one retained observation, never participation authority. */
type MeetingObservationProvenance = SchemaContract<z.infer<typeof meetingObservationProvenanceSchema>>;
type MeetingTranscriptLine = {
at?: string;
speaker?: string;
text: string;
/** Independent of the optional, mutable action-source identity below. */
provenance?: MeetingObservationProvenance;
/** Optional identity assigned by the provider's canonical caption observer. */
source?: SchemaContract<z.infer<typeof meetingCaptionSourceSchema>>;
};
type MeetingTranscriptSnapshot = {
droppedLines: number;
epoch?: string;
lines: MeetingTranscriptLine[];
/** Live caption revisions for observation only; never append these to the transcript. */
pendingLines?: MeetingTranscriptLine[];
};
type MeetingBrowserTab = {
targetId: string;
openedByPlugin: boolean;
};
type MeetingBrowserCandidateTab = {
targetId?: string;
title?: string;
url?: string;
};
type MeetingBrowserHealth<TManualReason extends string = string, TSpeechBlockedReason extends string = string> = Partial<MeetingOutputLoopbackHealth> & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: TManualReason;
message: string;
};
speechReady?: boolean;
speechBlockedReason?: TSpeechBlockedReason;
speechBlockedMessage?: string;
};
type MeetingPluginProbeHealth = MeetingBrowserHealth & {
audioOutputActive?: boolean;
captioning?: boolean;
captionsEnabledAttempted?: boolean;
lastCaptionAt?: string;
lastCaptionSpeaker?: string;
lastCaptionText?: string;
lastOutputBytes?: number;
recentTranscript?: MeetingTranscriptLine[];
transcriptLines?: number;
};
type MeetingRealtimeSessionBlock = {
enabled: boolean;
strategy?: string;
provider?: string;
model?: string;
transcriptionProvider?: string;
toolPolicy: string;
};
/**
* Stable shared wire fields. Platform adapters add thin browser and dial-in blocks
* under their existing public field names so migrations do not reshape JSON.
*/
type MeetingSessionRecord<TTransport extends string = string, TMode extends string = string, TRealtime extends MeetingRealtimeSessionBlock = MeetingRealtimeSessionBlock> = {
id: string;
url: string;
transport: TTransport;
mode: TMode;
agentId: string;
state: MeetingSessionState;
transcriptEvicted?: boolean;
browserLeft?: boolean;
createdAt: string;
updatedAt: string;
participantIdentity: string;
realtime: TRealtime;
notes: string[];
};
type MeetingPluginJoinRequest<TTransport extends string, TMode extends string> = {
url: string;
transport?: TTransport;
mode?: TMode;
message?: string;
requesterSessionKey?: string;
agentId?: string;
timeoutMs?: number;
};
type MeetingPluginChromeHealth<TManualReason extends string, TSpeechBlockedReason extends string> = MeetingBrowserHealth<TManualReason, TSpeechBlockedReason> & MeetingPluginProbeHealth & {
cameraOff?: boolean;
lobbyWaiting?: boolean;
captionCaptureRequested?: boolean;
audioInputRouted?: boolean;
audioInputDeviceLabel?: string;
audioInputRouteError?: string;
audioOutputRouted?: boolean;
audioOutputDeviceLabel?: string;
audioOutputRouteError?: string;
audioOutputRouteRetryable?: boolean;
providerConnected?: boolean;
realtimeReady?: boolean;
audioInputActive?: boolean;
lastInputAt?: string;
lastOutputAt?: string;
lastInputBytes?: number;
bridgeClosed?: boolean;
browserUrl?: string;
browserTitle?: string;
status?: string;
notes?: string[];
};
type MeetingPluginSession<TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth> = MeetingSessionRecord<TTransport, TMode> & {
chrome?: {
audioBackend?: MeetingAudioBackend;
launched: boolean;
nodeId?: string;
browserProfile?: string;
browserTab?: MeetingBrowserTab;
audioBridge?: {
type: "command-pair" | "node-command-pair";
provider?: string;
};
health?: THealth;
};
};
type MeetingPluginJoinResult<TSession> = {
session: TSession;
spoken?: boolean;
};
//#endregion
//#region src/meeting-bot/participation-types.d.ts
type MeetingParticipationAction = {
type: string;
[key: string]: unknown;
};
type MeetingParticipationRequest = {
requestId: string;
sourceId?: string;
correctionOf?: string;
action: MeetingParticipationAction;
};
type MeetingParticipationEffectResult = {
status: "succeeded" | "failed" | "uncertain" | "unsupported" | "rejected";
message?: string;
observed?: Record<string, unknown>;
/** Only rejected results that prove the requested effect did not occur may request correction. */
correctable?: true;
};
type MeetingParticipationResult = MeetingParticipationEffectResult & {
requestId: string;
replayed?: boolean;
/** One correction of this request is permitted; it retains the original source and action type. */
correctionOf?: string;
};
/** Provider-observed identity. Never accept this object from model/tool arguments. */
type MeetingParticipationSource = NonNullable<MeetingTranscriptLine["source"]> & {
kind: "chat" | "caption";
text: string;
/** Observation that supplied this source; does not refresh its age, order, or authority. */
provenance?: NonNullable<MeetingTranscriptLine["provenance"]>;
};
type MeetingParticipationAttempt = {
kind: "meeting-participation-attempt";
sessionId: string;
requestId: string;
fingerprint: string;
sourceId?: string;
actionType: string;
correctionOf?: string;
result?: MeetingParticipationResult;
};
type MeetingParticipationStore = Pick<PluginStateKeyedStore<MeetingParticipationAttempt>, "lookup" | "registerIfAbsent" | "register" | "entries" | "delete">;
type MeetingBrowserParticipationAdapter = {
capabilities: readonly string[];
validateAction(action: MeetingParticipationAction): string | undefined;
/** Preparation may await UI readiness but must never perform the requested external action. */
buildPreparationScript?(params: {
meetingSessionId: string;
meetingUrl: string;
requestId: string;
action: MeetingParticipationAction;
}): string;
parsePreparationResult?(result: unknown, action: MeetingParticipationAction): MeetingParticipationEffectResult;
/** Verify page session/URL and perform the effect synchronously before any await. */
buildActionScript(params: {
meetingSessionId: string;
meetingUrl: string;
requestId: string;
action: MeetingParticipationAction;
}): string;
parseActionResult(result: unknown, action: MeetingParticipationAction): MeetingParticipationEffectResult;
};
type MeetingParticipationOptions<TSession> = {
store: MeetingParticipationStore;
capabilities(session: TSession): readonly string[];
validateAction(action: MeetingParticipationAction): string | undefined;
execute(session: TSession, request: MeetingParticipationRequest, assertCurrent: () => void): Promise<MeetingParticipationEffectResult>;
};
//#endregion
//#region src/meeting-bot/session-speech-readiness.d.ts
type MeetingSpeechReadinessMessages<TReason extends string> = {
audioBridgeUnavailable: string;
audioBridgeUnavailableReason: TReason;
browserUnverified: string;
browserUnverifiedReason: TReason;
microphoneMuted: string;
microphoneMutedReason: TReason;
notInCall: string;
notInCallReason: TReason;
};
//#endregion
//#region src/meeting-bot/transcripts-bridge.d.ts
type MeetingDurableTranscriptsOptions = {
config?: unknown;
openclawConfig?: OpenClawConfig;
providerId: string;
providerName: string;
stateDir?: string;
};
type MeetingTranscriptSourceRuntime = {
startTranscriptSource(request: TranscriptStartRequest): Promise<TranscriptsStartResult>;
stopTranscriptSource(request: TranscriptStopRequest): Promise<TranscriptsStopResult>;
};
//#endregion
//#region src/meeting-bot/session-runtime-types.d.ts
type MeetingSessionRuntimeHandles<THealth extends MeetingBrowserHealth> = {
stop?: () => Promise<void>;
speak?: (instructions?: string) => void;
getHealth?: () => Partial<THealth>;
};
type MeetingBrowserSessionView<THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab> = {
launched: boolean;
nodeId?: string;
tab?: TTab;
health?: THealth;
hasAudioBridge: boolean;
};
type MeetingSessionRuntimeJoinContext<TSession extends MeetingSessionRecord<TTransport, TMode>, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab> = {
attachRuntimeHandles(session: TSession, handles: MeetingSessionRuntimeHandles<THealth>): void;
inheritedBrowserTab(params: {
session: TSession;
transport: TTransport;
nodeId?: string;
meetingUrl: string;
tab?: TTab;
}): TTab | undefined;
};
type MeetingSessionRuntimeMessages<TSpeechBlockedReason extends string> = {
previousBrowserLeaveFailed: string;
reassignedSessionNote: string;
reusedSessionNote: string;
replacementBrowserLeaveFailed: string;
speechBlockedFallback: string;
speech: MeetingSpeechReadinessMessages<TSpeechBlockedReason>;
};
type MeetingSessionRuntimeOptions<TSession extends MeetingSessionRecord<TTransport, TMode>, TRequest, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth<TManualReason, TSpeechBlockedReason>, TTab extends MeetingBrowserTab, TManualReason extends string, TSpeechBlockedReason extends string> = {
logger: RuntimeLogger;
logScope: string;
formatError(error: unknown): string;
messages: MeetingSessionRuntimeMessages<TSpeechBlockedReason>;
reuseExistingBrowserTab: boolean;
waitForInCallMs: number;
joinTimeoutMs: number;
transientSpeechBlockedReasons: ReadonlySet<TSpeechBlockedReason>;
resolveJoin(request: TRequest): MeetingResolvedJoin<TTransport, TMode>;
createSession(params: {
request: TRequest;
resolved: MeetingResolvedJoin<TTransport, TMode>;
createdAt: string;
}): TSession;
resolveSpeechInstructions(request: TRequest): string | undefined;
isBrowserTransport(transport: TTransport): boolean;
isTalkBackMode(mode: TMode): boolean;
isTranscribeMode(mode: TMode): boolean;
sameMeetingUrl(left: string | undefined, right: string | undefined): boolean;
normalizeMeetingUrlForReuse(url: string): string | undefined;
getBrowser(session: TSession): MeetingBrowserSessionView<THealth, TTab> | undefined;
setBrowserTab(session: TSession, tab: TTab | undefined): void;
setBrowserHealth(session: TSession, health: THealth | undefined): void;
joinTransport(params: {
request: TRequest;
session: TSession;
context: MeetingSessionRuntimeJoinContext<TSession, TTransport, TMode, THealth, TTab>;
}): Promise<{
delegatedSpoken?: boolean;
}>;
releaseBrowserTab(session: TSession): Promise<boolean | undefined>;
refreshBrowserHealth(session: TSession, options?: {
force?: boolean;
readOnly?: boolean;
}): Promise<void>;
refreshStatus(session: TSession): Promise<void>;
refreshReusableSession(session: TSession, request: TRequest, resolved: MeetingResolvedJoin<TTransport, TMode>): Promise<{
keepBrowserTab: boolean;
} | void>;
ensureRealtimeBridge(session: TSession): Promise<MeetingSessionRuntimeHandles<THealth> | undefined>;
captureTranscript(session: TSession, options?: {
finalize?: boolean;
}): Promise<MeetingTranscriptSnapshot | undefined>;
speakViaTransport(session: TSession, instructions?: string): Promise<{
handled: boolean;
spoken: boolean;
} | undefined>;
defaultSpeechInstructions?: string;
durableTranscripts?: MeetingDurableTranscriptsOptions;
participation?: MeetingParticipationOptions<TSession>;
};
type MeetingSessionLeaveResult<TSession> = {
found: boolean;
session?: TSession;
browserLeft?: boolean;
};
//#endregion
//#region src/meeting-bot/session-runtime.d.ts
/** Shared lifecycle owner; platform strategies perform transport-specific I/O only. */
export declare class MeetingSessionRuntime<TSession extends MeetingSessionRecord<TTransport, TMode>, TRequest, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth<TManualReason, TSpeechBlockedReason>, TTab extends MeetingBrowserTab, TManualReason extends string, TSpeechBlockedReason extends string> {
#private;
private readonly options;
constructor(options: MeetingSessionRuntimeOptions<TSession, TRequest, TTransport, TMode, THealth, TTab, TManualReason, TSpeechBlockedReason>);
list(): TSession[];
getSession(sessionId: string): TSession | undefined;
status(sessionId?: string): Promise<{
found: boolean;
session?: TSession;
sessions?: TSession[];
}>;
participationContext(sessionId: string): {
sessionId: string;
active: boolean;
sourceOrder: number;
capabilities: readonly string[];
sources: ({
id: string;
epoch: string;
revision: string;
finalized: boolean;
ownEcho?: boolean | undefined;
} & {
kind: "chat" | "caption";
text: string;
provenance?: NonNullable<MeetingTranscriptLine["provenance"]>;
} & {
sourceId: string;
order: number;
replacesSourceId?: string;
})[];
};
observeParticipationEpoch(sessionId: string, kind: MeetingParticipationSource["kind"], epoch: string): boolean;
observeParticipationSource(sessionId: string, source: MeetingParticipationSource): string | undefined;
inspectParticipationSource(sessionId: string, sourceId: string): {
assertCurrent(): void;
source: {
id: string;
epoch: string;
revision: string;
finalized: boolean;
ownEcho?: boolean | undefined;
} & {
kind: "chat" | "caption";
text: string;
provenance?: NonNullable<MeetingTranscriptLine["provenance"]>;
} & {
sourceId: string;
order: number;
replacesSourceId?: string;
};
} | undefined;
participate(sessionId: string, request: MeetingParticipationRequest): Promise<MeetingParticipationResult>;
transcript(sessionId: string, options?: {
sinceIndex?: number;
}): Promise<{
found: boolean;
sessionId?: string;
startIndex?: number;
nextIndex?: number;
droppedLines?: number;
evicted?: boolean;
lines?: MeetingTranscriptLine[];
}>;
startTranscriptSource(request: TranscriptStartRequest): Promise<TranscriptsStartResult>;
reconcileTranscriptPolicy(enabled: boolean): Promise<void>;
stopTranscriptSource(request: TranscriptStopRequest): Promise<TranscriptsStopResult>;
isReusableSession(session: TSession, resolved: MeetingResolvedJoin<TTransport, TMode>): boolean;
join(request: TRequest): Promise<{
session: TSession;
spoken?: boolean;
}>;
leave(sessionId: string, options?: {
keepBrowserTab?: boolean;
}): Promise<MeetingSessionLeaveResult<TSession>>;
speak(sessionId: string, instructions?: string): Promise<{
found: boolean;
spoken: boolean;
session?: TSession;
}>;
speakWhenReady(session: TSession, instructions: string): Promise<boolean>;
hasHealthHandle(sessionId: string): boolean;
refreshHealth(sessionId?: string): void;
refreshBrowserHealth(session: TSession, options?: {
force?: boolean;
readOnly?: boolean;
}): Promise<void>;
refreshCaptionHealth(session: TSession): Promise<void>;
refreshSpeechReadiness(session: TSession): {
ready: boolean;
reason?: TSpeechBlockedReason;
message?: string;
};
markSessionEnded(session: TSession, reason: string): void;
}
//#endregion
//#region src/meeting-bot/browser-audio-capture-source.d.ts
type MeetingBrowserAudioCaptureRequest = {
action: "start" | "pull" | "stop";
captureId: string;
meetingSessionId: string;
meetingUrl: string;
};
//#endregion
//#region src/meeting-bot/platform-adapter-contract.d.ts
type MeetingManualActionCategory = "login-required" | "admission-required" | "permission-required" | "audio-choice-required" | "locale-required" | "session-conflict" | "browser-control-unavailable" | "custom";
type MeetingManualAction = {
category: MeetingManualActionCategory;
reason: string;
message: string;
};
type MeetingBrowserRequestParams = {
method: "GET" | "POST" | "DELETE";
path: string;
body?: unknown;
timeoutMs: number;
};
type MeetingBrowserRequestCaller = (params: MeetingBrowserRequestParams) => Promise<unknown>;
type MeetingBrowserJoinSession<Mode extends string> = {
captureCaptions?: boolean;
meetingSessionId: string;
mode: Mode;
url: string;
};
type MeetingBrowserStatusScriptParams<Mode extends string> = MeetingBrowserJoinSession<Mode> & {
allowSessionAdoption: boolean;
autoJoin: boolean;
captureCaptions: boolean;
guestName: string;
readOnly?: boolean;
waitForInCallMs: number;
};
type MeetingBrowserLeaveStep = {
departed: boolean;
leaveAction?: "leave" | "confirm";
sessionConflict?: boolean;
sessionMatched?: boolean;
urlMatched?: boolean;
};
type MeetingBrowserPermissionPlan = {
origin: string;
permissions: string[];
optionalPermissions?: string[];
};
type MeetingAgentConsultSurface = {
id: string;
provider: string;
lane: string;
surface: string;
userLabel: string;
assistantLabel: string;
questionSourceLabel: string;
workingResponseLabel: string;
extraSystemPrompt: string;
};
type MeetingPlatformRuntimeMetadata = {
id: string;
displayName: string;
logScope: string;
agentConsult: Omit<MeetingAgentConsultSurface, "id" | "provider" | "lane">;
session: {
idPrefix: string;
participantIdentity(transport: string): string;
};
};
type MeetingBrowserAdapter<Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot> = {
participation?: MeetingBrowserParticipationAdapter;
allowsMicrophone(mode: Mode): boolean;
buildStatusJoinScript(params: MeetingBrowserStatusScriptParams<Mode>): string;
buildAudioCaptureScript?(params: MeetingBrowserAudioCaptureRequest): string;
parseStatus(result: unknown): Health | undefined;
classifyManualAction(health: Health): MeetingManualAction | undefined;
shouldRetryJoinStatus?(health: Health): boolean;
browserControlUnavailable(error: unknown): MeetingManualAction;
buildLeaveScript(meetingUrl: string): string;
buildSessionLeaveScript?(params: {
leaveInitiated: boolean;
meetingSessionId: string;
meetingUrl: string;
}): string;
parseLeaveResult(result: unknown): MeetingBrowserLeaveStep;
captions: {
enabled(mode: Mode): boolean;
buildTranscriptScript(params: {
finalize: boolean;
meetingSessionId: string;
meetingUrl: string;
}): string;
parseTranscript(result: unknown): Transcript & {
sessionMatched?: boolean;
urlMatched?: boolean;
};
};
permissions(params: {
allowMicrophone: boolean;
meetingUrl: string;
}): MeetingBrowserPermissionPlan | undefined;
permissionNotes(params: {
allowMicrophone: boolean;
error?: unknown;
result?: unknown;
}): string[];
};
interface MeetingPlatformAdapter$1<Session, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot, CreateParams = never, CreateResult = never, DialInParams = never, DialInPlan = never> {
id: string;
displayName: string;
browserLabel: string;
logScope: string;
agentConsult?: MeetingPlatformRuntimeMetadata["agentConsult"];
session?: MeetingPlatformRuntimeMetadata["session"];
nodeCommandName: string;
nodeConfigPath: string;
urls: {
validateAndNormalize(input: unknown): string;
normalizeForReuse(url: string | undefined): string | undefined;
isSameMeeting(a: string | undefined, b: string | undefined): boolean;
buildJoinUrl(session: Session & {
url: string;
}): string;
accountHint(url: string | undefined): string | undefined;
isPreferredJoinUrl(url: string | undefined): boolean;
isRecoverableTab(tab: MeetingBrowserCandidateTab, url?: string): boolean;
localeAction(tab: MeetingBrowserCandidateTab): MeetingManualAction | undefined;
};
browser: MeetingBrowserAdapter<Mode, Health, Transcript>;
create?: {
browser(params: CreateParams): Promise<CreateResult>;
};
dialIn?: {
buildPlan(params: DialInParams): DialInPlan;
};
}
type MeetingPlatformAdapterOptions<Session, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot, CreateParams = never, CreateResult = never, DialInParams = never, DialInPlan = never> = Omit<MeetingPlatformAdapter$1<Session, Mode, Health, Transcript, CreateParams, CreateResult, DialInParams, DialInPlan>, "agentConsult" | "browser" | "session"> & {
agentConsult: MeetingPlatformRuntimeMetadata["agentConsult"];
browser: Omit<MeetingBrowserAdapter<Mode, Health, Transcript>, "captions" | "classifyManualAction" | "parseLeaveResult" | "parseStatus" | "permissionNotes"> & {
captions: Omit<MeetingBrowserAdapter<Mode, Health, Transcript>["captions"], "parseTranscript">;
permissionNotes?: MeetingBrowserAdapter<Mode, Health, Transcript>["permissionNotes"];
};
parsing: {
classifyManualActionReason(reason: string): MeetingManualActionCategory;
displayName: string;
invalidTranscriptMessage: string;
malformedStatusMessage: string;
malformedTranscriptMessage: string;
statusFields?(parsed: Record<string, unknown>): Partial<Health>;
};
session: MeetingPlatformRuntimeMetadata["session"];
};
//#endregion
//#region src/meeting-bot/session-factory.d.ts
export declare function createMeetingSession<TTransport extends string, TMode extends string, TToolPolicy extends string>(params: {
platform: MeetingPlatformRuntimeMetadata;
config: {
realtime: {
provider?: string;
voiceProvider?: string;
transcriptionProvider?: string;
model?: string;
toolPolicy: TToolPolicy;
};
};
resolved: MeetingResolvedJoin<TTransport, TMode>;
createdAt: string;
}): MeetingSessionRecord<TTransport, TMode, {
enabled: boolean;
strategy: string;
provider: string | undefined;
model: string | undefined;
transcriptionProvider: string | undefined;
toolPolicy: TToolPolicy;
}>;
//#endregion
//#region src/meeting-bot/browser-controller.d.ts
type MeetingBrowserControllerConfig = {
launch: boolean;
reuseExistingTab: boolean;
autoJoin: boolean;
guestName: string;
joinTimeoutMs: number;
waitForInCallMs: number;
};
type BrowserAdapter$1<Session = never, Mode extends string = string, Health extends MeetingBrowserHealth = MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot = MeetingTranscriptSnapshot> = Pick<MeetingPlatformAdapter$1<Session, Mode, Health, Transcript>, "browser" | "browserLabel" | "urls">;
export declare function openMeetingWithBrowser<Session extends MeetingBrowserJoinSession<Mode>, Mode extends string, Health extends MeetingBrowserHealth & {
browserTitle?: string;
browserUrl?: string;
notes?: string[];
}, Transcript extends MeetingTranscriptSnapshot>(params: {
adapter: BrowserAdapter$1<Session, Mode, Health, Transcript>;
callBrowser: MeetingBrowserRequestCaller;
config: MeetingBrowserControllerConfig;
session: Session;
}): Promise<{
launched: boolean;
browser?: Health;
tab?: MeetingBrowserTab;
}>;
export declare function recoverMeetingBrowserTab<Session, Mode extends string, Health extends MeetingBrowserHealth & {
browserTitle?: string;
browserUrl?: string;
notes?: string[];
}, Transcript extends MeetingTranscriptSnapshot>(params: {
adapter: BrowserAdapter$1<Session, Mode, Health, Transcript>;
allowSessionAdoption?: boolean;
autoJoin?: boolean;
callBrowser: MeetingBrowserRequestCaller;
captureCaptions?: boolean;
config: MeetingBrowserControllerConfig;
locationLabel: string;
meetingSessionId?: string;
mode: Mode;
requestedMeetingUrl: string | undefined;
readOnly?: boolean;
timeoutMs?: number;
trackedMeetingUrl: string | undefined;
trackedTargetId: string | undefined;
}): Promise<{
found: boolean;
targetId?: string;
tab?: MeetingBrowserCandidateTab;
browser?: Health;
message: string;
}>;
//#endregion
//#region src/meeting-bot/browser-session-control.d.ts
type BrowserAdapter<Session = never, Mode extends string = string, Health extends MeetingBrowserHealth = MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot = MeetingTranscriptSnapshot> = Pick<MeetingPlatformAdapter$1<Session, Mode, Health, Transcript>, "browser" | "browserLabel">;
export declare function leaveMeetingWithBrowser<Session, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot>(params: {
adapter: BrowserAdapter<Session, Mode, Health, Transcript>;
callBrowser: MeetingBrowserRequestCaller;
launch: boolean;
meetingSessionId?: string;
meetingUrl: string;
tab: MeetingBrowserTab;
timeoutMs: number;
}): Promise<{
left: boolean;
note: string;
}>;
export declare function readMeetingTranscriptWithBrowser<Session, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot>(params: {
adapter: BrowserAdapter<Session, Mode, Health, Transcript>;
callBrowser: MeetingBrowserRequestCaller;
finalize: boolean;
meetingUrl: string;
meetingSessionId: string;
tab: MeetingBrowserTab;
timeoutMs: number;
}): Promise<Transcript>;
//#endregion
//#region src/meeting-bot/browser-request.d.ts
export declare function asMeetingBrowserTabs(result: unknown): MeetingBrowserCandidateTab[];
export declare function readMeetingBrowserTab(result: unknown): MeetingBrowserCandidateTab | undefined;
export declare function resolveLocalMeetingBrowserRequest(runtime: PluginRuntime): Promise<MeetingBrowserRequestCaller>;
//#endregion
//#region src/meeting-bot/browser-node.d.ts
type MeetingBrowserNodeInfo = {
caps?: string[];
commands?: string[];
connected?: boolean;
nodeId?: string;
displayName?: string;
remoteIp?: string;
};
type NodeAdapter = Pick<MeetingPlatformAdapter$1<unknown, string, MeetingBrowserHealth, MeetingTranscriptSnapshot>, "displayName" | "nodeCommandName" | "nodeConfigPath">;
export declare function resolveMeetingBrowserNodeInfo(params: {
runtime: PluginRuntime;
adapter: NodeAdapter;
requestedNode?: string;
}): Promise<MeetingBrowserNodeInfo>;
export declare function resolveMeetingBrowserNode(params: {
runtime: PluginRuntime;
adapter: NodeAdapter;
requestedNode?: string;
}): Promise<string>;
export declare function callMeetingBrowserProxyOnNode(params: {
runtime: PluginRuntime;
adapter: NodeAdapter;
nodeId: string;
} & MeetingBrowserRequestParams): Promise<unknown>;
//#endregion
//#region src/meeting-bot/browser-adapter-options.d.ts
declare function createMeetingBrowserAdapterOptions<Mode extends string, Health extends MeetingPluginChromeHealth<string, string>, Transcript extends MeetingTranscriptSnapshot>(options: {
displayName: string;
transcriptDisplayName?: string;
manualActionReasonPrefix: string;
admissionReasons?: readonly string[];
retryCaptions: boolean;
unavailableMessage: string;
origin(meetingUrl: string): string | undefined;
scripts: {
audioCapture: (params: MeetingBrowserAudioCaptureRequest) => string;
status(params: Omit<MeetingBrowserStatusScriptParams<Mode>, "mode" | "url" | "meetingSessionId"> & {
allowMicrophone: boolean;
meetingSessionId?: string;
meetingUrl: string;
}): string;
leave: (params: {
leaveInitiated: boolean;
meetingSessionId: string;
meetingUrl: string;
}) => string;
transcript(meetingUrl: string, meetingSessionId: string, finalize: boolean): string;
};
statusFields?: (parsed: Record<string, unknown>) => Partial<Health>;
}): Pick<MeetingPlatformAdapterOptions<never, Mode, Health, Transcript>, "browser" | "parsing">;
//#endregion
//#region src/meeting-bot/agent-consult.d.ts
export declare function createMeetingRealtimeEngineBindings(params: {
platform: MeetingPlatformRuntimeMetadata;
config: {
realtime: {
agentId?: string;
toolPolicy: RealtimeVoiceAgentConsultToolPolicy;
};
};
fullConfig: OpenClawConfig;
runtime: PluginRuntime;
logger: RuntimeLogger;
}): {
platform: MeetingRuntimePlatform;
consultAgent: (consult: MeetingAgentConsultParams) => Promise<{
text: string;
}>;
tools: RealtimeVoiceTool[];
handleToolCall: (call: MeetingRealtimeToolCallParams) => Promise<void>;
};
//#endregion
//#region src/meeting-bot/plugin-config.d.ts
type MeetingPluginMode = "agent" | "bidi" | "transcribe";
type MeetingPluginConfig$1 = MeetingRealtimeEngineConfig & {
enabled: boolean;
defaultMode: MeetingPluginMode;
chrome: MeetingRealtimeEngineConfig["chrome"] & {
audioBackend: MeetingAudioBackendSelection;
audioBufferBytes: number;
launch: boolean;
browserProfile?: string;
guestName: string;
reuseExistingTab: boolean;
autoJoin: boolean;
joinTimeoutMs: number;
waitForInCallMs: number;
audioInputCommand: string[];
audioOutputCommand: string[];
audioInputCommandOverride?: string[];
audioOutputCommandOverride?: string[];
bargeInInputCommand?: string[];
bargeInRmsThreshold: number;
bargeInPeakThreshold: number;
bargeInCooldownMs: number;
};
chromeNode: {
node?: string;
};
realtime: MeetingRealtimeEngineConfig["realtime"] & {
strategy: "agent" | "bidi";
toolPolicy: RealtimeVoiceAgentConsultToolPolicy;
};
};
type MeetingPluginConfigOptions = {
defaultRealtimeInstructions: string;
resolveGatewayOperationTimeoutMs(config: MeetingPluginConfig$1): number;
};
declare function createMeetingPluginConfigSchema(options: MeetingPluginConfigOptions): {
configSchema: {
parse: (input: unknown) => MeetingPluginConfig$1;
uiHints: {
defaultMode: {
label: string;
help: string;
};
"chrome.audioBackend": {
label: string;
help: string;
};
"chrome.browserProfile": {
label: string;
advanced: true;
};
"chrome.guestName": {
label: string;
};
"chrome.waitForInCallMs": {
label: string;
advanced: true;
};
"chrome.audioInputCommand": {
label: string;
advanced: true;
};
"chrome.audioOutputCommand": {
label: string;
advanced: true;
};
"chromeNode.node": {
label: string;
help: string;
advanced: true;
};
"realtime.transcriptionProvider": {
label: string;
};
"realtime.voiceProvider": {
label: string;
};
"realtime.model": {
label: string;
advanced: true;
};
"realtime.instructions": {
label: string;
advanced: true;
};
"realtime.introMessage": {
label: string;
};
"realtime.agentId": {
label: string;
advanced: true;
};
"realtime.toolPolicy": {
label: string;
advanced: true;
};
};
};
defaultAudioInputCommand: string[];
defaultAudioOutputCommand: string[];
resolveConfig: (input: unknown) => MeetingPluginConfig$1;
resolveGatewayOperationTimeoutMs: (config: MeetingPluginConfig$1) => number;
};
//#endregion
//#region src/meeting-bot/chrome-transport-types.d.ts
type MeetingChromeTransportConfig = MeetingRealtimeEngineConfig & {
chrome: Omit<MeetingPluginConfig$1["chrome"], "audioInputCommand" | "audioOutputCommand"> & {
audioBridgeCommand?: string[];
audioBridgeHealthCommand?: string[];
audioInputCommand?: string[];
audioOutputCommand?: string[];
};
chromeNode: {
node?: string;
};
realtime: MeetingRealtimeEngineConfig["realtime"] & {
agentId?: string;
toolPolicy: Parameters<typeof createMeetingRealtimeEngineBindings>[0]["config"]["realtime"]["toolPolicy"];
};
};
type MeetingBrowserNodeAdapter = Pick<MeetingPlatformAdapter$1<unknown, string, MeetingBrowserHealth, MeetingTranscriptSnapshot>, "displayName" | "nodeCommandName" | "nodeConfigPath">;
type MeetingChromeTransportOptions<Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot> = {
browserNodeAdapter: MeetingBrowserNodeAdapter;
isRealtimeRouteReady(mode: Mode, health: Health | undefined): boolean;
isTalkBackMode(mode: Mode): boolean;
meetingLabel: string;
nodeCommandName: string;
platform: Pick<MeetingPlatformAdapter$1<MeetingBrowserJoinSession<Mode>, Mode, Health, Transcript>, "browser" | "browserLabel" | "urls" | "nodeCommandName" | "nodeConfigPath"> & MeetingPlatformRuntimeMetadata;
preserveTrackedBrowserOnEngineFailure: boolean;
startupFailurePolicy?: "rollback" | "owned";
runtime: {
createBindings: typeof createMeetingRealtimeEngineBindings;
createLocalAudioTransport: typeof createLocalMeetingRealtimeAudioTransport;
createNodeAudioTransport: typeof createNodeMeetingRealtimeAudioTransport;
startAgentRealtimeEngine: typeof startMeetingAgentRealtimeEngine;
startRealtimeEngine: typeof startMeetingRealtimeEngine;
};
};
type CommandPairAudioBridge = MeetingRealtimeAudioEngineHandle & {
type: "command-pair";
};
type ExternalAudioBridge = {
type: "external-command";
};
type MeetingChromeLaunchParams<Config, Mode extends string> = {
runtime: PluginRuntime;
config: Config;
fullConfig: OpenClawConfig;
meetingSessionId: string;
requesterSessionKey?: string;
mode: Mode;
trackedTargetId?: string;
url: string;
logger: RuntimeLogger;
};
type NodeAudioBridge = MeetingRealtimeAudioEngineHandle & {
type: "node-command-pair";
nodeId: string;
bridgeId: string;
};
type MeetingChromeRecoveryParams<Config, Mode extends string> = {
runtime: PluginRuntime;
config: Config;
fullConfig?: OpenClawConfig;
meetingSessionId?: string;
mode: Mode;
nodeId?: string;
readOnly?: boolean;
trackedMeetingUrl?: string;
trackedTargetId?: string;
transport: "chrome" | "chrome-node";
timeoutMs?: number;
url?: string;
};
//#endregion
//#region src/meeting-bot/setup-checks.d.ts
type MeetingSetupCheck = {
id: string;
ok: boolean;
message: string;
};
type MeetingSetupStatus = {
ok: boolean;
checks: MeetingSetupCheck[];
};
export declare function createMeetingSetupStatus(checks: MeetingSetupCheck[]): MeetingSetupStatus;
export declare function addMeetingSetupCheck(status: MeetingSetupStatus, check: MeetingSetupCheck): MeetingSetupStatus;
//#endregion
//#region src/meeting-bot/runtime-probes.d.ts
declare function resolveMeetingProbeTimeoutMs(input: number | undefined, fallback: number, invalidRequest?: (message: string) => Error): number;
type MeetingProbeSession<Health extends MeetingPluginProbeHealth> = {
id: string;
chrome?: {
launched: boolean;
browserTab?: {
targetId?: string;
};
health?: Health;
};
};
type MeetingProbeRequest<Transport extends string> = MeetingPluginJoinRequest<Transport, string>;
type MeetingProbeConfig<Mode extends string> = {
defaultMode: Mode;
chrome: {
joinTimeoutMs: number;
};
chromeNode: {
node?: string;
};
};
type MeetingProbeContext<Config extends MeetingProbeConfig<Mode>, Mode extends string, Transport extends string, Health extends MeetingPluginProbeHealth, Session extends MeetingProbeSession<Health>, Request extends MeetingProbeRequest<Transport>> = {
config: Config;
resolveAgentId(request: Request): string;
list(): Session[];
join(request: Request): Promise<{
session: Session;
spoken?: boolean;
}>;
isReusable(session: Session, resolved: {
url: string;
transport: Transport;
mode: Mode;
agentId: string;
}): boolean;
hasHealthHandle(sessionId: string): boolean;
refreshHealth(sessionId: string): void;
refreshCaptionHealth(session: Session, timeoutMs?: number): Promise<void>;
};
type MeetingRuntimeProbeOptions<Mode extends string, Health extends MeetingPluginProbeHealth, Session extends MeetingProbeSession<Health>> = {
defaultSpeechMessage: string;
invalidRequest(message: string): Error;
resolveTimeoutMs(input: number | undefined, fallback: number): number;
shouldWaitForListening(session: Session): boolean;
talkBackMode(mode: Mode): boolean;
};
declare function createMeetingRuntimeProbes<Config extends MeetingProbeConfig<Mode>, Mode extends string, Transport extends string, Health extends MeetingPluginProbeHealth, Session extends MeetingProbeSession<Health>, Request extends MeetingProbeRequest<Transport>>(options: MeetingRuntimeProbeOptions<Mode, Health, Session> & {
normalizeUrl?(url: string): string;
resolveRequestMode?(mode: Request["mode"], config: Config): Mode | undefined;
defaultTransport?(config: Config): Transport;
validateListeningTransport?(transport: Transport): void;
resolveSpeechTimeoutMs?(request: Request, config: Config): number;
refreshCaptionHealth?(context: MeetingProbeContext<Config, Mode, Transport, Health, Session, Request>, session: Session, timeoutMs: number): Promise<void>;
speechModeError?: string;
listeningModeError?: string;
}): {
testListening: (context: MeetingProbeContext<Config, Mode, Transport, Health, Session, Request>, request: Request) => Promise<{
createdSession: boolean;
inCall: boolean | undefined;
manualAction: {
reason: string;
message: string;
} | undefined;
listenVerified: boolean;
listenTimedOut: boolean;
captioning: boolean | undefined;
captionsEnabledAttempted: boolean | undefined;
transcriptLines: number | undefined;
lastCaptionAt: string | undefined;
lastCaptionSpeaker: string | undefined;
lastCaptionText: string | undefined;
recentTranscript: MeetingTranscriptLine[] | undefined;
session: Session;
}>;
testSpeech: (context: MeetingProbeContext<Config, Mode, Transport, Health, Session, Request>, request: Request) => Promise<{
createdSession: boolean;
inCall: boolean | undefined;
manualAction: {
reason: string;
message: string;
} | undefined;
spoken: boolean;
speechOutputVerified: boolean;
speechOutputTimedOut: boolean;
speechReady: boolean | undefined;
speechBlockedReason: string | undefined;
speechBlockedMessage: string | undefined;
audioOutputActive: boolean | undefined;
lastOutputBytes: number | undefined;
outputLoopbackSignalBytes: number | undefined;
lastOutputLoopbackAt: string | undefined;
lastOutputLoopbackCorrelation: number | undefined;
lastOutputLoopbackRms: number | undefined;
lastOutputLoopbackPeak: number | undefined;
outputGeneration: number | undefined;
verifiedOutputGeneration: number | undefined;
session: Session;
}>;
};
//#endregion
//#region src/meeting-bot/runtime-facade-types.d.ts
type MeetingRuntimeParams<Config extends MeetingPluginConfig$1> = {
config: Config;
fullConfig: OpenClawConfig;
runtime: PluginRuntime;
logger: RuntimeLogger;
};
type MeetingRuntimePlatform$1<Mode extends string, Health extends MeetingBrowserHealth> = MeetingPlatformAdapter$1<MeetingBrowserJoinSession<Mode>, Mode, Health, MeetingTranscriptSnapshot> & MeetingPlatformRuntimeMetadata;
type MeetingRuntimeAudioBridge<Health extends MeetingBrowserHealth> = MeetingSessionRuntimeHandles<Health> & {
providerId?: string;
type: "command-pair" | "node-command-pair";
};
type MeetingRuntimeLaunchResult<Health extends MeetingBrowserHealth> = {
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: MeetingRuntimeAudioBridge<Health>;
browser?: Health;
nodeId?: string;
tab?: MeetingBrowserTab;
};
type MeetingRuntimeTransport<Config extends MeetingPluginConfig$1, Mode extends string, Health extends MeetingBrowserHealth> = {
launchInChrome(params: MeetingChromeLaunchParams<Config, Mode>): Promise<MeetingRuntimeLaunchResult<Health>>;
launchOnNode(params: MeetingChromeLaunchParams<Config, Mode>): Promise<MeetingRuntimeLaunchResult<Health> & {
nodeId: string;
}>;
leaveInBrowser(params: {
runtime: PluginRuntime;
config: Config;
meetingSessionId: string;
meetingUrl: string;
nodeId?: string;
tab: MeetingBrowserTab;
}): Promise<{
left: boolean;
note: string;
}>;
readTranscript(params: {
runtime: PluginRuntime;
config: Config;
finalize?: boolean;
meetingUrl: string;
meetingSessionId: string;
nodeId?: string;
tab: MeetingBrowserTab;
}): Promise<MeetingTranscriptSnapshot>;
recoverCurrentTab(params: MeetingChromeRecoveryParams<Config, Mode>): Promise<{
browser?: Health;
found: boolean;
message: string;
tab?: MeetingBrowserCandidateTab;
}>;
};
type MeetingRuntimeManualActionReason<Health extends MeetingBrowserHealth> = NonNullable<Health["manualAction"]>["reason"];
type MeetingRuntimeSpeechBlockedReason<Health extends MeetingBrowserHealth> = NonNullable<Health["speechBlockedReason"]>;
type MeetingRuntimeProbeResults = {
setup: unknown;
listening: unknown;
speech: unknown;
};
type MeetingRuntimeOwner<Transport extends "chrome" | "chrome-node", Mode extends string, Health extends MeetingBrowserHealth> = MeetingSessionRuntime<MeetingPluginSession<Transport, Mode, Health>, MeetingPluginJoinRequest<Transport, Mode>, Transport, Mode, Health, MeetingBrowserTab, MeetingRuntimeManualActionReason<Health>, MeetingRuntimeSpeechBlockedReason<Health>>;
type MeetingRuntimeFacadeInstance<Transport extends "chrome" | "chrome-node", Mode extends string, Health extends MeetingPluginChromeHealth<string, string>, Results extends MeetingRuntimeProbeResults> = Pick<MeetingRuntimeOwner<Transport, Mode, Health>, "join" | "leave" | "reconcileTranscriptPolicy" | "speak" | "startTranscriptSource" | "status" | "stopTranscriptSource" | "transcript"> & {
list(): MeetingPluginSession<Transport, Mode, Health>[];
ownsSession(agentId: string, sessionId: string): boolean;
setupStatus(options?: {
mode?: Mode;
transport?: Transport;
}): Promise<Results["setup"]>;
statusForAgent(agentId: string, sessionId?: string): Promise<{
found: boolean;
session?: MeetingPluginSession<Transport, Mode, Health>;
sessions?: MeetingPluginSession<Transport, Mode, Health>[];
}>;
testListen(request: MeetingPluginJoinRequest<Transport, Mode>): Promise<Results["listening"]>;
testSpeech(request: MeetingPluginJoinRequest<Transport, Mode>): Promise<Results["speech"]>;
};
type MeetingRuntimeFacadeConstructor<Config extends MeetingPluginConfig$1, Transport extends "chrome" | "chrome-node", Mode extends string, Health extends MeetingPluginChromeHealth<string, string>, Results extends MeetingRuntimeProbeResults> = new (params: MeetingRuntimeParams<Config>) => MeetingRuntimeFacadeInstance<Transport, Mode, Health, Results>;
type MeetingRuntimeHookContext<Session extends MeetingPluginSession<Transport, Mode, Health>, Request extends MeetingPluginJoinRequest<Transport, Mode>, Transport extends string, Mode extends string, Health extends MeetingBrowserHealth> = {
deleteRequesterSessionKey(sessionId: string): void;
endSession(sessionId: string, options?: {
keepBrowserTab?: boolean;
}): Promise<void>;
noteSession(session: Session, note: string): void;
refreshBrowserHealth(session: Session, options?: {
force?: boolean;
readOnly?: boolean;
}): Promise<void>;
resolvedJoin(request: Request): MeetingResolvedJoin<Transport, Mode>;
};
type MeetingRuntimeHooks<Session extends MeetingPluginSession<Transport, Mode, Health>, Request extends MeetingPluginJoinRequest<Transport, Mode>, Transport extends string, Mode extends string, Health extends MeetingBrowserHealth> = {
afterStatusRefresh?(session: Session, context: MeetingRuntimeHookContext<Session, Request, Transport, Mode, Health>): Promise<void>;
afterAudioBridgeAttached?(session: Session): void;
isAudioBridgeActive?(session: Session): boolean;
isAwaitingAdmission?(session: Session): boolean;
normalizeJoinRequest?(request: Request, context: MeetingRuntimeHookContext<Session, Request, Transport, Mode, Health>): Request;
recordBrowserRecoveryFailure?(session: Session, failure: {
kind: "missing" | "error";
message: string;
}): void;
refreshReusableSession?(session: Session, request: Request, context: MeetingRuntimeHookContext<Session, Request, Transport, Mode, Health>): Promise<{
keepBrowserTab: boolean;
} | void>;
validateLaunchResult?(result: MeetingRuntimeLaunchResult<Health>): void;
};
type MeetingRuntimeMessages<Health extends MeetingBrowserHealth> = {
browserReadinessFailed?(error: string): string;
durableTranscripts: {
providerId: string;
providerName: string;
};
joined: {
local: string;
node: string;
transcribe: string;
waiting: string;
};
leaveFailed(error: string): string;
noTrackedTab: string;
sessionRuntime: MeetingSessionRuntimeMessages<MeetingRuntimeSpeechBlockedReason<Health>>;
sharedTab: string;
};
type MeetingRuntimeProbeContext<Config extends MeetingPluginConfig$1 & {
defaultMode: Mode;
}, Transport extends "chrome" | "chrome-node", Mode extends string, Health extends MeetingPluginChromeHealth<string, string>> = MeetingProbeContext<Config, Mode, Transport, Health, MeetingPluginSession<Transport, Mode, Health>, MeetingPluginJoinRequest<Transport, Mode>>;
type MeetingRuntimeFacadeOptions<Config extends MeetingPluginConfig$1 & {
defaultMode: Mode;
}, Transport extends "chrome" | "chrome-node", Mode extends string, Health extends MeetingPluginChromeHealth<string, string>, Results extends MeetingRuntimeProbeResults> = {
hooks?: MeetingRuntimeHooks<MeetingPluginSession<Transport, Mode, Health>, MeetingPluginJoinRequest<Transport, Mode>, Transport, Mode, Health>;
messages: MeetingRuntimeMessages<Health>;
platform: MeetingRuntimePlatform$1<Mode, Health>;
probes: {
setupStatus(params: MeetingRuntimeParams<Config> & {
options?: {
mode?: Mode;
transport?: Transport;
};
}): Promise<Results["setup"]>;
testListening(context: MeetingRuntimeProbeContext<Config, Transport, Mode, Health>, request: MeetingPluginJoinRequest<Transport, Mode>): Promise<Results["listening"]>;
testSpeech(context: MeetingRuntimeProbeContext<Config, Transport, Mode, Health>, request: MeetingPluginJoinRequest<Transport, Mode>): Promise<Results["speech"]>;
};
transport: MeetingRuntimeTransport<Config, Mode, Health>;
};
//#endregion
//#region src/meeting-bot/plugin-cli.d.ts
type MeetingCliDescriptions = {
root: string;
join: string;
leave: string;
status: string;
setup: string;
testSpeech: string;
testListen: string;
};
type MeetingCliOptions = {
callGateway: typeof callGatewayFromCli;
commandName: string;
config: MeetingPluginConfig$1;
descriptions: MeetingCliDescriptions;
methodPrefix: string;
program: Command;
resolveGatewayTimeoutMs(params: {
config: MeetingPluginConfig$1;
method: string;
requestedTimeoutMs?: number;
}): number;
};
declare function registerMeetingPluginCli(options: MeetingCliOptions): void;
//#endregion
//#region src/meeting-bot/chrome-transport.d.ts
declare function createMeetingChromeTransport<Config extends MeetingChromeTransportConfig, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot>(options: MeetingChromeTransportOptions<Mode, Health, Transcript>): {
assertAudioDeviceAvailable: (params: {
runtime: PluginRuntime;
config: Config;
timeoutMs: number;
}) => Promise<void>;
launchInChrome: (params: MeetingChromeLaunchParams<Config, Mode>) => Promise<{
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: CommandPairAudioBridge | undefined;
browser?: Health | undefined;
tab?: MeetingBrowserTab;
}>;
launchOnNode: (params: MeetingChromeLaunchParams<Config, Mode>) => Promise<{
nodeId: string;
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: NodeAudioBridge | undefined;
browser?: Health | undefined;
tab?: MeetingBrowserTab;
}>;
leaveInBrowser: (params: {
runtime: PluginRuntime;
config: Config;
meetingSessionId: string;
meetingUrl: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<{
left: boolean;
note: string;
}>;
readTranscript: (params: {
runtime: PluginRuntime;
config: Config;
finalize?: boolean;
meetingUrl: string;
meetingSessionId: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<Transcript>;
recoverCurrentTab: (params: MeetingChromeRecoveryParams<Config, Mode>) => Promise<{
found: boolean;
targetId?: string;
tab?: MeetingBrowserCandidateTab;
browser?: Health | undefined;
message: string;
transport: "chrome" | "chrome-node";
nodeId?: string | undefined;
}>;
};
declare function createMeetingChromeTransportWithExternalAudio<Config extends MeetingChromeTransportConfig, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot>(options: MeetingChromeTransportOptions<Mode, Health, Transcript>): {
assertAudioDeviceAvailable: (params: {
runtime: PluginRuntime;
config: Config;
timeoutMs: number;
}) => Promise<void>;
launchInChrome: (params: MeetingChromeLaunchParams<Config, Mode>) => Promise<{
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: ExternalAudioBridge | (MeetingRealtimeAudioEngineHandle & {
type: "command-pair";
} & Pick<MeetingAudioRuntime, "inputCommand" | "outputCommand">) | undefined;
browser?: Health | undefined;
tab?: MeetingBrowserTab;
}>;
launchOnNode: (params: MeetingChromeLaunchParams<Config, Mode>) => Promise<{
nodeId: string;
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: ExternalAudioBridge | NodeAudioBridge | undefined;
browser?: Health | undefined;
tab?: MeetingBrowserTab;
}>;
leaveInBrowser: (params: {
runtime: PluginRuntime;
config: Config;
meetingSessionId: string;
meetingUrl: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<{
left: boolean;
note: string;
}>;
readTranscript: (params: {
runtime: PluginRuntime;
config: Config;
finalize?: boolean;
meetingUrl: string;
meetingSessionId: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<Transcript>;
recoverCurrentTab: (params: MeetingChromeRecoveryParams<Config, Mode>) => Promise<{
found: boolean;
targetId?: string;
tab?: MeetingBrowserCandidateTab;
browser?: Health | undefined;
message: string;
transport: "chrome" | "chrome-node";
nodeId?: string | undefined;
}>;
};
//#endregion
//#region src/meeting-bot/node-invoke-policy.d.ts
type MeetingBrowserNodeStartConfig = {
launch: boolean;
browserProfile?: string;
joinTimeoutMs: number;
audioBackend?: MeetingAudioBackendSelection;
audioBufferBytes?: number;
audioFormat?: MeetingRealtimeAudioFormat;
audioInputCommand?: string[];
audioInputCommandOverride?: string[];
audioOutputCommand?: string[];
audioOutputCommandOverride?: string[];
bargeInInputCommand?: string[];
audioBridgeCommand?: string[];
audioBridgeHealthCommand?: string[];
};
type MeetingBrowserNodePolicyOptions = {
commandName: string;
displayName: string;
deniedCode: string;
supportedModes: ReadonlySet<string>;
normalizeUrl(input: unknown): string;
useConfiguredSetupCommands?: boolean;
start: MeetingBrowserNodeStartConfig;
};
export declare function createMeetingBrowserNodeInvokePolicy(options: MeetingBrowserNodePolicyOptions): OpenClawPluginNodeInvokePolicy;
//#endregion
//#region src/meeting-bot/plugin-entry.d.ts
type MeetingMode = "agent" | "bidi" | "transcribe";
type MeetingTransport = "chrome" | "chrome-node";
type MeetingJoinRequest = MeetingPluginJoinRequest<MeetingTransport, MeetingMode>;
type MeetingPluginConfig = Pick<MeetingPluginConfig$1, "enabled" | "chromeNode">;
type MeetingPluginRuntime<Request extends MeetingJoinRequest> = Partial<MeetingTranscriptSourceRuntime> & {
join(request: Request): Promise<unknown>;
leave(sessionId: string): Promise<unknown>;
ownsSession(agentId: string, sessionId: string): boolean;
setupStatus(params: {
mode?: MeetingMode;
transport?: MeetingTransport;
}): Promise<unknown>;
speak(sessionId: string, message?: string): Promise<unknown>;
status(sessionId?: string): Promise<unknown>;
statusForAgent(agentId: string, sessionId?: string): Promise<unknown>;
testListen(request: Request): Promise<unknown>;
testSpeech(request: Request): Promise<unknown>;
transcript(sessionId: string, options: {
sinceIndex?: number;
}): Promise<unknown>;
reconcileTranscriptPolicy?(enabled: boolean): Promise<void>;
};
type MeetingPluginEntryOptions<Config extends MeetingPluginConfig, Request extends MeetingJoinRequest, Runtime extends MeetingPluginRuntime<Request>> = {
cap: string;
configSchema: OpenClawPluginConfigSchema & {
parse(value: unknown): Config;
};
createNodePolicy(config: Config): OpenClawPluginNodeInvokePolicy;
createRuntime(params: {
api: OpenClawPluginApi;
config: Config;
}): Runtime;
description: string;
disabledMessage: string;
gatewayMethodPrefix: string;
id: string;
invalidRequest(message: string): Error;
isInvalidRequest(error: unknown): boolean;
name: string;
nodeCommand: string;
nodeHandler: {
(paramsJSON?: string | null): Promise<string>;
hasActiveWork?: () => boolean;
};
normalizeRequesterSessionKey(value: unknown, trustedOwner: boolean): string | undefined;
normalizeToolAgentId(agentId: string | undefined): string | undefined;
normalizeUrl(url: string): string;
registerCli(api: OpenClawPluginApi, config: Config): void;
registerNodeWhen(config: Config): boolean;
resolveGatewayTimeoutMs(config: Config): number;
resolveToolRuntime(api: OpenClawPluginApi, agentId: string | undefined): Promise<OpenClawPluginApi["runtime"] | undefined>;
toolDescription: string;
toolLabel: string;
toolName: string;
toolParameters: TObject;
transcriptSource?: {
id: string;
aliases?: readonly string[];
name: string;
};
unknownActionMessage: string;
};
declare function createMeetingPluginEntryOptions<Config extends MeetingPluginConfig, Request extends MeetingJoinRequest, Runtime extends MeetingPluginRuntime<Request>>(options: MeetingPluginEntryOptions<Config, Request, Runtime>): {
id: string;
name: string;
description: string;
configSchema: OpenClawPluginConfigSchema & {
parse(value: unknown): Config;
};
register(api: OpenClawPluginApi): void;
};
//#endregion
//#region src/meeting-bot/plugin-shell.d.ts
type MeetingPluginShellPlatform = {
browserLabel: string;
displayName: string;
id: string;
nodeCommandName: string;
session: {
idPrefix: string;
};
urls: {
validateAndNormalize(input: unknown): string;
normalizeForReuse(url: string | undefined): string | undefined;
};
};
type MeetingPluginNodeHostOptions = {
browserPageName: string;
defaultAudioInputCommand: readonly string[];
defaultAudioOutputCommand: readonly string[];
meetingLabel: string;
platform: MeetingPluginShellPlatform;
sharePrerequisiteDeadline: boolean;
};
declare function createMeetingPluginNodeHostHandler(options: MeetingPluginNodeHostOptions): ((paramsJSON?: string | null) => Promise<string>) & {
hasActiveWork: () => boolean;
};
declare function createMeetingPluginNodeInvokePolicy(config: {
chrome: Parameters<typeof createMeetingBrowserNodeInvokePolicy>[0]["start"];
}, options: {
deniedCode: string;
platform: MeetingPluginShellPlatform;
}): OpenClawPluginNodeInvokePolicy;
declare function createMeetingChromeRuntimeBindings(): {
createBindings: typeof createMeetingRealtimeEngineBindings;
createLocalAudioTransport: typeof createLocalMeetingRealtimeAudioTransport;
createNodeAudioTransport: typeof createNodeMeetingRealtimeAudioTransport;
startAgentRealtimeEngine: typeof startMeetingAgentRealtimeEngine;
startRealtimeEngine: typeof startMeetingRealtimeEngine;
};
declare function createMeetingPluginChromeTransport<Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot>(options: Omit<MeetingChromeTransportOptions<Mode, Health, Transcript>, "browserNodeAdapter" | "isRealtimeRouteReady" | "isTalkBackMode" | "nodeCommandName">): {
assertAudioDeviceAvailable: (params: {
runtime: PluginRuntime;
config: MeetingChromeTransportConfig;
timeoutMs: number;
}) => Promise<void>;
launchInChrome: (params: MeetingChromeLaunchParams<MeetingChromeTransportConfig, Mode>) => Promise<{
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: CommandPairAudioBridge | undefined;
browser?: Health | undefined;
tab?: MeetingBrowserTab;
}>;
launchOnNode: (params: MeetingChromeLaunchParams<MeetingChromeTransportConfig, Mode>) => Promise<{
nodeId: string;
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: NodeAudioBridge | undefined;
browser?: Health | undefined;
tab?: MeetingBrowserTab;
}>;
leaveInBrowser: (params: {
runtime: PluginRuntime;
config: MeetingChromeTransportConfig;
meetingSessionId: string;
meetingUrl: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<{
left: boolean;
note: string;
}>;
readTranscript: (params: {
runtime: PluginRuntime;
config: MeetingChromeTransportConfig;
finalize?: boolean;
meetingUrl: string;
meetingSessionId: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<Transcript>;
recoverCurrentTab: (params: MeetingChromeRecoveryParams<MeetingChromeTransportConfig, Mode>) => Promise<{
found: boolean;
targetId?: string;
tab?: MeetingBrowserCandidateTab;
browser?: Health | undefined;
message: string;
transport: "chrome" | "chrome-node";
nodeId?: string | undefined;
}>;
};
type MeetingPluginShellEntryOptions<Config extends MeetingPluginConfig, Request extends MeetingJoinRequest, Runtime extends MeetingPluginRuntime<Request>> = Omit<MeetingPluginEntryOptions<Config, Request, Runtime>, "cap" | "createRuntime" | "description" | "disabledMessage" | "gatewayMethodPrefix" | "id" | "name" | "nodeCommand" | "normalizeUrl" | "registerCli" | "toolDescription" | "toolLabel" | "toolName" | "transcriptSource" | "unknownActionMessage"> & {
cli: {
descriptor: OpenClawPluginCliRootCommandDescriptor;
load(): Promise<(params: {
program: Command;
config: Config;
}) => void>;
};
browserGuestLabel: string;
platform: MeetingPluginShellPlatform;
runtime: new (params: {
config: Config;
fullConfig: OpenClawPluginApi["config"];
logger: OpenClawPluginApi["logger"];
runtime: OpenClawPluginApi["runtime"];
}) => Runtime;
transcriptSource: {
aliases?: readonly string[];
id: string;
};
};
declare function createMeetingPluginShellEntry<Config extends MeetingPluginConfig, Request extends MeetingJoinRequest, Runtime extends MeetingPluginRuntime<Request>>(options: MeetingPluginShellEntryOptions<Config, Request, Runtime>): {
id: string;
name: string;
description: string;
configSchema: OpenClawPluginConfigSchema & {
parse(value: unknown): Config;
};
register(api: OpenClawPluginApi): void;
};
declare function createMeetingPluginTypes<Config extends MeetingPluginConfig$1, Transport extends string, Mode extends string, ManualReason extends string, SpeechBlockedReason extends string, ExtraHealth extends object = object>(): {
BrowserTab: MeetingBrowserTab;
ChromeHealth: Partial<MeetingOutputLoopbackHealth> & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: ManualReason;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: SpeechBlockedReason | undefined;
speechBlockedMessage?: string;
} & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: string;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: string | undefined;
speechBlockedMessage?: string;
} & {
audioOutputActive?: boolean;
captioning?: boolean;
captionsEnabledAttempted?: boolean;
lastCaptionAt?: string;
lastCaptionSpeaker?: string;
lastCaptionText?: string;
lastOutputBytes?: number;
recentTranscript?: MeetingTranscriptLine[];
transcriptLines?: number;
} & {
cameraOff?: boolean;
lobbyWaiting?: boolean;
captionCaptureRequested?: boolean;
audioInputRouted?: boolean;
audioInputDeviceLabel?: string;
audioInputRouteError?: string;
audioOutputRouted?: boolean;
audioOutputDeviceLabel?: string;
audioOutputRouteError?: string;
audioOutputRouteRetryable?: boolean;
providerConnected?: boolean;
realtimeReady?: boolean;
audioInputActive?: boolean;
lastInputAt?: string;
lastOutputAt?: string;
lastInputBytes?: number;
bridgeClosed?: boolean;
browserUrl?: string;
browserTitle?: string;
status?: string;
notes?: string[];
} & ExtraHealth;
JoinRequest: MeetingPluginJoinRequest<Transport, Mode>;
JoinResult: MeetingPluginJoinResult<MeetingPluginSession<Transport, Mode, Partial<MeetingOutputLoopbackHealth> & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: ManualReason;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: SpeechBlockedReason | undefined;
speechBlockedMessage?: string;
} & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: string;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: string | undefined;
speechBlockedMessage?: string;
} & {
audioOutputActive?: boolean;
captioning?: boolean;
captionsEnabledAttempted?: boolean;
lastCaptionAt?: string;
lastCaptionSpeaker?: string;
lastCaptionText?: string;
lastOutputBytes?: number;
recentTranscript?: MeetingTranscriptLine[];
transcriptLines?: number;
} & {
cameraOff?: boolean;
lobbyWaiting?: boolean;
captionCaptureRequested?: boolean;
audioInputRouted?: boolean;
audioInputDeviceLabel?: string;
audioInputRouteError?: string;
audioOutputRouted?: boolean;
audioOutputDeviceLabel?: string;
audioOutputRouteError?: string;
audioOutputRouteRetryable?: boolean;
providerConnected?: boolean;
realtimeReady?: boolean;
audioInputActive?: boolean;
lastInputAt?: string;
lastOutputAt?: string;
lastInputBytes?: number;
bridgeClosed?: boolean;
browserUrl?: string;
browserTitle?: string;
status?: string;
notes?: string[];
} & ExtraHealth>>;
ProbeContext: MeetingProbeContext<Config & {
defaultMode: Mode;
}, Mode, Transport, Partial<MeetingOutputLoopbackHealth> & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: ManualReason;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: SpeechBlockedReason | undefined;
speechBlockedMessage?: string;
} & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: string;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: string | undefined;
speechBlockedMessage?: string;
} & {
audioOutputActive?: boolean;
captioning?: boolean;
captionsEnabledAttempted?: boolean;
lastCaptionAt?: string;
lastCaptionSpeaker?: string;
lastCaptionText?: string;
lastOutputBytes?: number;
recentTranscript?: MeetingTranscriptLine[];
transcriptLines?: number;
} & {
cameraOff?: boolean;
lobbyWaiting?: boolean;
captionCaptureRequested?: boolean;
audioInputRouted?: boolean;
audioInputDeviceLabel?: string;
audioInputRouteError?: string;
audioOutputRouted?: boolean;
audioOutputDeviceLabel?: string;
audioOutputRouteError?: string;
audioOutputRouteRetryable?: boolean;
providerConnected?: boolean;
realtimeReady?: boolean;
audioInputActive?: boolean;
lastInputAt?: string;
lastOutputAt?: string;
lastInputBytes?: number;
bridgeClosed?: boolean;
browserUrl?: string;
browserTitle?: string;
status?: string;
notes?: string[];
} & ExtraHealth, MeetingPluginSession<Transport, Mode, Partial<MeetingOutputLoopbackHealth> & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: ManualReason;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: SpeechBlockedReason | undefined;
speechBlockedMessage?: string;
} & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: string;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: string | undefined;
speechBlockedMessage?: string;
} & {
audioOutputActive?: boolean;
captioning?: boolean;
captionsEnabledAttempted?: boolean;
lastCaptionAt?: string;
lastCaptionSpeaker?: string;
lastCaptionText?: string;
lastOutputBytes?: number;
recentTranscript?: MeetingTranscriptLine[];
transcriptLines?: number;
} & {
cameraOff?: boolean;
lobbyWaiting?: boolean;
captionCaptureRequested?: boolean;
audioInputRouted?: boolean;
audioInputDeviceLabel?: string;
audioInputRouteError?: string;
audioOutputRouted?: boolean;
audioOutputDeviceLabel?: string;
audioOutputRouteError?: string;
audioOutputRouteRetryable?: boolean;
providerConnected?: boolean;
realtimeReady?: boolean;
audioInputActive?: boolean;
lastInputAt?: string;
lastOutputAt?: string;
lastInputBytes?: number;
bridgeClosed?: boolean;
browserUrl?: string;
browserTitle?: string;
status?: string;
notes?: string[];
} & ExtraHealth>, MeetingPluginJoinRequest<Transport, Mode>>;
Session: MeetingPluginSession<Transport, Mode, Partial<MeetingOutputLoopbackHealth> & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: ManualReason;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: SpeechBlockedReason | undefined;
speechBlockedMessage?: string;
} & {
inCall?: boolean;
micMuted?: boolean;
manualAction?: {
reason: string;
message: string;
} | undefined;
speechReady?: boolean;
speechBlockedReason?: string | undefined;
speechBlockedMessage?: string;
} & {
audioOutputActive?: boolean;
captioning?: boolean;
captionsEnabledAttempted?: boolean;
lastCaptionAt?: string;
lastCaptionSpeaker?: string;
lastCaptionText?: string;
lastOutputBytes?: number;
recentTranscript?: MeetingTranscriptLine[];
transcriptLines?: number;
} & {
cameraOff?: boolean;
lobbyWaiting?: boolean;
captionCaptureRequested?: boolean;
audioInputRouted?: boolean;
audioInputDeviceLabel?: string;
audioInputRouteError?: string;
audioOutputRouted?: boolean;
audioOutputDeviceLabel?: string;
audioOutputRouteError?: string;
audioOutputRouteRetryable?: boolean;
providerConnected?: boolean;
realtimeReady?: boolean;
audioInputActive?: boolean;
lastInputAt?: string;
lastOutputAt?: string;
lastInputBytes?: number;
bridgeClosed?: boolean;
browserUrl?: string;
browserTitle?: string;
status?: string;
notes?: string[];
} & ExtraHealth>;
TranscriptSnapshot: MeetingTranscriptSnapshot;
};
//#endregion
//#region src/meeting-bot/runtime-setup.d.ts
type MeetingSetupNodeAdapter = {
displayName: string;
nodeCommandName: string;
nodeConfigPath: string;
};
type MeetingRuntimeSetupOptions<Config extends MeetingPluginConfig$1, Mode extends string> = {
assertAudioDeviceAvailable(params: {
config: Config;
runtime: PluginRuntime;
timeoutMs: number;
}): Promise<void>;
captionsMessage(mode: Mode): string;
connectedNodeMessage(nodeLabel: string | undefined): string;
guestJoinCheck(config: Config): {
message: string;
ok: boolean;
};
missingNodeIdMessage: string;
nodeAdapter: MeetingSetupNodeAdapter;
};
declare function createMeetingRuntimeSetup<Config extends MeetingPluginConfig$1, Mode extends string>(options: MeetingRuntimeSetupOptions<Config, Mode>): (params: {
config: Config;
fullConfig: OpenClawConfig;
runtime: PluginRuntime;
options?: {
mode?: Mode;
transport?: "chrome" | "chrome-node";
};
}) => Promise<MeetingSetupStatus>;
//#endregion
//#region src/meeting-bot/browser-plugin.d.ts
type Mode = MeetingPluginConfig$1["defaultMode"];
type Transport = "chrome" | "chrome-node";
type Request = MeetingPluginJoinRequest<Transport, Mode>;
type CommonSpeechReason = "not-in-call" | "browser-unverified" | "audio-bridge-unavailable";
type BrowserHealth<ManualReason extends string, SpeechReason extends string> = MeetingPluginChromeHealth<ManualReason, SpeechReason | CommonSpeechReason> & {
meetingEnded?: boolean;
};
type RuntimeOptions<Health extends MeetingPluginChromeHealth<string, string>> = MeetingRuntimeFacadeOptions<MeetingPluginConfig$1, Transport, Mode, Health, {
setup: unknown;
listening: unknown;
speech: unknown;
}>;
type CliTimeoutOptions = {
probe: boolean;
requestedTimeoutMs?: number;
};
declare function defineBrowserMeetingPlugin<ManualReason extends string, SpeechReason extends string>(spec: {
platform: RuntimeOptions<BrowserHealth<ManualReason, SpeechReason>>["platform"];
labels: {
meeting: string;
participant: string;
brand: string;
microphone: string;
browserPage: string;
tab?: string;
};
config: Parameters<typeof createMeetingPluginConfigSchema>[0];
chromeRuntime?: ReturnType<typeof createMeetingChromeRuntimeBindings>;
InvalidRequestError: new (message: string) => Error;
toolUrlDescription: string;
transcriptSource: {
id: string;
aliases: readonly string[];
providerName: string;
};
hooks?: RuntimeOptions<BrowserHealth<ManualReason, SpeechReason>>["hooks"];
browserReadinessFailed?: (error: string) => string;
notInCallMessage?: string;
microphoneMutedReason: SpeechReason;
setup: Omit<Parameters<typeof createMeetingRuntimeSetup<MeetingPluginConfig$1, Mode>>[0], "assertAudioDeviceAvailable" | "nodeAdapter">;
shouldWaitForListening: (session: MeetingPluginSession<Transport, Mode, BrowserHealth<ManualReason, SpeechReason>>) => boolean;
defaultSpeechMessage: string;
sharePrerequisiteDeadline: boolean;
preserveTrackedBrowserOnEngineFailure: boolean;
nodePolicyDeniedCode: string;
cli: {
descriptor: Parameters<typeof createMeetingPluginShellEntry>[0]["cli"]["descriptor"];
joinDescription: string;
callGateway?: Parameters<typeof registerMeetingPluginCli>[0]["callGateway"];
resolveTimeoutMs?(operationTimeoutMs: number, options: CliTimeoutOptions): number;
};
entry?: Pick<Parameters<typeof createMeetingPluginShellEntry>[0], "normalizeRequesterSessionKey" | "normalizeToolAgentId" | "resolveToolRuntime" | "registerNodeWhen">;
}): {
plugin: {
id: string;
name: string;
description: string;
configSchema: OpenClawPluginConfigSchema & {
parse(value: unknown): MeetingPluginConfig$1;
};
register(api: OpenClawPluginApi): void;
};
config: {
configSchema: {
parse: (input: unknown) => MeetingPluginConfig$1;
uiHints: {
defaultMode: {
label: string;
help: string;
};
"chrome.audioBackend": {
label: string;
help: string;
};
"chrome.browserProfile": {
label: string;
advanced: true;
};
"chrome.guestName": {
label: string;
};
"chrome.waitForInCallMs": {
label: string;
advanced: true;
};
"chrome.audioInputCommand": {
label: string;
advanced: true;
};
"chrome.audioOutputCommand": {
label: string;
advanced: true;
};
"chromeNode.node": {
label: string;
help: string;
advanced: true;
};
"realtime.transcriptionProvider": {
label: string;
};
"realtime.voiceProvider": {
label: string;
};
"realtime.model": {
label: string;
advanced: true;
};
"realtime.instructions": {
label: string;
advanced: true;
};
"realtime.introMessage": {
label: string;
};
"realtime.agentId": {
label: string;
advanced: true;
};
"realtime.toolPolicy": {
label: string;
advanced: true;
};
};
};
defaultAudioInputCommand: string[];
defaultAudioOutputCommand: string[];
resolveConfig: (input: unknown) => MeetingPluginConfig$1;
resolveGatewayOperationTimeoutMs: (config: MeetingPluginConfig$1) => number;
};
chrome: {
assertAudioDeviceAvailable: (params: {
runtime: PluginRuntime;
config: MeetingChromeTransportConfig;
timeoutMs: number;
}) => Promise<void>;
launchInChrome: (params: MeetingChromeLaunchParams<MeetingChromeTransportConfig, "agent" | "bidi" | "transcribe">) => Promise<{
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: CommandPairAudioBridge | undefined;
browser?: BrowserHealth<ManualReason, SpeechReason> | undefined;
tab?: MeetingBrowserTab;
}>;
launchOnNode: (params: MeetingChromeLaunchParams<MeetingChromeTransportConfig, "agent" | "bidi" | "transcribe">) => Promise<{
nodeId: string;
launched: boolean;
audioBackend?: MeetingAudioBackend;
audioBridge?: NodeAudioBridge | undefined;
browser?: BrowserHealth<ManualReason, SpeechReason> | undefined;
tab?: MeetingBrowserTab;
}>;
leaveInBrowser: (params: {
runtime: PluginRuntime;
config: MeetingChromeTransportConfig;
meetingSessionId: string;
meetingUrl: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<{
left: boolean;
note: string;
}>;
readTranscript: (params: {
runtime: PluginRuntime;
config: MeetingChromeTransportConfig;
finalize?: boolean;
meetingUrl: string;
meetingSessionId: string;
nodeId?: string;
tab: MeetingBrowserTab;
}) => Promise<MeetingTranscriptSnapshot>;
recoverCurrentTab: (params: MeetingChromeRecoveryParams<MeetingChromeTransportConfig, "agent" | "bidi" | "transcribe">) => Promise<{
found: boolean;
targetId?: string;
tab?: MeetingBrowserCandidateTab;
browser?: BrowserHealth<ManualReason, SpeechReason> | undefined;
message: string;
transport: "chrome" | "chrome-node";
nodeId?: string | undefined;
}>;
};
Runtime: MeetingRuntimeFacadeConstructor<MeetingPluginConfig$1, Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>, {
setup: Awaited<ReturnType<(params: {
config: MeetingPluginConfig$1;
fullConfig: OpenClawConfig;
runtime: PluginRuntime;
options?: {
mode?: ("agent" | "bidi" | "transcribe") | undefined;
transport?: "chrome" | "chrome-node";
} | undefined;
}) => Promise<MeetingSetupStatus>>>;
listening: Awaited<ReturnType<(context: MeetingProbeContext<MeetingPluginConfig$1, "agent" | "bidi" | "transcribe", Transport, BrowserHealth<ManualReason, SpeechReason>, MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>, Request>, request: Request) => Promise<{
createdSession: boolean;
inCall: boolean | undefined;
manualAction: {
reason: string;
message: string;
} | undefined;
listenVerified: boolean;
listenTimedOut: boolean;
captioning: boolean | undefined;
captionsEnabledAttempted: boolean | undefined;
transcriptLines: number | undefined;
lastCaptionAt: string | undefined;
lastCaptionSpeaker: string | undefined;
lastCaptionText: string | undefined;
recentTranscript: MeetingTranscriptLine[] | undefined;
session: MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>;
}>>>;
speech: Awaited<ReturnType<(context: MeetingProbeContext<MeetingPluginConfig$1, "agent" | "bidi" | "transcribe", Transport, BrowserHealth<ManualReason, SpeechReason>, MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>, Request>, request: Request) => Promise<{
createdSession: boolean;
inCall: boolean | undefined;
manualAction: {
reason: string;
message: string;
} | undefined;
spoken: boolean;
speechOutputVerified: boolean;
speechOutputTimedOut: boolean;
speechReady: boolean | undefined;
speechBlockedReason: string | undefined;
speechBlockedMessage: string | undefined;
audioOutputActive: boolean | undefined;
lastOutputBytes: number | undefined;
outputLoopbackSignalBytes: number | undefined;
lastOutputLoopbackAt: string | undefined;
lastOutputLoopbackCorrelation: number | undefined;
lastOutputLoopbackRms: number | undefined;
lastOutputLoopbackPeak: number | undefined;
outputGeneration: number | undefined;
verifiedOutputGeneration: number | undefined;
session: MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>;
}>>>;
}>;
probes: {
testListening: (context: MeetingProbeContext<MeetingPluginConfig$1, "agent" | "bidi" | "transcribe", Transport, BrowserHealth<ManualReason, SpeechReason>, MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>, Request>, request: Request) => Promise<{
createdSession: boolean;
inCall: boolean | undefined;
manualAction: {
reason: string;
message: string;
} | undefined;
listenVerified: boolean;
listenTimedOut: boolean;
captioning: boolean | undefined;
captionsEnabledAttempted: boolean | undefined;
transcriptLines: number | undefined;
lastCaptionAt: string | undefined;
lastCaptionSpeaker: string | undefined;
lastCaptionText: string | undefined;
recentTranscript: MeetingTranscriptLine[] | undefined;
session: MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>;
}>;
testSpeech: (context: MeetingProbeContext<MeetingPluginConfig$1, "agent" | "bidi" | "transcribe", Transport, BrowserHealth<ManualReason, SpeechReason>, MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>, Request>, request: Request) => Promise<{
createdSession: boolean;
inCall: boolean | undefined;
manualAction: {
reason: string;
message: string;
} | undefined;
spoken: boolean;
speechOutputVerified: boolean;
speechOutputTimedOut: boolean;
speechReady: boolean | undefined;
speechBlockedReason: string | undefined;
speechBlockedMessage: string | undefined;
audioOutputActive: boolean | undefined;
lastOutputBytes: number | undefined;
outputLoopbackSignalBytes: number | undefined;
lastOutputLoopbackAt: string | undefined;
lastOutputLoopbackCorrelation: number | undefined;
lastOutputLoopbackRms: number | undefined;
lastOutputLoopbackPeak: number | undefined;
outputGeneration: number | undefined;
verifiedOutputGeneration: number | undefined;
session: MeetingPluginSession<Transport, "agent" | "bidi" | "transcribe", BrowserHealth<ManualReason, SpeechReason>>;
}>;
};
setupStatus: (params: {
config: MeetingPluginConfig$1;
fullConfig: OpenClawConfig;
runtime: PluginRuntime;
options?: {
mode?: ("agent" | "bidi" | "transcribe") | undefined;
transport?: "chrome" | "chrome-node";
} | undefined;
}) => Promise<MeetingSetupStatus>;
nodeHandler: ((paramsJSON?: string | null) => Promise<string>) & {
hasActiveWork: () => boolean;
};
createNodePolicy: (resolved: MeetingPluginConfig$1) => OpenClawPluginNodeInvokePolicy;
loadCli: () => Promise<(params: {
program: Command;
config: MeetingPluginConfig$1;
}) => void>;
resolveCliGatewayTimeoutMs: (resolved: MeetingPluginConfig$1, options: CliTimeoutOptions) => number;
};
//#endregion
//#region src/meeting-bot/node-audio-config.d.ts
type MeetingNodeAudioConfig = {
backend: MeetingAudioBackendSelection;
bufferBytes: number;
format: MeetingRealtimeAudioFormat;
inputCommand?: string[];
outputCommand?: string[];
bargeInInputCommand?: string[];
};
type MeetingNodeAudioPreparation = {
defaultAudioInputCommand: readonly string[];
defaultAudioOutputCommand: readonly string[];
defaultAudio?: {
backend?: MeetingAudioBackendSelection;
bufferBytes: number;
format: MeetingRealtimeAudioFormat;
};
assertAudioAvailable(timeoutMs: number): void | Promise<void>;
prepareAudio?(config: MeetingNodeAudioConfig, timeoutMs: number): Promise<MeetingAudioRuntime>;
};
//#endregion
//#region src/meeting-bot/node-host.d.ts
type MeetingNodeHostOptions = MeetingNodeAudioPreparation & {
commandName: string;
displayName: string;
browserLabel: string;
bridgeIdPrefix: string;
talkBackModes: ReadonlySet<string>;
agentMode: string;
normalizeUrl(input: unknown): string;
normalizeMeetingKey(url?: string): string | undefined;
browser: {
application: string;
buildProfileArgs(profile: string): string[];
openedStatus: string;
openedNotes: string[];
};
};
export declare function createMeetingNodeHost(options: MeetingNodeHostOptions): {
handleCommand: (paramsJSON?: string | null) => Promise<string>;
hasActiveWork: () => boolean;
};
//#endregion
//#region src/meeting-bot/configured-node-host.d.ts
type MeetingConfiguredNodeHostOptions = Omit<MeetingNodeHostOptions, "assertAudioAvailable" | "prepareAudio"> & {
meetingLabel: string;
sharePrerequisiteDeadline: boolean;
};
declare function createMeetingConfiguredNodeHost(options: MeetingConfiguredNodeHostOptions): ((paramsJSON?: string | null) => Promise<string>) & {
hasActiveWork: () => boolean;
};
//#endregion
//#region src/meeting-bot/meeting-modes.d.ts
declare function isMeetingTalkBackMode(mode: string): boolean;
declare function isMeetingRealtimeRouteReady(mode: string, health: (MeetingBrowserHealth & {
audioInputRouted?: boolean;
audioOutputRouted?: boolean;
}) | undefined): boolean;
//#endregion
//#region src/meeting-bot/status-call-source.d.ts
type MeetingStatusCallSourceOptions = {
captionEnableSource: string;
captionSettleMs?: number;
platform: {
audioOutputElementIdPrefix: string;
displayName: string;
globals: {
audioOutputs: string;
captions: string;
meeting: string;
};
manualActionReasonPrefix: string;
};
extraResultSource?: string;
/** In-page boolean expression that revalidates call ownership after media-routing awaits. */
liveOwnershipSource?: string;
/** In-page statements run once audio routing settles, before captions and the status result. */
afterAudioRoutingSource?: string;
transcriptMaxLines?: number;
};
declare function createMeetingStatusCallSource(options: MeetingStatusCallSourceOptions): string;
//#endregion
//#region src/meeting-bot/status-prejoin-fragments.d.ts
declare function createMeetingStatusPreludeFragments({ guestName, displayName, manualActionReasonPrefix }: {
guestName: string;
displayName: string;
manualActionReasonPrefix: string;
}): {
guestName: (replaceExisting: boolean) => string;
preservedIdentity: string;
virtualAudioInput: ({ beforeEnumerationSource, selectionSource, afterSelectionSource }: {
beforeEnumerationSource?: string;
selectionSource: string;
afterSelectionSource?: string;
}) => string;
prejoinMicrophone: ({ unroutedSource, afterRoutedSource, muteInCall }: {
unroutedSource: string;
afterRoutedSource?: string;
muteInCall: boolean;
}) => string;
inCallMicrophone: string;
manualActions: ({ loginDisplayName, inCallControls }: {
loginDisplayName?: string;
inCallControls: boolean;
}) => string;
};
//#endregion
//#region src/meeting-bot/status-prejoin-source.d.ts
type MeetingStatusPreludeParams$1 = {
allowMicrophone: boolean;
allowSessionAdoption: boolean;
autoJoin: boolean;
captureCaptions: boolean;
expectedIdentity?: string;
guestName: string;
meetingSessionId?: string;
pageIdentitySource: string;
readOnly?: boolean;
selectors: string;
toggleStateFunction: string;
waitForInCallMs: number;
};
type MeetingStatusPreludeFragment = string | ((sources: ReturnType<typeof createMeetingStatusPreludeFragments>) => string);
type MeetingStatusPreludeSourceOptions = {
controlLookupSource: string;
lifecycleSource: MeetingStatusPreludeFragment;
manualActionSource: MeetingStatusPreludeFragment;
platform: {
displayName: string;
globals: {
audioOutputs: string;
captionArchive: string;
captions: string;
meeting: string;
};
manualActionReasonPrefix: string;
};
setupSource?: string;
transcriptMaxLines?: number;
};
declare function createMeetingStatusPreludeSource(params: MeetingStatusPreludeParams$1, options: MeetingStatusPreludeSourceOptions): string;
//#endregion
//#region src/meeting-bot/page-script-source.d.ts
type MeetingPageScriptGlobals = {
audioOutputs: string;
captionArchive: string;
captions: string;
meeting: string;
};
type MeetingPageIdentity = {
expectedIdentity?: string;
pageIdentitySource: string;
};
type MeetingStatusPreludeParams = Parameters<typeof createMeetingStatusPreludeSource>[0];
type MeetingPageStatusParams = Omit<MeetingStatusPreludeParams, keyof MeetingPageIdentity | "selectors" | "toggleStateFunction"> & {
meetingUrl: string;
};
type MeetingPageLeaveParams = {
leaveInitiated: boolean;
meetingSessionId: string;
meetingUrl: string;
};
declare function createMeetingPageScripts(options: {
platform: Parameters<typeof createMeetingStatusPreludeSource>[1]["platform"] & Parameters<typeof createMeetingStatusCallSource>[0]["platform"];
normalizeUrl(meetingUrl: string): string | undefined;
pageIdentitySource(expectedIdentity?: string): string;
selectors: Readonly<Record<string, string | readonly string[]>>;
toggleStateFunction(): string;
statusPrelude: Omit<Parameters<typeof createMeetingStatusPreludeSource>[1], "platform">;
statusCall: Omit<Parameters<typeof createMeetingStatusCallSource>[0], "platform">;
audioOwnershipSource?(identity: MeetingPageIdentity): string;
leave: Pick<Parameters<typeof createMeetingLeaveSource>[0], "controlSource" | "departedMarkerSource" | "documentSetupSource" | "meetingStateSource" | "sessionMatchSource">;
}): {
audioCapture: (params: MeetingBrowserAudioCaptureRequest) => string;
status: (params: MeetingPageStatusParams) => string;
transcript: (meetingUrl: string, meetingSessionId: string, finalize: boolean) => string;
leave: (params: MeetingPageLeaveParams) => string;
};
declare function createMeetingLeaveSource(params: {
controlSource: string;
departedMarkerSource: string;
documentSetupSource?: string;
expectedIdentity?: string;
leaveInitiated: boolean;
meetingSessionId: string;
meetingStateSource?: string;
pageIdentitySource: string;
platform: {
displayName: string;
globals: Pick<MeetingPageScriptGlobals, "audioOutputs" | "meeting">;
};
selectors: string;
sessionMatchSource: string;
}): string;
//#endregion
//#region src/meeting-bot/runtime-facade.d.ts
declare function createMeetingRuntimeFacade<Config extends MeetingPluginConfig$1 & {
defaultMode: Mode;
}, Transport extends "chrome" | "chrome-node", Mode extends string, Health extends MeetingPluginChromeHealth<string, string>, Results extends MeetingRuntimeProbeResults>(options: MeetingRuntimeFacadeOptions<Config, Transport, Mode, Health, Results>): MeetingRuntimeFacadeConstructor<Config, Transport, Mode, Health, Results>;
//#endregion
//#region src/meeting-bot/platform-adapter.d.ts
export interface MeetingPlatformAdapter<Session, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot, CreateParams = never, CreateResult = never, DialInParams = never, DialInPlan = never> extends MeetingPlatformAdapter$1<Session, Mode, Health, Transcript, CreateParams, CreateResult, DialInParams, DialInPlan> {}
declare function createMeetingPlatformAdapter<Session, Mode extends string, Health extends MeetingBrowserHealth, Transcript extends MeetingTranscriptSnapshot, CreateParams = never, CreateResult = never, DialInParams = never, DialInPlan = never>(options: MeetingPlatformAdapterOptions<Session, Mode, Health, Transcript, CreateParams, CreateResult, DialInParams, DialInPlan>): MeetingPlatformAdapter<Session, Mode, Health, Transcript, CreateParams, CreateResult, DialInParams, DialInPlan> & MeetingPlatformRuntimeMetadata;
export declare const MeetingPlatformAdapter: {
create: typeof createMeetingPlatformAdapter;
createBrowserAdapterOptions: typeof createMeetingBrowserAdapterOptions;
createPageScripts: typeof createMeetingPageScripts;
defineBrowserMeetingPlugin: typeof defineBrowserMeetingPlugin;
createChromeTransport: typeof createMeetingChromeTransport;
createChromeTransportWithExternalAudio: typeof createMeetingChromeTransportWithExternalAudio;
createChromeRuntimeBindings: typeof createMeetingChromeRuntimeBindings;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createPluginChromeTransport: typeof createMeetingPluginChromeTransport;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createPluginConfigSchema: typeof createMeetingPluginConfigSchema;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createPluginNodeHostHandler: typeof createMeetingPluginNodeHostHandler;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createPluginNodeInvokePolicy: typeof createMeetingPluginNodeInvokePolicy;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createPluginShellEntry: typeof createMeetingPluginShellEntry;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createRuntimeFacade: typeof createMeetingRuntimeFacade;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
createRuntimeSetup: typeof createMeetingRuntimeSetup;
pluginTypes: typeof createMeetingPluginTypes;
/** @deprecated Use defineBrowserMeetingPlugin for browser meeting plugins. */
registerPluginCli: typeof registerMeetingPluginCli;
resolveProbeTimeoutMs: typeof resolveMeetingProbeTimeoutMs;
createRuntimeProbes: typeof createMeetingRuntimeProbes;
createNodeHostHandler: typeof createMeetingConfiguredNodeHost;
createPluginEntry: typeof createMeetingPluginEntryOptions;
createStatusCallSource: typeof createMeetingStatusCallSource;
createStatusPreludeSource: typeof createMeetingStatusPreludeSource;
isRealtimeRouteReady: typeof isMeetingRealtimeRouteReady;
isTalkBackMode: typeof isMeetingTalkBackMode;
ensureAudioBackend: typeof ensureMeetingAudioBackend;
resolveAudioRuntimeForFormat: typeof resolveMeetingAudioRuntimeForFormat;
};
//#endregion
//#region src/meeting-bot/voice-call-gateway.d.ts
type MeetingVoiceCallGatewayClient = {
request(method: string, params: Record<string, unknown>, options: {
timeoutMs: number;
}): Promise<unknown>;
stopAndWait(options: {
timeoutMs: number;
}): Promise<void>;
};
type MeetingVoiceCallGateway = {
trustedPluginIdentity: boolean;
request: <T>(method: string, params: Record<string, unknown>) => Promise<T>;
};
type MeetingVoiceCallConfig = {
gatewayUrl?: string;
token?: string;
requestTimeoutMs: number;
postDtmfSpeechDelayMs: number;
};
type MeetingVoiceCallSurface = {
clientDisplayName: string;
configPath: string;
logScope: string;
meetingLabel: string;
providerLabel: string;
};
type MeetingVoiceCallStatusResult = {
found?: boolean;
call?: unknown;
};
type MeetingVoiceCallJoinResult = {
callId: string;
dtmfSent: boolean;
introSent: boolean;
};
export declare function createMeetingVoiceCallGateway(params: {
config: MeetingVoiceCallConfig;
runtime: PluginRuntime;
surface: MeetingVoiceCallSurface;
connectClient: (params: {
config: MeetingVoiceCallConfig;
surface: MeetingVoiceCallSurface;
}) => Promise<MeetingVoiceCallGatewayClient>;
}): MeetingVoiceCallGateway;
export declare function isMeetingVoiceCallMissingError(error: unknown): boolean;
export declare function joinMeetingViaVoiceCallGateway(params: {
config: MeetingVoiceCallConfig;
gateway: MeetingVoiceCallGateway;
surface: MeetingVoiceCallSurface;
dialInNumber: string;
dtmfSequence?: string;
logger?: RuntimeLogger;
message?: string;
requesterSessionKey?: string;
agentId?: string;
sessionKey?: string;
}): Promise<MeetingVoiceCallJoinResult>;
export declare function endMeetingVoiceCallGatewayCall(params: {
gateway: MeetingVoiceCallGateway;
callId: string;
}): Promise<void>;
export declare function getMeetingVoiceCallGatewayCall(params: {
gateway: MeetingVoiceCallGateway;
callId: string;
}): Promise<MeetingVoiceCallStatusResult>;
export declare function speakMeetingViaVoiceCallGateway(params: {
gateway: MeetingVoiceCallGateway;
callId: string;
message: string;
}): Promise<void>;
//#endregion
//#region src/meeting-bot/sox-audio-command.d.ts
type MeetingSoxAudioFormat = {
sampleRate: number;
channels: number;
encoding: string;
bits: number;
endian?: "little" | "big";
};
type MeetingSoxAudioCommandParams = {
bufferBytes: number;
device?: string;
deviceType?: string;
format: MeetingSoxAudioFormat;
inputExecutable?: string;
outputExecutable?: string;
};
export declare function buildMeetingSoxAudioCommands(params: MeetingSoxAudioCommandParams): {
inputCommand: string[];
outputCommand: string[];
};
//#endregion
//#region src/meeting-bot/participation-browser.d.ts
export declare function runMeetingParticipationWithBrowser(params: {
callBrowser: MeetingBrowserRequestCaller;
adapter: MeetingBrowserParticipationAdapter;
meetingSessionId: string;
meetingUrl: string;
isSameMeetingUrl: (actual: string | undefined, expected: string) => boolean;
targetId: string;
requestId: string;
action: MeetingParticipationAction;
assertCurrent: () => void;
timeoutMs: number;
}): Promise<MeetingParticipationEffectResult>;
//#endregion
export type { MeetingAgentConsultParams, MeetingBrowserCandidateTab, MeetingBrowserControllerConfig, MeetingBrowserHealth, MeetingBrowserJoinSession, MeetingBrowserLeaveStep, MeetingBrowserNodeInfo, MeetingBrowserNodePolicyOptions, MeetingBrowserNodeStartConfig, MeetingBrowserParticipationAdapter, MeetingBrowserPermissionPlan, MeetingBrowserRequestCaller, MeetingBrowserRequestParams, MeetingBrowserSessionView, MeetingBrowserStatusScriptParams, MeetingBrowserTab, MeetingManualAction, MeetingManualActionCategory, MeetingNodeHostOptions, MeetingParticipationAttempt, MeetingParticipationRequest, MeetingParticipationSource, MeetingRealtimeAudioEngineHandle, MeetingRealtimeAudioEngineHealth, MeetingRealtimeAudioFormat, MeetingRealtimeAudioTransport, MeetingRealtimeAudioTransportHealth, MeetingRealtimeEngineConfig, MeetingRealtimeSessionBlock, MeetingRealtimeToolCallParams, MeetingRuntimePlatform, MeetingSessionLeaveResult, MeetingSessionRecord, MeetingSessionRuntimeHandles, MeetingSessionRuntimeJoinContext, MeetingSessionRuntimeMessages, MeetingSessionRuntimeOptions, MeetingSessionState, MeetingSetupCheck, MeetingSetupStatus, MeetingSoxAudioCommandParams, MeetingSoxAudioFormat, MeetingTranscriptLine, MeetingTranscriptSnapshot, MeetingVoiceCallConfig, MeetingVoiceCallGateway, MeetingVoiceCallGatewayClient, MeetingVoiceCallJoinResult, MeetingVoiceCallStatusResult, MeetingVoiceCallSurface };