From 396db1f9517944ff91718ca41ac05dc6b189497d Mon Sep 17 00:00:00 2001 From: roertbb Date: Sun, 6 Jul 2025 19:02:44 +0200 Subject: [PATCH 1/3] google stt plugin --- plugins/google/CHANGELOG.md | 1 + plugins/google/README.md | 12 + plugins/google/api-extractor.json | 20 + plugins/google/package.json | 52 +++ plugins/google/src/index.ts | 1 + plugins/google/src/models.ts | 84 ++++ plugins/google/src/stt.test.ts | 10 + plugins/google/src/stt.ts | 548 ++++++++++++++++++++++++ plugins/google/tsconfig.json | 16 + plugins/google/tsup.config.ts | 6 + pnpm-lock.yaml | 669 +++++++++++++++++++++++++++++- turbo.json | 4 +- 12 files changed, 1411 insertions(+), 12 deletions(-) create mode 100644 plugins/google/CHANGELOG.md create mode 100644 plugins/google/README.md create mode 100644 plugins/google/api-extractor.json create mode 100644 plugins/google/package.json create mode 100644 plugins/google/src/index.ts create mode 100644 plugins/google/src/models.ts create mode 100644 plugins/google/src/stt.test.ts create mode 100644 plugins/google/src/stt.ts create mode 100644 plugins/google/tsconfig.json create mode 100644 plugins/google/tsup.config.ts diff --git a/plugins/google/CHANGELOG.md b/plugins/google/CHANGELOG.md new file mode 100644 index 00000000..5cdbfef8 --- /dev/null +++ b/plugins/google/CHANGELOG.md @@ -0,0 +1 @@ +# @livekit/agents-plugin-google \ No newline at end of file diff --git a/plugins/google/README.md b/plugins/google/README.md new file mode 100644 index 00000000..02daed6d --- /dev/null +++ b/plugins/google/README.md @@ -0,0 +1,12 @@ +# Google plugin for LiveKit Agents + +The Agents Framework is designed for building realtime, programmable +participants that run on servers. Use it to create conversational, multi-modal +voice agents that can see, hear, and understand. + +This package contains the Google plugin, which allows for speech recognition. +Refer to the [documentation](https://docs.livekit.io/agents/overview/) for +information on how to use it, or browse the [API +reference](https://docs.livekit.io/agents-js/modules/plugins_agents_plugin_google.html). +See the [repository](https://github.com/livekit/agents-js) for more information +about the framework as a whole. diff --git a/plugins/google/api-extractor.json b/plugins/google/api-extractor.json new file mode 100644 index 00000000..1f75e070 --- /dev/null +++ b/plugins/google/api-extractor.json @@ -0,0 +1,20 @@ +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + "extends": "../../api-extractor-shared.json", + "mainEntryPointFilePath": "./dist/index.d.ts" +} diff --git a/plugins/google/package.json b/plugins/google/package.json new file mode 100644 index 00000000..863db89a --- /dev/null +++ b/plugins/google/package.json @@ -0,0 +1,52 @@ +{ + "name": "@livekit/agents-plugin-google", + "version": "0.1.0", + "description": "Google plugin for LiveKit Agents for Node.js", + "main": "dist/index.js", + "require": "dist/index.cjs", + "types": "dist/index.d.ts", + "exports": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "author": "LiveKit", + "type": "module", + "repository": "git@github.com:livekit/agents-js.git", + "license": "Apache-2.0", + "files": [ + "dist", + "src", + "README.md" + ], + "scripts": { + "build": "tsup --onSuccess \"pnpm build:types\"", + "build:types": "tsc --declaration --emitDeclarationOnly && node ../../scripts/copyDeclarationOutput.js", + "clean": "rm -rf dist", + "clean:build": "pnpm clean && pnpm build", + "lint": "eslint -f unix \"src/**/*.{ts,js}\"", + "api:check": "api-extractor run --typescript-compiler-folder ../../node_modules/typescript", + "api:update": "api-extractor run --local --typescript-compiler-folder ../../node_modules/typescript --verbose" + }, + "devDependencies": { + "@livekit/agents": "workspace:^x", + "@livekit/agents-plugin-silero": "workspace:^x", + "@livekit/agents-plugins-test": "workspace:^x", + "@livekit/rtc-node": "^0.13.11", + "@microsoft/api-extractor": "^7.35.0", + "tsup": "^8.3.5", + "typescript": "^5.0.0" + }, + "dependencies": { + "@google-cloud/speech": "^7.1.0" + }, + "peerDependencies": { + "@livekit/agents": "workspace:^x", + "@livekit/rtc-node": "^0.13.11" + } +} diff --git a/plugins/google/src/index.ts b/plugins/google/src/index.ts new file mode 100644 index 00000000..ad49ed16 --- /dev/null +++ b/plugins/google/src/index.ts @@ -0,0 +1 @@ +export * from './stt.js'; diff --git a/plugins/google/src/models.ts b/plugins/google/src/models.ts new file mode 100644 index 00000000..88fa9205 --- /dev/null +++ b/plugins/google/src/models.ts @@ -0,0 +1,84 @@ +export enum AudioEncoding { + AUDIO_ENCODING_UNSPECIFIED = 'AUDIO_ENCODING_UNSPECIFIED', + LINEAR16 = 'LINEAR16', + MULAW = 'MULAW', + ALAW = 'ALAW', + AMR = 'AMR', + AMR_WB = 'AMR_WB', + FLAC = 'FLAC', + MP3 = 'MP3', + OGG_OPUS = 'OGG_OPUS', + WEBM_OPUS = 'WEBM_OPUS', + MP4_AAC = 'MP4_AAC', + M4A_AAC = 'M4A_AAC', + MOV_AAC = 'MOV_AAC', +} + +export enum SpeechEventType { + SPEECH_EVENT_TYPE_UNSPECIFIED = 'SPEECH_EVENT_TYPE_UNSPECIFIED', + END_OF_SINGLE_UTTERANCE = 'END_OF_SINGLE_UTTERANCE', + SPEECH_ACTIVITY_BEGIN = 'SPEECH_ACTIVITY_BEGIN', + SPEECH_ACTIVITY_END = 'SPEECH_ACTIVITY_END', +} + +// Google Cloud Speech-to-Text API types +export interface GoogleCredentials { + type: string; + project_id: string; + private_key_id: string; + private_key: string; + client_email: string; + client_id: string; + auth_uri: string; + token_uri: string; + auth_provider_x509_cert_url: string; + client_x509_cert_url: string; +} + +export type SpeechLanguages = + | 'en-US' + | 'en-GB' + | 'en-AU' + | 'en-CA' + | 'pl-PL' + | 'de-DE' + | 'fr-FR' + | 'es-ES' + | 'it-IT' + | 'pt-BR' + | 'ru-RU' + | 'ja-JP' + | 'ko-KR' + | 'zh-CN' + | 'zh-TW' + | 'ar-SA' + | 'hi-IN' + | 'th-TH' + | 'vi-VN' + | 'tr-TR'; + +export type SpeechModels = + | 'latest_long' + | 'latest_short' + | 'latest_medium' + | 'command_and_search' + | 'phone_call' + | 'video' + | 'default' + | 'medical_conversation' + | 'medical_dictation' + | 'medical_question_and_answer' + | 'medical_report' + | 'medical_symptom' + | 'medical_test' + | 'medical_treatment' + | 'medical_emergency' + | 'medical_consultation' + | 'medical_instruction' + | 'medical_procedure' + | 'medical_medication' + | 'medical_diagnosis' + | 'medical_condition'; + +export type LanguageType = SpeechLanguages | string; +export type LanguageCode = LanguageType | LanguageType[]; diff --git a/plugins/google/src/stt.test.ts b/plugins/google/src/stt.test.ts new file mode 100644 index 00000000..3815284d --- /dev/null +++ b/plugins/google/src/stt.test.ts @@ -0,0 +1,10 @@ +import { initializeLogger } from '@livekit/agents'; +import { VAD } from '@livekit/agents-plugin-silero'; +import { stt } from '@livekit/agents-plugins-test'; +import { describe } from 'vitest'; +import { STT } from './stt.js'; + +describe('Google', async () => { + initializeLogger({ pretty: false }); + await stt(new STT(), await VAD.load(), { nonStreaming: false }); +}); diff --git a/plugins/google/src/stt.ts b/plugins/google/src/stt.ts new file mode 100644 index 00000000..ba107255 --- /dev/null +++ b/plugins/google/src/stt.ts @@ -0,0 +1,548 @@ +import { v2 } from '@google-cloud/speech'; +import type * as protos from '@google-cloud/speech/build/protos/protos.js'; +import { type AudioBuffer, AudioByteStream, AudioEnergyFilter, log, stt } from '@livekit/agents'; +import { AudioFrame } from '@livekit/rtc-node'; +import { + type GoogleCredentials, + type LanguageCode, + type LanguageType, + SpeechEventType, + type SpeechModels, +} from './models.js'; + +type StreamingRecognizerInitialConfigRequest = { + recognizer: string; + streamingConfig: protos.google.cloud.speech.v2.IStreamingRecognitionConfig; +}; + +// Google STT has a timeout of 5 mins, we'll attempt to restart the session before that timeout is reached +const MAX_SESSION_DURATION = 240; + +// Google is very sensitive to background noise, so we'll ignore results with low confidence +const DEFAULT_MIN_CONFIDENCE = 0.65; + +export interface STTOptions { + languages?: LanguageCode; + detectLanguage?: boolean; + interimResults?: boolean; + punctuate?: boolean; + spokenPunctuation?: boolean; + model?: SpeechModels | string; + location?: string; + sampleRate: number; + minConfidenceThreshold: number; + credentialsInfo?: GoogleCredentials; + credentialsFile?: string; + keywords?: Array<[string, number]>; + useStreaming?: boolean; +} + +const defaultSTTOptions: STTOptions = { + languages: 'en-US', + detectLanguage: true, + interimResults: true, + punctuate: true, + spokenPunctuation: false, + model: 'latest_long', + location: 'global', + sampleRate: 16000, + minConfidenceThreshold: DEFAULT_MIN_CONFIDENCE, + useStreaming: true, +}; + +export interface InternalSTTOptions { + languages: LanguageType[]; + detectLanguage: boolean; + interimResults: boolean; + punctuate: boolean; + spokenPunctuation: boolean; + model: SpeechModels | string; + sampleRate: number; + minConfidenceThreshold: number; + keywords?: Array<[string, number]>; +} + +export class STT extends stt.STT { + #opts: STTOptions; + #config: InternalSTTOptions; + #location: string; + #credentialsInfo?: GoogleCredentials; + #credentialsFile?: string; + #logger = log(); + #streams = new Set(); + #pool: ConnectionPool; + label = 'google.STT'; + + constructor(opts: Partial = {}) { + super({ + streaming: opts.useStreaming ?? defaultSTTOptions.useStreaming!, + interimResults: opts.interimResults ?? defaultSTTOptions.interimResults!, + }); + + this.#opts = { ...defaultSTTOptions, ...opts }; + this.#location = this.#opts.location!; + this.#credentialsInfo = this.#opts.credentialsInfo; + this.#credentialsFile = this.#opts.credentialsFile; + + // Validate credentials + if (!this.#credentialsFile && !this.#credentialsInfo) { + // Check for Application Default Credentials + if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) { + throw new Error( + 'Google Cloud credentials must be provided, either by using credentialsInfo, ' + + 'credentialsFile, or setting GOOGLE_APPLICATION_CREDENTIALS environment variable.', + ); + } + } + + const languages = Array.isArray(this.#opts.languages) + ? this.#opts.languages + : [this.#opts.languages!]; + + this.#config = { + languages, + detectLanguage: this.#opts.detectLanguage!, + interimResults: this.#opts.interimResults!, + punctuate: this.#opts.punctuate!, + spokenPunctuation: this.#opts.spokenPunctuation!, + model: this.#opts.model!, + sampleRate: this.#opts.sampleRate!, + minConfidenceThreshold: this.#opts.minConfidenceThreshold!, + keywords: this.#opts.keywords, + }; + + this.#pool = new ConnectionPool( + MAX_SESSION_DURATION, + this.createClient.bind(this), + ); + } + + private async createClient(): Promise { + let client: v2.SpeechClient; + + const clientOptions = { + ...(this.#location !== 'global' && { + apiEndpoint: `${this.#location}-speech.googleapis.com`, + }), + }; + if (this.#credentialsInfo) { + client = new v2.SpeechClient({ + ...clientOptions, + credentials: this.#credentialsInfo, + }); + } else if (this.#credentialsFile) { + client = new v2.SpeechClient({ + ...clientOptions, + keyFilename: this.#credentialsFile, + }); + } else { + client = new v2.SpeechClient(clientOptions); + } + + return client; + } + + private getRecognizer(client: v2.SpeechClient): string { + // Get project ID from credentials or environment + let projectId: string; + + if (this.#credentialsInfo?.project_id) { + projectId = this.#credentialsInfo.project_id; + } else if (process.env.GOOGLE_CLOUD_PROJECT) { + projectId = process.env.GOOGLE_CLOUD_PROJECT; + } else { + // Try to get from client auth + try { + projectId = (client as any).authClient?.projectId; + } catch { + throw new Error( + 'Project ID is required. Please set GOOGLE_CLOUD_PROJECT environment variable or provide credentials with project_id field.', + ); + } + } + + if (!projectId) { + throw new Error( + 'Project ID is required. Please set GOOGLE_CLOUD_PROJECT environment variable or provide credentials with project_id field.', + ); + } + + // For Google Speech-to-Text v2, we can use the default recognizer + return `projects/${projectId}/locations/${this.#location}/recognizers/_`; + } + + private sanitizeOptions(language?: string): InternalSTTOptions { + const config = { ...this.#config }; + + if (language) { + config.languages = [language]; + } + + if (!Array.isArray(config.languages)) { + config.languages = [config.languages]; + } else if (!config.detectLanguage && config.languages.length > 1) { + this.#logger.warn('Multiple languages provided, but language detection is disabled'); + config.languages = [config.languages[0]]; + } + + return config; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async _recognize(_buffer: AudioBuffer): Promise { + throw new Error('Recognize is not supported on Google STT'); + } + + stream(): stt.SpeechStream { + const config = this.sanitizeOptions(); + const stream = new SpeechStream(this, this.#pool, this.getRecognizer.bind(this), config); + this.#streams.add(stream); + return stream; + } + + updateOptions(options: Partial): void { + if (options.languages !== undefined) { + const languages = Array.isArray(options.languages) ? options.languages : [options.languages]; + this.#config.languages = languages; + } + if (options.detectLanguage !== undefined) { + this.#config.detectLanguage = options.detectLanguage; + } + if (options.interimResults !== undefined) { + this.#config.interimResults = options.interimResults; + } + if (options.punctuate !== undefined) { + this.#config.punctuate = options.punctuate; + } + if (options.spokenPunctuation !== undefined) { + this.#config.spokenPunctuation = options.spokenPunctuation; + } + if (options.model !== undefined) { + this.#config.model = options.model; + } + if (options.location !== undefined) { + this.#location = options.location; + // if location is changed, fetch a new client and recognizer as per the new location + this.#pool.invalidate(); + } + if (options.keywords !== undefined) { + this.#config.keywords = options.keywords; + } + + for (const stream of this.#streams) { + stream.updateOptions(options); + } + } + + async aclose(): Promise { + await this.#pool.aclose(); + } +} + +class ConnectionPool { + private maxSessionDuration: number; + private createClient: () => Promise; + private client?: T; + private createdAt?: number; + + constructor(maxSessionDuration: number, createClient: () => Promise) { + this.maxSessionDuration = maxSessionDuration; + this.createClient = createClient; + } + + async connection(): Promise { + const now = Date.now(); + + if (!this.client || !this.createdAt || now - this.createdAt > this.maxSessionDuration * 1000) { + this.client = await this.createClient(); + this.createdAt = now; + } + + return this.client; + } + + invalidate(): void { + this.client = undefined; + this.createdAt = undefined; + } + + async aclose(): Promise { + this.client = undefined; + this.createdAt = undefined; + } +} + +export class SpeechStream extends stt.SpeechStream { + #opts: InternalSTTOptions; + #audioEnergyFilter: AudioEnergyFilter; + #logger = log(); + #speaking = false; + #pool: ConnectionPool; + #getRecognizer: (client: v2.SpeechClient) => string; + #config: InternalSTTOptions; + #reconnectEvent = new EventTarget(); + #sessionConnectedAt = 0; + label = 'google.SpeechStream'; + + constructor( + stt: STT, + pool: ConnectionPool, + getRecognizer: (client: v2.SpeechClient) => string, + config: InternalSTTOptions, + ) { + super(stt); + this.#opts = config; + this.#pool = pool; + this.#getRecognizer = getRecognizer; + this.#config = config; + this.closed = false; + this.#audioEnergyFilter = new AudioEnergyFilter(); + + this.#run(); + } + + updateOptions(options: Partial): void { + if (options.languages !== undefined) { + const languages = Array.isArray(options.languages) ? options.languages : [options.languages]; + this.#config.languages = languages; + } + if (options.detectLanguage !== undefined) { + this.#config.detectLanguage = options.detectLanguage; + } + if (options.interimResults !== undefined) { + this.#config.interimResults = options.interimResults; + } + if (options.punctuate !== undefined) { + this.#config.punctuate = options.punctuate; + } + if (options.spokenPunctuation !== undefined) { + this.#config.spokenPunctuation = options.spokenPunctuation; + } + if (options.model !== undefined) { + this.#config.model = options.model; + } + if (options.minConfidenceThreshold !== undefined) { + this.#config.minConfidenceThreshold = options.minConfidenceThreshold; + } + if (options.keywords !== undefined) { + this.#config.keywords = options.keywords; + } + + this.#reconnectEvent.dispatchEvent(new Event('reconnect')); + } + + async #run(maxRetry = 32) { + let retries = 0; + + while (!this.input.closed) { + try { + const client = await this.#pool.connection(); + this.#sessionConnectedAt = Date.now(); + + const recognizer = this.#getRecognizer(client); + + // Create streaming recognize request + const request: StreamingRecognizerInitialConfigRequest = { + recognizer, + streamingConfig: { + config: { + explicitDecodingConfig: { + encoding: AudioEncoding.LINEAR16, + sampleRateHertz: this.#config.sampleRate, + audioChannelCount: 1, + }, + adaptation: this.buildAdaptation(), + languageCodes: this.#config.languages as string[], + model: this.#config.model, + features: { + enableAutomaticPunctuation: this.#config.punctuate, + enableWordTimeOffsets: true, + enableSpokenPunctuation: this.#config.spokenPunctuation, + }, + }, + streamingFeatures: { + interimResults: this.#config.interimResults, + enableVoiceActivityEvents: true, + }, + }, + }; + + const stream = client._streamingRecognize(); + + // Send initial config + stream.write(request); + + await this.#runStream(stream); + } catch (e) { + if (retries >= maxRetry) { + throw new Error(`Failed to connect to Google STT after ${retries} attempts: ${e}`); + } + + const delay = Math.min(retries * 5, 10); + retries++; + + this.#logger.warn( + `Failed to connect to Google STT, retrying in ${delay} seconds: ${e} (${retries}/${maxRetry})`, + ); + await new Promise((resolve) => setTimeout(resolve, delay * 1000)); + } + } + + this.closed = true; + } + + private buildAdaptation(): protos.google.cloud.speech.v2.ISpeechAdaptation | undefined { + if (this.#config.keywords && this.#config.keywords.length > 0) { + return { + phraseSets: [ + { + inlinePhraseSet: { + phrases: this.#config.keywords.map(([keyword, boost]) => ({ + value: keyword, + boost, + })), + }, + }, + ], + }; + } + return undefined; + } + + async #runStream(stream: any) { + let hasStarted = false; + + const emptyAudioChunk = AudioFrame.create(16000, 1, 160); + + // keepalive - to prevent from timeouts from Google STT when no audio is sent during agent responses + const keepalive = setInterval(() => { + try { + if (!hasStarted) { + this.#logger.debug('Google STT stream - sent keepalive'); + stream.write({ audio: Buffer.from(emptyAudioChunk.data.buffer) }); + } + } catch { + clearInterval(keepalive); + return; + } + }, 5000); + + // Handle incoming responses + stream.on('data', (response: protos.google.cloud.speech.v2.StreamingRecognizeResponse) => { + if (response.speechEventType === SpeechEventType.SPEECH_ACTIVITY_BEGIN) { + this.queue.put({ type: stt.SpeechEventType.START_OF_SPEECH }); + hasStarted = true; + } + + if (response.speechEventType === SpeechEventType.SPEECH_EVENT_TYPE_UNSPECIFIED) { + const result = response.results?.[0]; + if (!result) return; + + const speechData = this.#streamingRecognizeResponseToSpeechData(response); + if (!speechData) return; + + if (!result.isFinal) { + this.queue.put({ + type: stt.SpeechEventType.INTERIM_TRANSCRIPT, + alternatives: [speechData], + }); + } else { + this.queue.put({ + type: stt.SpeechEventType.FINAL_TRANSCRIPT, + alternatives: [speechData], + }); + + // Check if we need to reconnect due to session duration + if (Date.now() - this.#sessionConnectedAt > MAX_SESSION_DURATION * 1000) { + this.#logger.debug('Google STT maximum connection time reached. Reconnecting...'); + this.#pool.invalidate(); + if (hasStarted) { + this.queue.put({ type: stt.SpeechEventType.END_OF_SPEECH }); + hasStarted = false; + } + this.#reconnectEvent.dispatchEvent(new Event('reconnect')); + return; + } + } + } + + if (response.speechEventType === SpeechEventType.SPEECH_ACTIVITY_END) { + this.queue.put({ type: stt.SpeechEventType.END_OF_SPEECH }); + hasStarted = false; + } + }); + + // Handle errors + stream.on('error', (error: Error) => { + this.#logger.error('Google STT stream error:', { error }); + throw error; + }); + + // Send audio data + const sendTask = async () => { + const samples100Ms = Math.floor(this.#config.sampleRate / 10); + const audioStream = new AudioByteStream( + this.#config.sampleRate, + 1, // Google STT expects mono audio + samples100Ms, + ); + + for await (const data of this.input) { + let frames: AudioFrame[]; + if (data === SpeechStream.FLUSH_SENTINEL) { + frames = audioStream.flush(); + } else if (data.sampleRate === this.#config.sampleRate || data.channels === 1) { + frames = audioStream.write(data.data.buffer); + } else { + throw new Error('Sample rate or channel count of frame does not match'); + } + + for await (const frame of frames) { + if (this.#audioEnergyFilter.pushFrame(frame)) { + stream.write({ audio: Buffer.from(frame.data.buffer) }); + } + } + } + + stream.end(); + }; + + await sendTask(); + clearInterval(keepalive); + } + + #streamingRecognizeResponseToSpeechData( + response: protos.google.cloud.speech.v2.StreamingRecognizeResponse, + ): stt.SpeechData | null { + if (!response.results || response.results.length === 0) { + return null; + } + + let text = ''; + let confidence = 0.0; + let language = 'en-US'; + + for (const result of response.results) { + if (!result.alternatives || result.alternatives.length === 0) { + continue; + } + text += result.alternatives[0].transcript || ''; + confidence += result.alternatives[0].confidence || 0; + language = result.languageCode || language; + } + + confidence /= response.results.length; + + if (confidence < this.#config.minConfidenceThreshold || text === '') { + return null; + } + + return { + language, + startTime: 0, + endTime: 0, + confidence, + text, + }; + } +} diff --git a/plugins/google/tsconfig.json b/plugins/google/tsconfig.json new file mode 100644 index 00000000..1654d361 --- /dev/null +++ b/plugins/google/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "include": ["./src"], + "compilerOptions": { + // match output dir to input dir. e.g. dist/index instead of dist/src/index + "rootDir": "./src", + "declarationDir": "./dist", + "outDir": "./dist" + }, + "typedocOptions": { + "name": "plugins/agents-plugin-google", + "entryPointStrategy": "resolve", + "readme": "none", + "entryPoints": ["src/index.ts"] + } +} diff --git a/plugins/google/tsup.config.ts b/plugins/google/tsup.config.ts new file mode 100644 index 00000000..f05c9a4e --- /dev/null +++ b/plugins/google/tsup.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'tsup'; +import defaults from '../../tsup.config.js'; + +export default defineConfig({ + ...defaults, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5189d41..ac3370b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 1.13.3(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-n: specifier: ^16.6.2 version: 16.6.2(eslint@8.57.0) @@ -257,6 +257,34 @@ importers: specifier: ^5.0.0 version: 5.4.5 + plugins/google: + dependencies: + '@google-cloud/speech': + specifier: ^7.1.0 + version: 7.1.0 + devDependencies: + '@livekit/agents': + specifier: workspace:^x + version: link:../../agents + '@livekit/agents-plugin-silero': + specifier: workspace:^x + version: link:../silero + '@livekit/agents-plugins-test': + specifier: workspace:^x + version: link:../test + '@livekit/rtc-node': + specifier: ^0.13.11 + version: 0.13.16 + '@microsoft/api-extractor': + specifier: ^7.35.0 + version: 7.43.7(@types/node@22.5.5) + tsup: + specifier: ^8.3.5 + version: 8.3.5(@microsoft/api-extractor@7.43.7(@types/node@22.5.5))(postcss@8.4.38)(tsx@4.19.2)(typescript@5.4.5) + typescript: + specifier: ^5.0.0 + version: 5.4.5 + plugins/livekit: dependencies: '@huggingface/transformers': @@ -1015,6 +1043,31 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@google-cloud/common@6.0.0': + resolution: {integrity: sha512-IXh04DlkLMxWgYLIUYuHHKXKOUwPDzDgke1ykkkJPe48cGIS9kkL2U/o0pm4ankHLlvzLF/ma1eO86n/bkumIA==} + engines: {node: '>=18'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.1.0': + resolution: {integrity: sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==} + engines: {node: '>=18'} + + '@google-cloud/speech@7.1.0': + resolution: {integrity: sha512-CRulKE7ivhICLD7FD/DFeqgtMPEVs8mhRshade0oSeAN44VPFxFUQtFdYjYyqTrgTo1MIfMnBVw9WOLtBC/ehw==} + engines: {node: '>=18'} + + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@huggingface/jinja@0.3.2': resolution: {integrity: sha512-F2FvuIc+w1blGsaqJI/OErRbWH6bVJDCBI8Rm5D86yZ2wlwrGERsfIaru7XUv9eYC3DMP3ixDRRtF0h6d8AZcQ==} engines: {node: '>=18'} @@ -1170,6 +1223,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@livekit/changesets-changelog-github@0.0.4': resolution: {integrity: sha512-MXaiLYwgkYciZb8G2wkVtZ1pJJzZmVx5cM30Q+ClslrIYyAqQhRbPmZDM79/5CGxb1MTemR/tfOM25tgJgAK0g==} @@ -1179,36 +1235,70 @@ packages: '@livekit/protocol@1.29.1': resolution: {integrity: sha512-OhxXTZlyM5f4ydnAq1p5azzzOtKWmIoCSVtyVj9rgE42zQI5JM1rR9pubVRZovouGSvEDSJx9yL4Js2IlIyM1Q==} + '@livekit/rtc-node-darwin-arm64@0.13.16': + resolution: {integrity: sha512-ZN+FovcHcd5NUBzHMwHyuyNBmc82edV70u33ijc7ngZlrXmQkSG1jbYarw8Lcu+7auHZ9TIYESdqTlWwuXcghw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@livekit/rtc-node-darwin-arm64@0.13.4': resolution: {integrity: sha512-CYEpfls1/KTGCwjXTbr0WYYizVzbLYzeuGp43kG9zOxQRr3Y0KWAFeGglafupyvwib21nxe7+1ubzpXQMsYVOg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@livekit/rtc-node-darwin-x64@0.13.16': + resolution: {integrity: sha512-WT6fzv0Z18hqa+rzoc+khbhJHECQ0XXTxx0+DA3ccVYaESVT+Oo15/BwSuXsy05gFgBGiLVogAhdcqPWNN/91g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@livekit/rtc-node-darwin-x64@0.13.4': resolution: {integrity: sha512-dnoi8j/gBlg1bICadhGtldbzlARHNN+W41JwN8UOWFs99EAXmGpgjBbbTvF6XILyM3NPMhel3npzPGQ8E48ExQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@livekit/rtc-node-linux-arm64-gnu@0.13.16': + resolution: {integrity: sha512-cZlqpirhKC89lloVgFSJNBk9hMFHoQopcWjqU2GXraJ42TyV9WlasRBpkeiSP+KX34JotqeXWpzFEFcuuW82pA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@livekit/rtc-node-linux-arm64-gnu@0.13.4': resolution: {integrity: sha512-CAvvwpFt5dXyEIkkkLKspN7lReKk9t0sKoahqw1jN9boeDFgvbBYMJ5rtJwUA55keFN0yixfRyyYIRO/hPU8bw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@livekit/rtc-node-linux-x64-gnu@0.13.16': + resolution: {integrity: sha512-ApGg6rY7BW6yZXDrFHg+gyInwsnb/4Gf63MioP4IOE+kJ/Y7KjK13u+0+GR763jfv/yPNLKENn/rUknw/+96Bw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@livekit/rtc-node-linux-x64-gnu@0.13.4': resolution: {integrity: sha512-7tUGrWS7i1J0yG2KqQ4cUZDFojecLI7MumwpPeI6DTWfWUFhsWcJt6WzhAPMabYyqxWq7xJAUtD5V2TpN060bQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@livekit/rtc-node-win32-x64-msvc@0.13.16': + resolution: {integrity: sha512-rQKSei+F5WZhZJWDYdNvM3/mbxcifAN1K61Yp99+dZySFRBim7V4nHBzEz7wnfHJ7j04fkC6r5GbTVAazPia/Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@livekit/rtc-node-win32-x64-msvc@0.13.4': resolution: {integrity: sha512-/mv9A+ZA6ZKwXupoG7vs2b1G9CfcEdyY7DcWqacTR5WjE2nuO256q6aPnNd7A4dNOPepMZKc3eLX+RuVj4M9FQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@livekit/rtc-node@0.13.16': + resolution: {integrity: sha512-J8ezX/XqecwWVbjY58ZKLESkinFMx9IKaizXL2i2ntUcHN6KHnVTdge+9ZZ1U3NVnbBEklcw60lOLhk+yjtyNA==} + engines: {node: '>= 18'} + '@livekit/rtc-node@0.13.4': resolution: {integrity: sha512-wqhzqRtB6zC5yxL8cQTP2xAwCEhyXezjWp0FzJhOYNtH3dwJXChCKvcCpoaMKIOZI/nLTTYe5LWgC/2snLCnmA==} engines: {node: '>= 18'} @@ -1503,6 +1593,10 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + '@trivago/prettier-plugin-sort-imports@4.3.0': resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} peerDependencies: @@ -1515,6 +1609,12 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + + '@types/duplexify@3.6.4': + resolution: {integrity: sha512-2eahVPsd+dy3CL6FugAzJcxoraWhUghZGEQJns1kTKfCXWKJ5iG/VkaB05wRVrDKHfOFKqb0X0kXh91eE99RZg==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -1545,12 +1645,21 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/pumpify@1.4.4': + resolution: {integrity: sha512-+cWbQUecD04MQYkjNBhPmcUIP368aloYmqm+ImdMKA8rMpxRNAhZAD6gIj+sAVTF1DliqrT/qUp6aGNi/9U3tw==} + + '@types/request@2.48.12': + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/tapable@1.0.6': resolution: {integrity: sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} @@ -1648,6 +1757,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -1740,6 +1857,10 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -1774,6 +1895,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + bignumber.js@9.3.0: + resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1787,6 +1911,9 @@ packages: breakword@1.0.6: resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1807,6 +1934,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -1944,6 +2075,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -2054,9 +2189,19 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2085,6 +2230,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -2097,10 +2246,18 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} @@ -2329,6 +2486,9 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2377,6 +2537,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2416,6 +2580,10 @@ packages: form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + form-data@2.5.3: + resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} + engines: {node: '>= 0.12'} + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} @@ -2424,6 +2592,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2450,6 +2622,14 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gaxios@7.1.1: + resolution: {integrity: sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==} + engines: {node: '>=18'} + + gcp-metadata@7.0.1: + resolution: {integrity: sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==} + engines: {node: '>=18'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2461,6 +2641,14 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -2512,9 +2700,25 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + google-auth-library@10.1.0: + resolution: {integrity: sha512-GspVjZj1RbyRWpQ9FbAXMKjFGzZwDKnUHi66JJ+tcjcu5/xYAP1pdlWotCuIkMwjfVsxxDvsGZXGLzRt72D0sQ==} + engines: {node: '>=18'} + + google-gax@5.0.1: + resolution: {integrity: sha512-I8fTFXvIG8tYpiDxDXwCXoFsTVsvHJ2GA7DToH+eaRccU8r3nqPMFghVb2GdHSVcu4pq9ScRyB2S1BjO+vsa1Q==} + engines: {node: '>=18'} + + google-logging-utils@1.1.1: + resolution: {integrity: sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==} + engines: {node: '>=14'} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2524,6 +2728,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + guid-typescript@1.0.9: resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==} @@ -2553,6 +2761,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -2567,6 +2779,21 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -2794,6 +3021,9 @@ packages: engines: {node: '>=4'} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2824,6 +3054,12 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2877,6 +3113,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -2941,6 +3180,10 @@ packages: engines: {node: '>= 12'} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -3037,6 +3280,7 @@ packages: node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -3047,6 +3291,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -3058,6 +3306,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -3341,16 +3593,27 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proto3-json-serializer@3.0.1: + resolution: {integrity: sha512-Rug90pDIefARAG9MgaFjd0yR/YP4bN3Fov00kckXMjTZa0x86c4WoWfCQFdSeWi9DvRXjhfLlPDIvODB5LOTfg==} + engines: {node: '>=18'} + protobufjs@7.4.0: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3387,6 +3650,10 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readable-stream@4.5.2: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3443,6 +3710,10 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + retry-request@8.0.0: + resolution: {integrity: sha512-dJkZNmyV9C8WKUmbdj1xcvVlXBSvsUQCkg89TCK8rD72RdSn9A2jlXlS2VuYSTHoPJjJEfUHhjNYrlvuksF9cg==} + engines: {node: '>=18'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3623,6 +3894,12 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} @@ -3683,6 +3960,9 @@ packages: strip-literal@2.1.0: resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3720,6 +4000,10 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + teeny-request@10.1.0: + resolution: {integrity: sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -3945,6 +4229,13 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -4023,6 +4314,10 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -4641,6 +4936,47 @@ snapshots: '@eslint/js@8.57.0': {} + '@google-cloud/common@6.0.0': + dependencies: + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.1.0 + arrify: 2.0.1 + duplexify: 4.1.3 + extend: 3.0.2 + google-auth-library: 10.1.0 + html-entities: 2.6.0 + retry-request: 8.0.0 + teeny-request: 10.1.0 + transitivePeerDependencies: + - supports-color + + '@google-cloud/projectify@4.0.0': {} + + '@google-cloud/promisify@4.1.0': {} + + '@google-cloud/speech@7.1.0': + dependencies: + '@google-cloud/common': 6.0.0 + '@types/pumpify': 1.4.4 + google-gax: 5.0.1 + pumpify: 2.0.1 + stream-events: 1.0.5 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.5.3 + yargs: 17.7.2 + '@huggingface/jinja@0.3.2': {} '@huggingface/transformers@3.2.1': @@ -4771,6 +5107,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@js-sdsl/ordered-map@4.4.2': {} + '@livekit/changesets-changelog-github@0.0.4': dependencies: '@changesets/get-github-info': 0.5.2 @@ -4785,21 +5123,50 @@ snapshots: dependencies: '@bufbuild/protobuf': 1.10.0 + '@livekit/rtc-node-darwin-arm64@0.13.16': + optional: true + '@livekit/rtc-node-darwin-arm64@0.13.4': optional: true + '@livekit/rtc-node-darwin-x64@0.13.16': + optional: true + '@livekit/rtc-node-darwin-x64@0.13.4': optional: true + '@livekit/rtc-node-linux-arm64-gnu@0.13.16': + optional: true + '@livekit/rtc-node-linux-arm64-gnu@0.13.4': optional: true + '@livekit/rtc-node-linux-x64-gnu@0.13.16': + optional: true + '@livekit/rtc-node-linux-x64-gnu@0.13.4': optional: true + '@livekit/rtc-node-win32-x64-msvc@0.13.16': + optional: true + '@livekit/rtc-node-win32-x64-msvc@0.13.4': optional: true + '@livekit/rtc-node@0.13.16': + dependencies: + '@bufbuild/protobuf': 1.10.0 + '@livekit/mutex': 1.1.1 + '@livekit/typed-emitter': 3.0.0 + pino: 9.6.0 + pino-pretty: 13.0.0 + optionalDependencies: + '@livekit/rtc-node-darwin-arm64': 0.13.16 + '@livekit/rtc-node-darwin-x64': 0.13.16 + '@livekit/rtc-node-linux-arm64-gnu': 0.13.16 + '@livekit/rtc-node-linux-x64-gnu': 0.13.16 + '@livekit/rtc-node-win32-x64-msvc': 0.13.16 + '@livekit/rtc-node@0.13.4': dependencies: '@bufbuild/protobuf': 1.10.0 @@ -5083,6 +5450,8 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@tootallnate/once@2.0.0': {} + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.2.5)': dependencies: '@babel/generator': 7.17.7 @@ -5097,6 +5466,12 @@ snapshots: '@types/argparse@1.0.38': {} + '@types/caseless@0.12.5': {} + + '@types/duplexify@3.6.4': + dependencies: + '@types/node': 22.5.5 + '@types/estree@1.0.5': {} '@types/estree@1.0.6': {} @@ -5124,10 +5499,24 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/pumpify@1.4.4': + dependencies: + '@types/duplexify': 3.6.4 + '@types/node': 22.5.5 + + '@types/request@2.48.12': + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 22.5.5 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.3 + '@types/semver@7.5.8': {} '@types/tapable@1.0.6': {} + '@types/tough-cookie@4.0.5': {} + '@types/ws@8.5.10': dependencies: '@types/node': 22.5.5 @@ -5261,6 +5650,14 @@ snapshots: acorn@8.11.3: {} + agent-base@6.0.2: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.3: {} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 @@ -5380,6 +5777,8 @@ snapshots: arrify@1.0.1: {} + arrify@2.0.1: {} + assertion-error@1.1.0: {} ast-types-flow@0.0.8: {} @@ -5406,6 +5805,8 @@ snapshots: dependencies: is-windows: 1.0.2 + bignumber.js@9.3.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -5423,6 +5824,8 @@ snapshots: dependencies: wcwidth: 1.0.1 + buffer-equal-constant-time@1.0.1: {} + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -5441,6 +5844,11 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -5585,6 +5993,8 @@ snapshots: damerau-levenshtein@1.0.8: {} + data-uri-to-buffer@4.0.1: {} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -5674,8 +6084,25 @@ snapshots: dotenv@8.6.0: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -5751,6 +6178,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-iterator-helpers@1.0.19: @@ -5774,12 +6203,23 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 @@ -5888,8 +6328,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -5906,7 +6346,7 @@ snapshots: eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-n: 16.6.2(eslint@8.57.0) eslint-plugin-promise: 6.1.1(eslint@8.57.0) @@ -5923,13 +6363,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -5940,14 +6380,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -5958,7 +6398,7 @@ snapshots: eslint: 8.57.0 eslint-compat-utils: 0.5.0(eslint@8.57.0) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -5968,7 +6408,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6163,6 +6603,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + extend@3.0.2: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -6203,6 +6645,11 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -6247,6 +6694,14 @@ snapshots: form-data-encoder@1.7.2: {} + form-data@2.5.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + form-data@4.0.1: dependencies: asynckit: 0.4.0 @@ -6258,6 +6713,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -6286,6 +6745,22 @@ snapshots: functions-have-names@1.2.3: {} + gaxios@7.1.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + + gcp-metadata@7.0.1: + dependencies: + gaxios: 7.1.1 + google-logging-utils: 1.1.1 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + get-caller-file@2.0.5: {} get-func-name@2.0.2: {} @@ -6298,6 +6773,24 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@8.0.1: {} get-symbol-description@1.0.2: @@ -6359,16 +6852,55 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + google-auth-library@10.1.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.1 + gcp-metadata: 7.0.1 + google-logging-utils: 1.1.1 + gtoken: 8.0.0 + jws: 4.0.0 + transitivePeerDependencies: + - supports-color + + google-gax@5.0.1: + dependencies: + '@grpc/grpc-js': 1.13.4 + '@grpc/proto-loader': 0.7.15 + abort-controller: 3.0.0 + duplexify: 4.1.3 + google-auth-library: 10.1.0 + google-logging-utils: 1.1.1 + node-fetch: 3.3.2 + object-hash: 3.0.0 + proto3-json-serializer: 3.0.1 + protobufjs: 7.5.3 + retry-request: 8.0.0 + transitivePeerDependencies: + - supports-color + + google-logging-utils@1.1.1: {} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} grapheme-splitter@1.0.4: {} graphemer@1.4.0: {} + gtoken@8.0.0: + dependencies: + gaxios: 7.1.1 + jws: 4.0.0 + transitivePeerDependencies: + - supports-color + guid-typescript@1.0.9: {} hard-rejection@2.1.0: {} @@ -6387,6 +6919,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -6399,6 +6933,30 @@ snapshots: hosted-git-info@2.8.9: {} + html-entities@2.6.0: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + human-id@1.0.2: {} human-signals@5.0.0: {} @@ -6594,6 +7152,10 @@ snapshots: jsesc@2.5.2: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.0 + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -6621,6 +7183,17 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -6672,6 +7245,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.get@4.4.2: {} lodash.isequal@4.5.0: {} @@ -6719,6 +7294,8 @@ snapshots: marked@4.3.0: {} + math-intrinsics@1.1.0: {} + meow@6.1.1: dependencies: '@types/minimist': 1.2.5 @@ -6816,6 +7393,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -6829,6 +7412,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.1: {} object-keys@1.1.1: {} @@ -7142,6 +7727,10 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proto3-json-serializer@3.0.1: + dependencies: + protobufjs: 7.5.3 + protobufjs@7.4.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -7157,6 +7746,21 @@ snapshots: '@types/node': 22.5.5 long: 5.2.3 + protobufjs@7.5.3: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.5.5 + long: 5.2.3 + pseudomap@1.0.2: {} pump@3.0.0: @@ -7164,6 +7768,12 @@ snapshots: end-of-stream: 1.4.4 once: 1.4.0 + pumpify@2.0.1: + dependencies: + duplexify: 4.1.3 + inherits: 2.0.4 + pump: 3.0.0 + punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -7198,6 +7808,12 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 @@ -7261,6 +7877,14 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + retry-request@8.0.0: + dependencies: + '@types/request': 2.48.12 + extend: 3.0.2 + teeny-request: 10.1.0 + transitivePeerDependencies: + - supports-color + reusify@1.0.4: {} rimraf@3.0.2: @@ -7492,6 +8116,12 @@ snapshots: std-env@3.7.0: {} + stream-events@1.0.5: + dependencies: + stubs: 3.0.0 + + stream-shift@1.0.3: {} + stream-transform@2.1.3: dependencies: mixme: 0.5.10 @@ -7570,6 +8200,8 @@ snapshots: dependencies: js-tokens: 9.0.0 + stubs@3.0.0: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -7612,6 +8244,15 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + teeny-request@10.1.0: + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 3.3.2 + stream-events: 1.0.5 + transitivePeerDependencies: + - supports-color + term-size@2.2.1: {} text-table@0.2.0: {} @@ -7833,6 +8474,10 @@ snapshots: dependencies: punycode: 2.3.1 + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -7912,6 +8557,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@3.3.3: {} + web-streams-polyfill@4.0.0-beta.3: {} webidl-conversions@3.0.1: {} diff --git a/turbo.json b/turbo.json index 4c79e04b..4375fcc0 100644 --- a/turbo.json +++ b/turbo.json @@ -24,7 +24,9 @@ "TOGETHER_API_KEY", "XAI_API_KEY", "NEUPHONIC_API_KEY", - "RESEMBLE_API_KEY" + "RESEMBLE_API_KEY", + "GOOGLE_APPLICATION_CREDENTIALS", + "GOOGLE_CLOUD_PROJECT" ], "pipeline": { "build": { From 67d6eee32b551c184144b4885ab5ff7beb121b49 Mon Sep 17 00:00:00 2001 From: roertbb Date: Sun, 6 Jul 2025 19:45:28 +0200 Subject: [PATCH 2/3] fix build issues --- plugins/google/src/stt.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/google/src/stt.ts b/plugins/google/src/stt.ts index ba107255..3baeff37 100644 --- a/plugins/google/src/stt.ts +++ b/plugins/google/src/stt.ts @@ -3,6 +3,7 @@ import type * as protos from '@google-cloud/speech/build/protos/protos.js'; import { type AudioBuffer, AudioByteStream, AudioEnergyFilter, log, stt } from '@livekit/agents'; import { AudioFrame } from '@livekit/rtc-node'; import { + AudioEncoding, type GoogleCredentials, type LanguageCode, type LanguageType, @@ -182,7 +183,7 @@ export class STT extends stt.STT { config.languages = [config.languages]; } else if (!config.detectLanguage && config.languages.length > 1) { this.#logger.warn('Multiple languages provided, but language detection is disabled'); - config.languages = [config.languages[0]]; + config.languages = [(config.languages as [string])[0]]; } return config; @@ -526,9 +527,9 @@ export class SpeechStream extends stt.SpeechStream { if (!result.alternatives || result.alternatives.length === 0) { continue; } - text += result.alternatives[0].transcript || ''; - confidence += result.alternatives[0].confidence || 0; - language = result.languageCode || language; + text += result?.alternatives?.[0]?.transcript || ''; + confidence += result?.alternatives?.[0]?.confidence || 0; + language = result?.languageCode || language; } confidence /= response.results.length; From 8fa356bc7abc01d55a01bf5adfe791ffc57600fb Mon Sep 17 00:00:00 2001 From: roertbb Date: Sun, 6 Jul 2025 19:48:44 +0200 Subject: [PATCH 3/3] update package exports and remove removed scripts included in build process --- plugins/google/package.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/plugins/google/package.json b/plugins/google/package.json index 863db89a..26120ccd 100644 --- a/plugins/google/package.json +++ b/plugins/google/package.json @@ -6,13 +6,10 @@ "require": "dist/index.cjs", "types": "dist/index.d.ts", "exports": { - "import": { + ".": { "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" + "import": "./dist/index.js", + "require": "./dist/index.cjs" } }, "author": "LiveKit", @@ -25,8 +22,7 @@ "README.md" ], "scripts": { - "build": "tsup --onSuccess \"pnpm build:types\"", - "build:types": "tsc --declaration --emitDeclarationOnly && node ../../scripts/copyDeclarationOutput.js", + "build": "tsup --onSuccess \"tsc --declaration --emitDeclarationOnly\"", "clean": "rm -rf dist", "clean:build": "pnpm clean && pnpm build", "lint": "eslint -f unix \"src/**/*.{ts,js}\"",