@acorex-platform/extension-ai-voice-shell-client 0.0.56 → 0.0.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Injectable, inject, DestroyRef, ViewEncapsulation, ChangeDetectionStrategy, Component, signal, NgModule, InjectionToken, computed } from '@angular/core';
|
|
3
3
|
import { AXPSearchCommandProvider, AXP_SEARCH_PROVIDER, AXPFileStorageService } from '@acorex-platform/framework-client/common';
|
|
4
4
|
import * as i1$1 from '@acorex-platform/framework-client/core';
|
|
5
|
-
import { AXPKeyboardShortcutRegistry, AXPComponentSlotModule, provideAppStartUpTask, AXP_APP_STARTUP_PRIORITY } from '@acorex-platform/framework-client/core';
|
|
5
|
+
import { AXPKeyboardShortcutRegistry, AXPDialogOpener, AXPComponentSlotModule, provideAppStartUpTask, AXP_APP_STARTUP_PRIORITY } from '@acorex-platform/framework-client/core';
|
|
6
6
|
import { AXPCommandExecutor, AXPCommandService, provideCommandSetups } from '@acorex-platform/framework-client/runtime';
|
|
7
7
|
import { AXMAiManagementModule, AXPAiChatToolRunContextService, AXPAiPlatformRuntimeContextBuilder, AXPAiManagerService, persistAiChatAttachmentImage, AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY, createBrowserPlayableTtsBlobUrl } from '@acorex-platform/module-ai-management-client';
|
|
8
8
|
import { AXE_AI_VOICE_SHELL_OPEN_COMMAND, AXE_AI_VOICE_SHELL_VOICE_SESSION_STOP_COMMAND, AXE_AI_VOICE_SHELL_VOICE_SESSION_INTERRUPT_COMMAND, AXE_AI_VOICE_SHELL_VOICE_SESSION_START_COMMAND, AXE_AI_VOICE_SHELL_VOICE_SESSION_COMMIT_TURN_COMMAND, AXE_AI_VOICE_SHELL_VOICE_SESSION_PUSH_AUDIO_COMMAND, AXE_AI_VOICE_SHELL_VOICE_SESSION_EXECUTE_TOOL_COMMAND, AXE_AI_VOICE_OPENROUTER_AUDIO_TOPIC } from '@acorex-platform/extension-ai-voice-shell-client/contracts';
|
|
@@ -949,6 +949,7 @@ class AXPVoiceCommandShellService {
|
|
|
949
949
|
constructor() {
|
|
950
950
|
//#region ----- Services & Dependencies -----
|
|
951
951
|
this.popupService = inject(AXPopupService);
|
|
952
|
+
this.dialogOpener = inject(AXPDialogOpener);
|
|
952
953
|
this.translation = inject(AXTranslationService);
|
|
953
954
|
this.commandService = inject(AXPCommandService);
|
|
954
955
|
this.media = inject(AXPVoiceLiveMediaService);
|
|
@@ -978,35 +979,41 @@ class AXPVoiceCommandShellService {
|
|
|
978
979
|
//#endregion
|
|
979
980
|
//#region ----- Public API -----
|
|
980
981
|
async open(_options) {
|
|
981
|
-
|
|
982
|
-
return
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
982
|
+
const outcome = await this.dialogOpener.run({
|
|
983
|
+
load: () => Promise.resolve().then(function () { return voiceVoidDialog_component; }).then((module) => module.AXEAiVoiceVoidDialogComponent),
|
|
984
|
+
data: { window: 'voice-shell' },
|
|
985
|
+
present: async (notifyShown, component) => {
|
|
986
|
+
this.media.unlockPlayback();
|
|
987
|
+
this.resetUi();
|
|
988
|
+
this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.connecting'));
|
|
989
|
+
this.uiState.set('thinking');
|
|
990
|
+
const title = await this.translation.translateAsync('@extensions-ai-voice-shell:dialog.title');
|
|
991
|
+
const popupClosed = this.popupService
|
|
992
|
+
.open(component, {
|
|
993
|
+
title,
|
|
994
|
+
size: 'sm',
|
|
995
|
+
header: true,
|
|
996
|
+
closeButton: true,
|
|
997
|
+
maximizable: false,
|
|
998
|
+
draggable: true,
|
|
999
|
+
hasBackdrop: true,
|
|
1000
|
+
closeOnBackdropClick: true,
|
|
1001
|
+
closeOnEscape: true,
|
|
1002
|
+
panelClass: ['axe-ai-voice-shell-popup'],
|
|
1003
|
+
})
|
|
1004
|
+
.then(() => undefined);
|
|
1005
|
+
notifyShown();
|
|
1006
|
+
this.openPromise = popupClosed.finally(() => {
|
|
1007
|
+
this.openPromise = null;
|
|
1008
|
+
void this.hangUp(false);
|
|
1009
|
+
});
|
|
1010
|
+
void this.startLiveSession();
|
|
1011
|
+
return this.openPromise;
|
|
1012
|
+
},
|
|
1007
1013
|
});
|
|
1008
|
-
|
|
1009
|
-
|
|
1014
|
+
if (outcome.duplicate) {
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1010
1017
|
}
|
|
1011
1018
|
ensurePlayback() {
|
|
1012
1019
|
this.media.unlockPlayback();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-ai-voice-shell-client.mjs","sources":["../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-livekit.loader.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-live-rtc-connect.util.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-openrouter-mic.util.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-live-media.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-shell-header-slot.component.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-shell-header-slot.component.html","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-shell-search.provider.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-command-shell.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/ai-voice-shell-extension.module.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-capability.tokens.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-capability-registry.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/transport/http-sse-voice-transport.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/commands/open-voice-command-shell.command.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-void-dialog/voice-void-dialog.component.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-void-dialog/voice-void-dialog.component.html","../../../../libs/extensions/ai/voice-shell/client/src/acorex-platform-extension-ai-voice-shell-client.ts"],"sourcesContent":["//#region ----- Types -----\n\nexport type LiveKitClient = typeof import('livekit-client');\n\n//#endregion\n\n//#region ----- Loader -----\n\nlet pending: Promise<LiveKitClient> | null = null;\n\n/** Loads the LiveKit browser SDK once, when a voice session connects over RTC. */\nexport function loadLiveKitClient(): Promise<LiveKitClient> {\n pending ??= import('livekit-client');\n return pending;\n}\n\n//#endregion\n","//#region ----- LiveKit connect options -----\n\n/** Extra time for ICE on local / Docker Desktop. Matches chat-call joins. */\nexport const AXE_VOICE_LIVE_PEER_CONNECTION_TIMEOUT_MS = 45_000;\n\nconst DEFAULT_DEV_LIVEKIT_WS_PROXY_PATH = '/livekit-ws';\n\nfunction axeIsLocalDevHostname(hostname: string): boolean {\n const normalized = hostname.trim().toLowerCase();\n return normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '[::1]';\n}\n\n/**\n * Route LiveKit signaling the same way chat calls do:\n * proxy only when the UI host and LiveKit host disagree (one local, one not).\n * Local UI + local LiveKit (`ws://127.0.0.1:7880`) connects directly.\n */\nexport function axeResolveVoiceLiveKitServerUrl(serverUrl: string | undefined): string {\n const trimmed = serverUrl?.trim();\n if (!trimmed || typeof window === 'undefined') {\n return trimmed ?? '';\n }\n\n try {\n const resolved = new URL(trimmed);\n const localUi = axeIsLocalDevHostname(window.location.hostname);\n const localLiveKit = axeIsLocalDevHostname(resolved.hostname);\n const useDevProxy = (localUi && !localLiveKit) || (!localUi && localLiveKit);\n if (!useDevProxy) {\n return trimmed;\n }\n\n const proxy = new URL(window.location.origin);\n proxy.pathname = DEFAULT_DEV_LIVEKIT_WS_PROXY_PATH;\n return proxy.toString().replace(/\\/$/, '');\n } catch {\n return trimmed;\n }\n}\n\n/** Preferred URL first, then the token URL and same-origin `/livekit-ws` as fallbacks. */\nexport function axeVoiceLiveKitConnectUrls(serverUrl: string): string[] {\n const trimmed = serverUrl.trim();\n const urls: string[] = [];\n const add = (url: string) => {\n const next = url.trim();\n if (next && !urls.includes(next)) {\n urls.push(next);\n }\n };\n add(axeResolveVoiceLiveKitServerUrl(trimmed));\n add(trimmed);\n if (typeof window !== 'undefined' && axeIsLocalDevHostname(window.location.hostname)) {\n add(`${window.location.origin.replace(/^http/i, 'ws')}/livekit-ws`);\n }\n return urls.length ? urls : [trimmed];\n}\n\nexport function axeVoiceLiveRoomConnectOptions(\n serverUrl?: string,\n iceServers?: RTCIceServer[],\n forceRelay?: boolean,\n): {\n peerConnectionTimeout: number;\n rtcConfig?: RTCConfiguration;\n} {\n const options: {\n peerConnectionTimeout: number;\n rtcConfig?: RTCConfiguration;\n } = {\n peerConnectionTimeout: AXE_VOICE_LIVE_PEER_CONNECTION_TIMEOUT_MS,\n };\n\n if (forceRelay) {\n options.rtcConfig = { iceTransportPolicy: 'relay' };\n return options;\n }\n\n if (iceServers?.length) {\n options.rtcConfig = { iceServers };\n return options;\n }\n\n if (isLocalLiveKitUrl(serverUrl)) {\n options.rtcConfig = { iceTransportPolicy: 'all' };\n }\n\n return options;\n}\n\nfunction isLocalLiveKitUrl(serverUrl: string | undefined): boolean {\n if (!serverUrl?.trim()) {\n return false;\n }\n try {\n const url = new URL(serverUrl.trim());\n return axeIsLocalDevHostname(url.hostname);\n } catch {\n return false;\n }\n}\n\n//#endregion\n","//#region ----- Constants -----\n\nconst VAD = {\n rmsThreshold: 500,\n hangInMs: 80,\n bargeInHangInMs: 280,\n hangInGraceMs: 160,\n silenceHangoverMs: 700,\n minUtteranceMs: 280,\n minUtteranceRms: 180,\n maxUtteranceMs: 8_000,\n prerollMs: 200,\n} as const;\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXPVoiceOpenRouterVadEvent =\n | { event: 'start' }\n | { event: 'end'; pcm: Int16Array; sampleRate: number }\n | { event: 'cancel' };\n\nexport interface AXPVoiceOpenRouterMicHandle {\n stop(): void;\n}\n\n//#endregion\n\n//#region ----- PCM helpers -----\n\nexport function float32ToPcm16(input: Float32Array): Int16Array {\n const out = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const clamped = Math.max(-1, Math.min(1, input[i] ?? 0));\n out[i] = clamped < 0 ? Math.round(clamped * 0x8000) : Math.round(clamped * 0x7fff);\n }\n return out;\n}\n\nexport function pcm16Rms(pcm: Int16Array): number {\n if (pcm.length <= 0) {\n return 0;\n }\n let sumSquares = 0;\n for (let i = 0; i < pcm.length; i++) {\n const sample = pcm[i] ?? 0;\n sumSquares += sample * sample;\n }\n return Math.sqrt(sumSquares / pcm.length);\n}\n\nexport function pcm16ToBase64(pcm: Int16Array): string {\n const bytes = new Uint8Array(pcm.buffer, pcm.byteOffset, pcm.byteLength);\n const chunk = 0x2000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunk) {\n const slice = bytes.subarray(i, Math.min(i + chunk, bytes.length));\n binary += String.fromCharCode(...slice);\n }\n return btoa(binary);\n}\n\nexport function base64ToPcm16(raw: string): Int16Array | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const binary = atob(trimmed);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n const even = bytes.byteLength - (bytes.byteLength % 2);\n if (even < 2) {\n return null;\n }\n return new Int16Array(bytes.buffer, bytes.byteOffset, even / 2);\n } catch {\n return null;\n }\n}\n\n//#endregion\n\n//#region ----- Energy VAD -----\n\nexport class AXPVoiceOpenRouterEnergyVad {\n private preroll: Int16Array = new Int16Array(0);\n private utterance: Int16Array = new Int16Array(0);\n private speaking = false;\n private hangInMs = 0;\n private hangInSilenceMs = 0;\n private silenceMs = 0;\n private utteranceMs = 0;\n private sampleRate = 48_000;\n\n push(pcm16: Int16Array, sampleRate: number, bargeIn = false): AXPVoiceOpenRouterVadEvent | null {\n if (pcm16.length < 2 || sampleRate <= 0) {\n return null;\n }\n this.sampleRate = sampleRate;\n const frameMs = (pcm16.length / sampleRate) * 1000;\n const voiced = pcm16Rms(pcm16) >= VAD.rmsThreshold;\n const hangInNeedMs = bargeIn ? VAD.bargeInHangInMs : VAD.hangInMs;\n\n if (!this.speaking) {\n this.appendPreroll(pcm16, sampleRate);\n if (!voiced) {\n if (this.hangInMs <= 0) {\n return null;\n }\n this.hangInSilenceMs += frameMs;\n this.utterance = concatPcm(this.utterance, pcm16);\n this.utteranceMs += frameMs;\n if (this.hangInSilenceMs >= VAD.hangInGraceMs) {\n this.hangInMs = 0;\n this.hangInSilenceMs = 0;\n this.utterance = new Int16Array(0);\n this.utteranceMs = 0;\n }\n return null;\n }\n this.hangInSilenceMs = 0;\n if (this.hangInMs <= 0) {\n this.utterance = concatPcm(this.preroll, pcm16);\n this.preroll = new Int16Array(0);\n this.utteranceMs = frameMs;\n } else {\n this.utterance = concatPcm(this.utterance, pcm16);\n this.utteranceMs += frameMs;\n }\n this.hangInMs += frameMs;\n if (this.hangInMs < hangInNeedMs) {\n return null;\n }\n this.speaking = true;\n this.silenceMs = 0;\n return { event: 'start' };\n }\n\n this.utterance = concatPcm(this.utterance, pcm16);\n this.utteranceMs += frameMs;\n this.silenceMs = voiced ? 0 : this.silenceMs + frameMs;\n const ended =\n this.silenceMs >= VAD.silenceHangoverMs || this.utteranceMs >= VAD.maxUtteranceMs;\n if (!ended) {\n return null;\n }\n\n const captured = this.utterance;\n const durationMs = this.utteranceMs;\n const trailingSilenceMs = this.silenceMs;\n const rate = this.sampleRate;\n this.reset();\n const hangoverSamples = Math.max(0, Math.floor((rate * trailingSilenceMs) / 1000));\n const spoken =\n hangoverSamples > 0 && captured.length > hangoverSamples + 1\n ? captured.subarray(0, captured.length - hangoverSamples)\n : captured;\n const spokenMs = Math.max(0, durationMs - trailingSilenceMs);\n if (\n spokenMs < VAD.minUtteranceMs ||\n spoken.length < 2 ||\n pcm16Rms(spoken) < VAD.minUtteranceRms\n ) {\n return { event: 'cancel' };\n }\n return { event: 'end', pcm: spoken, sampleRate: rate };\n }\n\n reset(): void {\n this.preroll = new Int16Array(0);\n this.utterance = new Int16Array(0);\n this.speaking = false;\n this.hangInMs = 0;\n this.hangInSilenceMs = 0;\n this.silenceMs = 0;\n this.utteranceMs = 0;\n }\n\n private appendPreroll(pcm16: Int16Array, sampleRate: number): void {\n const maxSamples = Math.max(1, Math.floor((sampleRate * VAD.prerollMs) / 1000));\n this.preroll = concatPcm(this.preroll, pcm16);\n if (this.preroll.length > maxSamples) {\n this.preroll = this.preroll.subarray(this.preroll.length - maxSamples);\n }\n }\n}\n\nfunction concatPcm(left: Int16Array, right: Int16Array): Int16Array {\n const out = new Int16Array(left.length + right.length);\n out.set(left, 0);\n out.set(right, left.length);\n return out;\n}\n\n//#endregion\n\n//#region ----- Mic capture -----\n\nexport function startOpenRouterMicCapture(options: {\n context: AudioContext;\n stream: MediaStream;\n onUtterance: (pcm: Int16Array, sampleRate: number) => void;\n onSpeechStart?: () => void;\n bargeIn?: () => boolean;\n}): AXPVoiceOpenRouterMicHandle {\n const source = options.context.createMediaStreamSource(options.stream);\n const processor = options.context.createScriptProcessor(2048, 1, 1);\n const silent = options.context.createGain();\n silent.gain.value = 0;\n const vad = new AXPVoiceOpenRouterEnergyVad();\n processor.onaudioprocess = (event) => {\n const input = event.inputBuffer.getChannelData(0);\n const pcm = float32ToPcm16(input);\n const result = vad.push(pcm, options.context.sampleRate, options.bargeIn?.() === true);\n if (!result) {\n return;\n }\n if (result.event === 'start') {\n options.onSpeechStart?.();\n return;\n }\n if (result.event === 'end') {\n options.onUtterance(result.pcm, result.sampleRate);\n }\n };\n source.connect(processor);\n processor.connect(silent);\n silent.connect(options.context.destination);\n return {\n stop: () => {\n processor.onaudioprocess = null;\n try {\n processor.disconnect();\n } catch {\n // ignore\n }\n try {\n source.disconnect();\n } catch {\n // ignore\n }\n try {\n silent.disconnect();\n } catch {\n // ignore\n }\n vad.reset();\n },\n };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable } from '@angular/core';\nimport type { RemoteAudioTrack, Room, Track } from 'livekit-client';\nimport type { AXPVoiceLiveRtcJoin, AXPVoiceLiveVendorJoin } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { loadLiveKitClient, type LiveKitClient } from './voice-livekit.loader';\nimport { axeVoiceLiveKitConnectUrls, axeVoiceLiveRoomConnectOptions } from './voice-live-rtc-connect.util';\nimport {\n base64ToPcm16,\n startOpenRouterMicCapture,\n type AXPVoiceOpenRouterMicHandle,\n} from './voice-openrouter-mic.util';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXPVoiceLiveMediaCallbacks {\n onVendorTranscript?: (role: 'user' | 'assistant', text: string, isFinal: boolean) => void;\n onSpeaking?: (speaking: boolean) => void;\n onLocalSpeechStart?: () => void;\n onVendorFunctionCall?: (call: { callId: string; name: string; argumentsJson: string }) => void;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPVoiceLiveMediaService {\n private rtcRoom: Room | null = null;\n private livekit: LiveKitClient | null = null;\n private peer: RTCPeerConnection | null = null;\n private localStream: MediaStream | null = null;\n private playbackAudio: HTMLAudioElement | null = null;\n private audioContext: AudioContext | null = null;\n private dataChannel: RTCDataChannel | null = null;\n private audioSink: HTMLElement | null = null;\n private readonly remoteAudioElements = new Map<string, { track: RemoteAudioTrack; element: HTMLMediaElement }>();\n private openRouterMic: AXPVoiceOpenRouterMicHandle | null = null;\n private openRouterPlayAt = 0;\n private openRouterGeneration = 0;\n private readonly openRouterSources = new Set<AudioBufferSourceNode>();\n\n /**\n * Must run in the same user-gesture turn as the mic click (before any await).\n * Do not call getUserMedia here — a second Chrome profile will prompt twice and\n * the extra stream can lock the device before LiveKit publishes the mic.\n */\n unlockPlayback(): void {\n this.ensureAudioContext();\n this.playAttachedAudio();\n void this.rtcRoom?.startAudio().catch(() => undefined);\n }\n\n async connectRtc(join: AXPVoiceLiveRtcJoin, callbacks?: AXPVoiceLiveMediaCallbacks): Promise<void> {\n await this.teardownRtc();\n this.stopOpenRouterMic();\n this.stopOpenRouterPlayback();\n const urls = axeVoiceLiveKitConnectUrls(join.serverUrl);\n let lastErr: unknown;\n const livekit = await this.ensureLiveKit();\n for (const url of urls) {\n const room = this.createRtcRoom(livekit, callbacks);\n this.rtcRoom = room;\n try {\n await room.connect(url, join.token, axeVoiceLiveRoomConnectOptions(url, join.iceServers, join.forceRelay));\n this.attachExistingRemoteAudio(room);\n await room.startAudio().catch((err) => {\n console.warn('LiveKit startAudio failed', err);\n });\n try {\n await room.localParticipant.setMicrophoneEnabled(true);\n } catch (err) {\n throw new Error(voiceMediaErrorKey(err));\n }\n return;\n } catch (err) {\n lastErr = err;\n console.error(`LiveKit connectRtc failed (${url})`, err);\n await this.teardownRtc();\n const key = err instanceof Error && err.message.startsWith('@') ? err.message : voiceMediaErrorKey(err);\n if (key !== '@extensions-ai-voice-shell:errors.livekit-inactive') {\n throw new Error(key);\n }\n }\n }\n throw lastErr instanceof Error && lastErr.message.startsWith('@')\n ? lastErr\n : new Error(voiceMediaErrorKey(lastErr));\n }\n\n async connectOpenRouter(callbacks: {\n onUtterance: (pcm: Int16Array, sampleRate: number) => void;\n onSpeechStart?: () => void;\n bargeIn?: () => boolean;\n }): Promise<void> {\n await this.teardownRtc();\n this.stopOpenRouterMic();\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true }).catch((err: unknown) => {\n throw new Error(voiceMediaErrorKey(err));\n });\n this.localStream = stream;\n const context = this.ensureAudioContext();\n if (!context) {\n stream.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n throw new Error('@extensions-ai-voice-shell:errors.mic-unavailable');\n }\n await context.resume().catch(() => undefined);\n this.openRouterMic = startOpenRouterMicCapture({\n context,\n stream,\n onUtterance: callbacks.onUtterance,\n onSpeechStart: callbacks.onSpeechStart,\n bargeIn: callbacks.bargeIn,\n });\n }\n\n playOpenRouterPcm(pcmBase64: string, sampleRate: number): void {\n const pcm = base64ToPcm16(pcmBase64);\n const context = this.ensureAudioContext();\n if (!pcm || !context || sampleRate <= 0) {\n return;\n }\n void context.resume().catch(() => undefined);\n const buffer = context.createBuffer(1, pcm.length, sampleRate);\n const channel = buffer.getChannelData(0);\n for (let i = 0; i < pcm.length; i++) {\n channel[i] = (pcm[i] ?? 0) / 32768;\n }\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(context.destination);\n const generation = this.openRouterGeneration;\n source.onended = () => {\n this.openRouterSources.delete(source);\n };\n const startAt = Math.max(context.currentTime, this.openRouterPlayAt);\n this.openRouterPlayAt = startAt + buffer.duration;\n this.openRouterSources.add(source);\n try {\n source.start(startAt);\n } catch {\n this.openRouterSources.delete(source);\n }\n if (generation !== this.openRouterGeneration) {\n try {\n source.stop();\n } catch {\n // ignore\n }\n }\n }\n\n async connectVendor(join: AXPVoiceLiveVendorJoin, callbacks: AXPVoiceLiveMediaCallbacks): Promise<void> {\n await this.teardownRtc();\n this.stopOpenRouterMic();\n this.stopOpenRouterPlayback();\n if (join.transport !== 'openai') {\n throw new Error('@extensions-ai-voice-shell:errors.livekit-inactive');\n }\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true }).catch((err: unknown) => {\n throw new Error(voiceMediaErrorKey(err));\n });\n this.localStream = stream;\n const peer = new RTCPeerConnection();\n this.peer = peer;\n stream.getTracks().forEach((track) => peer.addTrack(track, stream));\n peer.ontrack = (event) => {\n const [remote] = event.streams;\n if (remote) {\n this.attachMediaStream(remote);\n }\n };\n const channel = peer.createDataChannel('oai-events');\n this.dataChannel = channel;\n channel.addEventListener('message', (event) => {\n this.handleVendorEvent(event.data, callbacks);\n });\n const offer = await peer.createOffer();\n await peer.setLocalDescription(offer);\n const sdpUrl = join.realtimeUrl.trim();\n const response = await fetch(sdpUrl, {\n method: 'POST',\n body: offer.sdp ?? '',\n headers: {\n Authorization: `Bearer ${join.clientSecret}`,\n 'Content-Type': 'application/sdp',\n },\n });\n if (!response.ok) {\n throw new Error('@extensions-ai-voice-shell:errors.livekit-inactive');\n }\n const answer = await response.text();\n await peer.setRemoteDescription({ type: 'answer', sdp: answer });\n }\n\n async interruptVendor(): Promise<void> {\n if (this.dataChannel?.readyState === 'open') {\n this.dataChannel.send(JSON.stringify({ type: 'response.cancel' }));\n }\n this.stopPlayback();\n }\n\n sendVendorFunctionOutput(callId: string, output: string): void {\n if (this.dataChannel?.readyState !== 'open') {\n return;\n }\n this.dataChannel.send(\n JSON.stringify({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output,\n },\n }),\n );\n this.dataChannel.send(JSON.stringify({ type: 'response.create' }));\n }\n\n stopPlayback(): void {\n this.stopOpenRouterPlayback();\n if (this.playbackAudio) {\n this.playbackAudio.pause();\n this.playbackAudio.muted = true;\n }\n for (const { track, element } of this.remoteAudioElements.values()) {\n element.muted = true;\n if (element instanceof HTMLAudioElement) {\n element.volume = 0;\n }\n track.setVolume(0);\n }\n }\n\n restorePlayback(): void {\n void this.audioContext?.resume().catch(() => undefined);\n if (this.playbackAudio) {\n this.playbackAudio.muted = false;\n this.playbackAudio.volume = 1;\n void this.playbackAudio.play().catch(() => undefined);\n }\n for (const { track, element } of this.remoteAudioElements.values()) {\n element.muted = false;\n if (element instanceof HTMLAudioElement) {\n element.volume = 1;\n }\n track.setVolume(1);\n }\n this.playAttachedAudio();\n if (!this.rtcRoom) {\n return;\n }\n void this.rtcRoom.startAudio().catch(() => undefined);\n this.attachExistingRemoteAudio(this.rtcRoom);\n }\n\n async disconnect(): Promise<void> {\n this.stopOpenRouterMic();\n this.stopOpenRouterPlayback();\n await this.teardownRtc();\n if (this.playbackAudio) {\n this.playbackAudio.pause();\n this.playbackAudio.srcObject = null;\n }\n }\n\n private async ensureLiveKit(): Promise<LiveKitClient> {\n this.livekit ??= await loadLiveKitClient();\n return this.livekit;\n }\n\n private stopOpenRouterMic(): void {\n this.openRouterMic?.stop();\n this.openRouterMic = null;\n this.localStream?.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n }\n\n private stopOpenRouterPlayback(): void {\n this.openRouterGeneration += 1;\n this.openRouterPlayAt = 0;\n for (const source of this.openRouterSources) {\n try {\n source.stop();\n } catch {\n // ignore\n }\n }\n this.openRouterSources.clear();\n }\n\n private createRtcRoom(livekit: LiveKitClient, callbacks?: AXPVoiceLiveMediaCallbacks): Room {\n const { Room, RoomEvent } = livekit;\n const room = new Room({\n adaptiveStream: true,\n dynacast: true,\n audioCaptureDefaults: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n room.on(RoomEvent.TrackSubscribed, (track) => {\n if (track.kind === 'audio') {\n this.attachRemoteTrack(track);\n }\n });\n room.on(RoomEvent.TrackUnsubscribed, (track) => {\n this.detachRemoteTrack(track);\n });\n room.on(RoomEvent.TrackPublished, (publication) => {\n if (publication.kind === 'audio' && !publication.isSubscribed) {\n void publication.setSubscribed(true);\n }\n });\n room.on(RoomEvent.ParticipantConnected, () => {\n this.attachExistingRemoteAudio(room);\n });\n room.on(RoomEvent.AudioPlaybackStatusChanged, () => {\n if (!room.canPlaybackAudio) {\n void room.startAudio().catch(() => undefined);\n }\n });\n room.on(RoomEvent.ActiveSpeakersChanged, (speakers) => {\n const localId = room.localParticipant.identity;\n if (speakers.some((speaker) => speaker.identity === localId)) {\n callbacks?.onLocalSpeechStart?.();\n }\n });\n return room;\n }\n\n private async teardownRtc(): Promise<void> {\n this.dataChannel = null;\n if (this.peer) {\n this.peer.close();\n this.peer = null;\n }\n this.localStream?.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n this.clearRemoteAudio();\n if (this.rtcRoom) {\n this.rtcRoom.removeAllListeners();\n await this.rtcRoom.disconnect();\n this.rtcRoom = null;\n }\n }\n\n private attachExistingRemoteAudio(room: Room): void {\n room.remoteParticipants.forEach((participant) => {\n participant.audioTrackPublications.forEach((publication) => {\n const track = publication.track;\n if (track && track.kind === 'audio') {\n this.attachRemoteTrack(track);\n }\n });\n });\n }\n\n private attachRemoteTrack(track: Track): void {\n const RemoteAudioTrack = this.livekit?.RemoteAudioTrack;\n if (!RemoteAudioTrack || !(track instanceof RemoteAudioTrack)) {\n return;\n }\n const key = track.sid ?? track.mediaStreamTrack?.id;\n if (!key || this.remoteAudioElements.has(key)) {\n return;\n }\n const element = track.attach();\n if (element instanceof HTMLAudioElement) {\n element.autoplay = true;\n element.muted = false;\n element.volume = 1;\n }\n this.audioSinkElement().appendChild(element);\n this.remoteAudioElements.set(key, { track, element });\n void element.play().catch((err) => {\n console.warn('LiveKit remote audio play() failed', err);\n });\n void this.rtcRoom?.startAudio().catch(() => undefined);\n }\n\n private detachRemoteTrack(track: Track): void {\n const RemoteAudioTrack = this.livekit?.RemoteAudioTrack;\n const key =\n RemoteAudioTrack && track instanceof RemoteAudioTrack\n ? (track.sid ?? track.mediaStreamTrack?.id)\n : track.mediaStreamTrack?.id;\n if (!key) {\n return;\n }\n const attached = this.remoteAudioElements.get(key);\n if (!attached) {\n return;\n }\n attached.track.detach(attached.element);\n attached.element.remove();\n this.remoteAudioElements.delete(key);\n }\n\n private clearRemoteAudio(): void {\n for (const { track, element } of this.remoteAudioElements.values()) {\n try {\n track.detach(element);\n } catch {\n // Detach is best-effort during teardown.\n }\n element.remove();\n }\n this.remoteAudioElements.clear();\n this.audioSink?.remove();\n this.audioSink = null;\n }\n\n private audioSinkElement(): HTMLElement {\n if (!this.audioSink && typeof document !== 'undefined') {\n const sink = document.createElement('div');\n sink.setAttribute('data-axe-voice-live-audio-sink', 'true');\n // display:none blocks playback in Chrome — keep the sink in layout but invisible.\n sink.style.cssText =\n 'position:fixed;width:1px;height:1px;opacity:0.01;pointer-events:none;left:0;bottom:0;';\n document.body.appendChild(sink);\n this.audioSink = sink;\n }\n return this.audioSink ?? document.body;\n }\n\n private playAttachedAudio(): void {\n for (const { element } of this.remoteAudioElements.values()) {\n element.muted = false;\n if (element instanceof HTMLAudioElement) {\n element.volume = 1;\n }\n void element.play().catch(() => undefined);\n }\n if (this.playbackAudio) {\n this.playbackAudio.muted = false;\n this.playbackAudio.volume = 1;\n void this.playbackAudio.play().catch(() => undefined);\n }\n }\n\n private attachMediaStream(stream: MediaStream): void {\n const audio = this.ensurePlaybackElement();\n if (!audio) {\n return;\n }\n audio.muted = false;\n audio.volume = 1;\n if (audio.srcObject !== stream) {\n audio.srcObject = stream;\n }\n void audio.play().catch((err) => {\n console.warn('LiveKit remote audio play() failed', err);\n });\n }\n\n private ensureAudioContext(): AudioContext | null {\n if (typeof AudioContext === 'undefined') {\n return null;\n }\n if (!this.audioContext || this.audioContext.state === 'closed') {\n this.audioContext = new AudioContext();\n }\n void this.audioContext.resume().catch(() => undefined);\n try {\n const buffer = this.audioContext.createBuffer(1, 1, 22050);\n const source = this.audioContext.createBufferSource();\n source.buffer = buffer;\n source.connect(this.audioContext.destination);\n source.start(0);\n } catch {\n // Silent tick is best-effort.\n }\n return this.audioContext;\n }\n\n private ensurePlaybackElement(): HTMLAudioElement | null {\n if (typeof Audio === 'undefined' || typeof document === 'undefined') {\n return null;\n }\n const audio = this.playbackAudio ?? new Audio();\n this.playbackAudio = audio;\n audio.autoplay = true;\n audio.muted = false;\n audio.volume = 1;\n audio.setAttribute('playsinline', 'true');\n if (!audio.isConnected) {\n this.audioSinkElement().appendChild(audio);\n }\n return audio;\n }\n\n private handleVendorEvent(raw: unknown, callbacks: AXPVoiceLiveMediaCallbacks): void {\n const text = typeof raw === 'string' ? raw : '';\n if (!text) {\n return;\n }\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(text) as Record<string, unknown>;\n } catch {\n return;\n }\n const type = typeof event['type'] === 'string' ? event['type'] : '';\n if (type === 'input_audio_buffer.speech_started') {\n callbacks.onLocalSpeechStart?.();\n return;\n }\n if (type === 'response.function_call_arguments.done') {\n const callId =\n (typeof event['call_id'] === 'string' ? event['call_id'] : '') ||\n (typeof event['id'] === 'string' ? event['id'] : '');\n const name = typeof event['name'] === 'string' ? event['name'] : '';\n const argumentsJson = typeof event['arguments'] === 'string' ? event['arguments'] : '{}';\n if (callId && name) {\n callbacks.onVendorFunctionCall?.({ callId, name, argumentsJson });\n }\n return;\n }\n if (\n type === 'response.audio.delta' ||\n type === 'response.output_audio.delta' ||\n type === 'output_audio_buffer.started'\n ) {\n this.restorePlayback();\n callbacks.onSpeaking?.(true);\n return;\n }\n if (\n type === 'response.audio.done' ||\n type === 'response.output_audio.done' ||\n type === 'response.done'\n ) {\n callbacks.onSpeaking?.(false);\n }\n if (type === 'conversation.item.input_audio_transcription.completed') {\n const transcript = typeof event['transcript'] === 'string' ? event['transcript'].trim() : '';\n if (transcript) {\n callbacks.onVendorTranscript?.('user', transcript, true);\n }\n return;\n }\n if (type === 'response.audio_transcript.done' || type === 'response.output_audio_transcript.done') {\n const transcript = typeof event['transcript'] === 'string' ? event['transcript'].trim() : '';\n if (transcript) {\n callbacks.onVendorTranscript?.('assistant', transcript, true);\n }\n }\n }\n}\n\nfunction voiceMediaErrorKey(err: unknown): string {\n const name = err instanceof DOMException ? err.name : '';\n const message = err instanceof Error ? err.message : String(err);\n if (\n name === 'NotAllowedError' ||\n name === 'PermissionDeniedError' ||\n /permission|denied|notallowed/i.test(message)\n ) {\n return '@extensions-ai-voice-shell:errors.mic-denied';\n }\n if (\n name === 'NotFoundError' ||\n name === 'NotReadableError' ||\n name === 'OverconstrainedError' ||\n name === 'AbortError' ||\n /getUserMedia|Requested device not found|Could not start audio source/i.test(message)\n ) {\n return '@extensions-ai-voice-shell:errors.mic-unavailable';\n }\n return '@extensions-ai-voice-shell:errors.livekit-inactive';\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPKeyboardShortcutPriority } from '@acorex-platform/framework-shared/core';\nimport { AXE_AI_VOICE_SHELL_OPEN_COMMAND } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPKeyboardShortcutRegistry } from '@acorex-platform/framework-client/core';\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\nimport { AXPLayoutThemeService } from '@acorex-platform/framework-client/themes/shared';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, inject } from '@angular/core';\nimport { AXPVoiceLiveMediaService } from './voice-live-media.service';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Dedicated chord — Ctrl+K remains global search. */\nexport const AXE_AI_VOICE_SHELL_SHORTCUT = 'ctrl+shift+space';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Header mic next to the conversation AI robot. Opens the voice command shell.\n */\n@Component({\n selector: 'axe-ai-voice-shell-header-slot',\n templateUrl: './voice-shell-header-slot.component.html',\n styleUrls: ['./voice-shell-header-slot.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXButtonModule, AXDecoratorModule, AXTranslationModule, AsyncPipe],\n})\nexport class AXEAiVoiceShellHeaderSlotComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly commandExecutor = inject(AXPCommandExecutor);\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n private readonly destroyRef = inject(DestroyRef);\n private readonly media = inject(AXPVoiceLiveMediaService);\n protected readonly themeStore = inject(AXPLayoutThemeService);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly shortcutDisplay = this.shortcutRegistry.formatDisplayKeys([AXE_AI_VOICE_SHELL_SHORTCUT]);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n this.shortcutRegistry.register({\n owner: this.destroyRef,\n id: 'ai-voice-shell',\n priority: AXPKeyboardShortcutPriority.Global,\n group: '@general:keyboard-shortcuts.groups.global',\n shortcuts: [\n {\n keys: [AXE_AI_VOICE_SHELL_SHORTCUT],\n title: '@general:keyboard-shortcuts.actions.open-voice-command',\n allowInEditableFields: true,\n handler: () => {\n this.media.unlockPlayback();\n void this.openVoiceCommand();\n },\n },\n ],\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async openVoiceCommand(): Promise<void> {\n this.media.unlockPlayback();\n await this.commandExecutor.execute(AXE_AI_VOICE_SHELL_OPEN_COMMAND, {});\n }\n\n //#endregion\n}\n\n//#endregion\n","<ax-button\n [iconOnly]=\"true\"\n class=\"relative\"\n [color]=\"themeStore.headerButtonColor()\"\n [look]=\"themeStore.headerButtonLook()\"\n [title]=\"\n ('@extensions-ai-voice-shell:header.open-title' | translate: { params: { shortcut: shortcutDisplay } } | async) ??\n ''\n \"\n [attr.aria-label]=\"\n ('@extensions-ai-voice-shell:header.open-title' | translate: { params: { shortcut: shortcutDisplay } } | async) ??\n ''\n \"\n (onClick)=\"openVoiceCommand()\"\n>\n <ax-icon>\n <i class=\"fa-regular fa-microphone\"></i>\n </ax-icon>\n</ax-button>\n","//#region ----- Imports -----\n\nimport { Injectable } from '@angular/core';\nimport { AXPSearchCommandProvider, AXPSearchResult } from '@acorex-platform/framework-client/common';\nimport { AXE_AI_VOICE_SHELL_OPEN_COMMAND } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\n\n//#endregion\n\n//#region ----- Search -----\n\n@Injectable()\nexport class AXEAiVoiceShellSearchCommandProvider extends AXPSearchCommandProvider {\n commands: AXPSearchResult[] = [\n {\n id: 'open-voice-command-shell',\n group: 'command',\n title: '@extensions-ai-voice-shell:search.open.title',\n icon: 'fa-light fa-microphone',\n description: '@extensions-ai-voice-shell:search.open.description',\n command: {\n name: AXE_AI_VOICE_SHELL_OPEN_COMMAND,\n },\n },\n ];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, inject, signal } from '@angular/core';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXE_AI_VOICE_SHELL_VOICE_SESSION_COMMIT_TURN_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_EXECUTE_TOOL_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_INTERRUPT_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_PUSH_AUDIO_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_START_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_STOP_COMMAND,\n type AXPVoiceOpenRouterAudioPayload,\n type AXPVoiceSessionExecuteToolResult,\n type AXPVoiceSessionStartResult,\n type AXPVoiceShellOpenOptions,\n type AXPVoiceShellUiState,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport type { AXPRealtimeAiVoiceSessionPayload } from '@acorex-platform/framework-client/realtime';\nimport { pcm16ToBase64 } from './voice-openrouter-mic.util';\nimport { AXPVoiceLiveMediaService } from './voice-live-media.service';\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPVoiceCommandShellService {\n //#region ----- Services & Dependencies -----\n\n private readonly popupService = inject(AXPopupService);\n private readonly translation = inject(AXTranslationService);\n private readonly commandService = inject(AXPCommandService);\n private readonly media = inject(AXPVoiceLiveMediaService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly uiState = signal<AXPVoiceShellUiState>('idle');\n readonly statusText = signal('');\n readonly lastTranscript = signal('');\n readonly lastSpoken = signal('');\n readonly errorMessage = signal('');\n readonly conversationId = signal('');\n readonly sessionId = signal('');\n\n //#endregion\n\n //#region ----- Session -----\n\n private openPromise: Promise<void> | null = null;\n private mediaMode: 'openrouter' | 'rtc' | 'vendor' | null = null;\n private lastBargeInAt = 0;\n private speakingStartedAt = 0;\n\n //#endregion\n\n //#region ----- Public API -----\n\n async open(_options?: AXPVoiceShellOpenOptions): Promise<void> {\n if (this.openPromise) {\n return this.openPromise;\n }\n this.media.unlockPlayback();\n this.resetUi();\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.connecting'));\n this.uiState.set('thinking');\n const title = await this.translation.translateAsync('@extensions-ai-voice-shell:dialog.title');\n const { AXEAiVoiceVoidDialogComponent } = await import('./voice-void-dialog/voice-void-dialog.component');\n const popupClosed = this.popupService\n .open(AXEAiVoiceVoidDialogComponent, {\n title,\n size: 'sm',\n header: true,\n closeButton: true,\n maximizable: false,\n draggable: true,\n hasBackdrop: true,\n closeOnBackdropClick: true,\n closeOnEscape: true,\n panelClass: ['axe-ai-voice-shell-popup'],\n })\n .then(() => undefined);\n\n this.openPromise = popupClosed.finally(() => {\n this.openPromise = null;\n void this.hangUp(false);\n });\n\n void this.startLiveSession();\n return this.openPromise;\n }\n\n ensurePlayback(): void {\n this.media.unlockPlayback();\n this.media.restorePlayback();\n }\n\n async hangUp(_closePopup = true): Promise<void> {\n const sessionId = this.sessionId();\n this.mediaMode = null;\n await this.media.disconnect();\n if (sessionId) {\n try {\n await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_STOP_COMMAND, { sessionId });\n } catch {\n // Hang up is best-effort.\n }\n }\n this.resetUi();\n }\n\n async interrupt(): Promise<void> {\n this.media.stopPlayback();\n const sessionId = this.sessionId();\n if (this.mediaMode === 'vendor') {\n await this.media.interruptVendor();\n }\n if (sessionId) {\n await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_INTERRUPT_COMMAND, { sessionId });\n }\n this.uiState.set('listening');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.listening'));\n }\n\n applyRealtime(payload: AXPRealtimeAiVoiceSessionPayload | undefined): void {\n if (!payload?.sessionId || !this.sessionId() || payload.sessionId !== this.sessionId()) {\n return;\n }\n if (payload.conversationId) {\n this.conversationId.set(payload.conversationId);\n }\n if (payload.partialTranscript) {\n this.lastTranscript.set(payload.partialTranscript);\n }\n if (payload.finalTranscript) {\n this.lastTranscript.set(payload.finalTranscript);\n }\n if (payload.spokenDelta) {\n this.lastSpoken.set(payload.spokenDelta);\n }\n if (payload.state === 'ended') {\n void this.releaseLocalSession();\n return;\n }\n if (payload.errorKey) {\n void this.setError(payload.errorKey);\n return;\n }\n void this.applyState(payload.state);\n }\n\n applyOpenRouterAudio(payload: AXPVoiceOpenRouterAudioPayload | undefined): void {\n if (!payload?.sessionId || !this.sessionId() || payload.sessionId !== this.sessionId()) {\n return;\n }\n if (!payload.pcmBase64 || !payload.sampleRate) {\n return;\n }\n this.media.playOpenRouterPcm(payload.pcmBase64, payload.sampleRate);\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n private async startLiveSession(): Promise<void> {\n try {\n const result = await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_START_COMMAND, {});\n const data = runtimeCommandPayloadData(result) as AXPVoiceSessionStartResult | undefined;\n if (!result?.success || !data?.sessionId) {\n const key =\n typeof result?.message?.text === 'string' && result.message.text.startsWith('@')\n ? result.message.text\n : '@extensions-ai-voice-shell:errors.cascade-unavailable';\n await this.setError(key);\n return;\n }\n this.sessionId.set(data.sessionId);\n this.conversationId.set(data.conversationId);\n this.mediaMode = data.mode;\n this.errorMessage.set('');\n if (data.mode === 'openrouter') {\n await this.media.connectOpenRouter({\n onUtterance: (pcm, sampleRate) => {\n void this.pushOpenRouterUtterance(data.sessionId, pcm, sampleRate);\n },\n onSpeechStart: () => this.maybeBargeIn(),\n bargeIn: () => this.uiState() === 'speaking' || this.uiState() === 'thinking',\n });\n } else if (data.mode === 'rtc' && data.rtc) {\n await this.media.connectRtc(data.rtc);\n } else if (data.mode === 'vendor' && data.vendor) {\n await this.media.connectVendor(data.vendor, {\n onSpeaking: (speaking) => {\n this.uiState.set(speaking ? 'speaking' : 'listening');\n },\n onLocalSpeechStart: () => this.maybeBargeIn(),\n onVendorTranscript: (role, text, isFinal) => {\n if (role === 'user') {\n this.lastTranscript.set(text);\n } else {\n this.lastSpoken.set(text);\n }\n if (isFinal) {\n void this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_COMMIT_TURN_COMMAND, {\n sessionId: data.sessionId,\n role,\n text,\n });\n }\n },\n onVendorFunctionCall: (call) => {\n void this.runVendorTool(data.sessionId, call);\n },\n });\n } else {\n await this.setError('@extensions-ai-voice-shell:errors.livekit-inactive');\n return;\n }\n this.uiState.set('listening');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.listening'));\n } catch (err) {\n const key =\n err instanceof Error && err.message.startsWith('@')\n ? err.message\n : '@extensions-ai-voice-shell:errors.cascade-unavailable';\n await this.hangUp(false);\n await this.setError(key);\n }\n }\n\n private maybeBargeIn(): void {\n if (this.mediaMode === 'rtc') {\n return;\n }\n const state = this.uiState();\n if (state !== 'speaking' && state !== 'thinking') {\n return;\n }\n if (state === 'speaking' && Date.now() - this.speakingStartedAt < 250) {\n return;\n }\n const now = Date.now();\n if (now - this.lastBargeInAt < 400) {\n return;\n }\n this.lastBargeInAt = now;\n this.media.stopPlayback();\n void this.interrupt();\n }\n\n private async pushOpenRouterUtterance(\n sessionId: string,\n pcm: Int16Array,\n sampleRate: number,\n ): Promise<void> {\n if (!sessionId || pcm.length < 2) {\n return;\n }\n try {\n await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_PUSH_AUDIO_COMMAND, {\n sessionId,\n pcmBase64: pcm16ToBase64(pcm),\n sampleRate,\n });\n } catch (err) {\n const key =\n err instanceof Error && err.message.startsWith('@')\n ? err.message\n : '@extensions-ai-voice-shell:errors.transcribe-failed';\n await this.setError(key);\n }\n }\n\n private async runVendorTool(\n sessionId: string,\n call: { callId: string; name: string; argumentsJson: string },\n ): Promise<void> {\n try {\n const result = await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_EXECUTE_TOOL_COMMAND, {\n sessionId,\n name: call.name,\n argumentsJson: call.argumentsJson,\n });\n const data = runtimeCommandPayloadData(result) as AXPVoiceSessionExecuteToolResult | undefined;\n this.media.sendVendorFunctionOutput(call.callId, data?.output ?? '{\"ok\":false}');\n } catch {\n this.media.sendVendorFunctionOutput(call.callId, '{\"ok\":false}');\n }\n }\n\n private async applyState(state: AXPRealtimeAiVoiceSessionPayload['state']): Promise<void> {\n const map: Record<string, AXPVoiceShellUiState> = {\n connecting: 'thinking',\n listening: 'listening',\n thinking: 'thinking',\n speaking: 'speaking',\n interrupted: 'listening',\n ended: 'idle',\n error: 'error',\n };\n this.uiState.set(map[state] ?? 'listening');\n if (state !== 'error' && state !== 'ended') {\n this.errorMessage.set('');\n }\n if (state === 'interrupted') {\n this.media.stopPlayback();\n }\n if (state === 'speaking') {\n this.speakingStartedAt = Date.now();\n this.media.restorePlayback();\n }\n const key =\n state === 'connecting'\n ? '@extensions-ai-voice-shell:states.connecting'\n : state === 'listening'\n ? '@extensions-ai-voice-shell:states.listening'\n : state === 'thinking'\n ? '@extensions-ai-voice-shell:states.thinking'\n : state === 'speaking'\n ? '@extensions-ai-voice-shell:states.speaking'\n : state === 'interrupted'\n ? '@extensions-ai-voice-shell:states.interrupted'\n : state === 'error'\n ? '@extensions-ai-voice-shell:states.error'\n : '@extensions-ai-voice-shell:states.listening';\n this.statusText.set(await this.translation.translateAsync(key));\n }\n\n private async setError(key: string): Promise<void> {\n this.errorMessage.set(await this.translation.translateAsync(key));\n this.uiState.set('error');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.error'));\n }\n\n /** Another tab/profile started a session for this user, or the server stopped us. */\n private async releaseLocalSession(): Promise<void> {\n this.mediaMode = null;\n this.sessionId.set('');\n await this.media.disconnect();\n this.resetUi();\n }\n\n private resetUi(): void {\n this.sessionId.set('');\n this.conversationId.set('');\n this.uiState.set('idle');\n this.statusText.set('');\n this.lastTranscript.set('');\n this.lastSpoken.set('');\n this.errorMessage.set('');\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { NgModule } from '@angular/core';\nimport { AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n AXPComponentSlotModule,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXMAiManagementModule } from '@acorex-platform/module-ai-management-client';\nimport {\n AXE_AI_VOICE_OPENROUTER_AUDIO_TOPIC,\n AXE_AI_VOICE_SHELL_OPEN_COMMAND,\n type AXPVoiceOpenRouterAudioPayload,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport {\n AXPRealtimeDispatcherService,\n AXP_REALTIME_TOPIC_AI_VOICE_SESSION,\n type AXPRealtimeAiVoiceSessionPayload,\n} from '@acorex-platform/framework-client/realtime';\nimport { inject } from '@angular/core';\nimport { AXEAiVoiceShellHeaderSlotComponent } from './voice-shell-header-slot.component';\nimport { AXEAiVoiceShellSearchCommandProvider } from './voice-shell-search.provider';\nimport { AXPVoiceCommandShellService } from './voice-command-shell.service';\n\n//#endregion\n\n//#region ----- Module -----\n\n/**\n * Central live voice AI shell (void dialog + Conversation room + OpenRouter cascade).\n */\n@NgModule({\n imports: [\n AXMAiManagementModule,\n AXPComponentSlotModule.forChild({\n 'root-header-end': [\n {\n // Immediately after conversation mini-chat (55) so mic + robot sit as one AI cluster.\n priority: 56,\n name: 'ai-voice-shell',\n component: AXEAiVoiceShellHeaderSlotComponent,\n },\n ],\n }),\n ],\n providers: [\n {\n provide: AXP_SEARCH_PROVIDER,\n useClass: AXEAiVoiceShellSearchCommandProvider,\n multi: true,\n },\n provideCommandSetups([\n {\n key: AXE_AI_VOICE_SHELL_OPEN_COMMAND,\n command: () =>\n import('./commands/open-voice-command-shell.command').then((c) => c.AXEAiVoiceShellOpenCommand),\n },\n ]),\n provideAppStartUpTask(() => {\n const dispatcher = inject(AXPRealtimeDispatcherService, { optional: true });\n const shell = inject(AXPVoiceCommandShellService);\n return {\n name: 'ai-voice-shell-realtime',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeHandlers,\n run: async () => {\n dispatcher?.register({\n topic: AXP_REALTIME_TOPIC_AI_VOICE_SESSION,\n handle: (envelope) => {\n shell.applyRealtime(envelope.payload as AXPRealtimeAiVoiceSessionPayload);\n },\n });\n dispatcher?.register({\n topic: AXE_AI_VOICE_OPENROUTER_AUDIO_TOPIC,\n handle: (envelope) => {\n shell.applyOpenRouterAudio(envelope.payload as AXPVoiceOpenRouterAudioPayload);\n },\n });\n },\n };\n }),\n ],\n})\nexport class AXEAiVoiceShellExtensionModule {}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPVoiceCapabilityProvider } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\n\n//#endregion\n\n//#region ----- Tokens -----\n\n/** Multi-provider token for domain voice capabilities (assessment, later others). */\nexport const AXP_VOICE_CAPABILITY_PROVIDER = new InjectionToken<AXPVoiceCapabilityProvider>(\n 'AXP_VOICE_CAPABILITY_PROVIDER',\n);\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, inject } from '@angular/core';\nimport type {\n AXPVoiceCapabilityIntent,\n AXPVoiceCapabilityProvider,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXP_VOICE_CAPABILITY_PROVIDER } from './voice-capability.tokens';\n\n//#endregion\n\n//#region ----- Registry -----\n\n/**\n * Discovers module-owned {@link AXPVoiceCapabilityProvider} implementations.\n * The shell never imports domain internals.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPVoiceCapabilityRegistry {\n //#region ----- Services & Dependencies -----\n\n private readonly providers = inject(AXP_VOICE_CAPABILITY_PROVIDER, { optional: true }) ?? [];\n\n //#endregion\n\n //#region ----- Public API -----\n\n list(): AXPVoiceCapabilityProvider[] {\n const raw = this.providers;\n return Array.isArray(raw) ? raw : raw ? [raw] : [];\n }\n\n getById(id: string): AXPVoiceCapabilityProvider | undefined {\n const trimmed = id.trim();\n if (!trimmed) {\n return undefined;\n }\n return this.list().find((provider) => provider.id === trimmed);\n }\n\n async findForIntent(intent: AXPVoiceCapabilityIntent): Promise<AXPVoiceCapabilityProvider | undefined> {\n for (const provider of this.list()) {\n if (await provider.canHandle(intent)) {\n return provider;\n }\n }\n return undefined;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, inject } from '@angular/core';\nimport {\n AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY,\n AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY,\n AXPAiChatToolRunContextService,\n AXPAiManagerService,\n AXPAiPlatformRuntimeContextBuilder,\n createBrowserPlayableTtsBlobUrl,\n persistAiChatAttachmentImage,\n} from '@acorex-platform/module-ai-management-client';\nimport { RootConfig } from '@acorex-platform/module-ai-management-client/contracts';\nimport type {\n AXPVoiceInteractionTransport,\n AXPVoiceSttResult,\n AXPVoiceTtsResult,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { createRandomUuid, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport { first } from 'lodash';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst SPEECH_TO_TEXT_AGENT_NAME = 'speech-to-text';\nconst TEXT_TO_SPEECH_AGENT_NAME = 'text-to-speech';\n\n//#endregion\n\n//#region ----- Transport -----\n\n/**\n * v1 interaction transport: existing AI HTTP commands + assist `run` (SSE under the hood).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPHttpSseVoiceTransport implements AXPVoiceInteractionTransport {\n //#region ----- Services & Dependencies -----\n\n readonly id = 'http-sse';\n\n private readonly commandService = inject(AXPCommandService);\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly entityService = inject(AXPEntityService);\n private readonly chatToolRunContext = inject(AXPAiChatToolRunContextService);\n private readonly runtimeContextBuilder = inject(AXPAiPlatformRuntimeContextBuilder);\n private readonly aiManager = inject(AXPAiManagerService, { optional: true });\n\n //#endregion\n\n //#region ----- Public API -----\n\n async transcribe(audio: Blob, options?: { language?: string }): Promise<AXPVoiceSttResult> {\n const aiManager = this.requireAiManager();\n const assist = await aiManager.getAssistForChat();\n const assistId = assist.id?.trim();\n if (!assistId) {\n throw new Error('No AI assist is configured for speech transcription.');\n }\n const chatTransport = (await aiManager.getAssistPrimaryChatTransport(assistId)) ?? 'openai';\n const agentId = await this.findAgentIdByName(SPEECH_TO_TEXT_AGENT_NAME);\n const mimeType = audio.type?.trim() || 'audio/webm';\n const file = new File([audio], `voice-${Date.now()}.webm`, { type: mimeType });\n const { fileId } = await persistAiChatAttachmentImage(\n this.fileStorage,\n file,\n createRandomUuid(),\n );\n const language =\n options?.language?.trim() ||\n this.localeToTranscriptionLanguage(await this.resolveUiLocale());\n\n this.chatToolRunContext.setContext({\n assistId,\n chatTransport,\n ...(agentId ? { agentId } : {}),\n });\n try {\n const result = await this.commandService.execute(AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, {\n fileId,\n assistId,\n ...(agentId ? { agentId } : {}),\n ...(language ? { language } : {}),\n });\n const data = runtimeCommandPayloadData(result) as { text?: string } | undefined;\n const text = typeof data?.text === 'string' ? data.text.trim() : '';\n if (!result?.success || !text) {\n throw new Error(this.commandFailureI18nKey(result, '@extensions-ai-voice-shell:errors.transcribe-failed'));\n }\n return { text };\n } finally {\n this.chatToolRunContext.setContext(null);\n }\n }\n\n async synthesize(text: string): Promise<AXPVoiceTtsResult> {\n const trimmed = text.trim();\n if (!trimmed) {\n return { text: '' };\n }\n const aiManager = this.requireAiManager();\n const assist = await aiManager.getAssistForChat();\n const assistId = assist.id?.trim();\n if (!assistId) {\n throw new Error('No AI assist is configured for speech synthesis.');\n }\n const chatTransport = (await aiManager.getAssistPrimaryChatTransport(assistId)) ?? 'openai';\n const agentId = await this.findAgentIdByName(TEXT_TO_SPEECH_AGENT_NAME);\n\n this.chatToolRunContext.setContext({\n assistId,\n chatTransport,\n ...(agentId ? { agentId } : {}),\n });\n try {\n const result = await this.commandService.executeRemote(AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY, {\n text: trimmed,\n assistId,\n ...(agentId ? { agentId } : {}),\n });\n const data = runtimeCommandPayloadData(result) as { fileId?: string; text?: string } | undefined;\n const fileId = typeof data?.fileId === 'string' ? data.fileId.trim() : '';\n if (!result?.success || !fileId) {\n throw new Error(this.commandFailureI18nKey(result, '@extensions-ai-voice-shell:errors.assist-failed'));\n }\n const info = await this.fileStorage.getInfo(fileId);\n const binary = await this.fileStorage.download(fileId);\n const objectUrl = await createBrowserPlayableTtsBlobUrl(\n binary,\n info?.mimeType ?? binary.type,\n info?.name,\n );\n return { fileId, objectUrl, text: typeof data?.text === 'string' ? data.text : trimmed };\n } finally {\n this.chatToolRunContext.setContext(null);\n }\n }\n\n async runAssist(prompt: string, context?: Record<string, unknown>): Promise<{ text: string }> {\n const aiManager = this.requireAiManager();\n const result = await aiManager.run({\n prompt,\n context: {\n systemInstruction:\n 'You are the platform voice command assistant. Prefer AI-compatible tools. Keep spoken replies short. Confirm before destructive or submit actions.',\n structuredContext: context,\n },\n });\n return { text: result.text?.trim() ?? '' };\n }\n\n //#endregion\n\n //#region ----- Private helpers -----\n\n private requireAiManager(): AXPAiManagerService {\n if (!this.aiManager) {\n throw new Error('AI manager service is not available.');\n }\n return this.aiManager;\n }\n\n private async findAgentIdByName(name: string): Promise<string | undefined> {\n const list = await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.agent.name)\n .data<string, { id: string }>()\n .query({\n skip: 0,\n take: 1,\n filter: {\n field: 'name',\n operator: { type: 'equal' },\n value: name,\n },\n });\n return first(list.items)?.id;\n }\n\n private async resolveUiLocale(): Promise<string | undefined> {\n const ctx = await this.runtimeContextBuilder.build();\n const locale = ctx['locale'];\n return typeof locale === 'string' && locale.trim() ? locale.trim() : undefined;\n }\n\n private commandFailureI18nKey(\n result: { message?: { text?: unknown } } | null | undefined,\n fallbackKey: string,\n ): string {\n const text = typeof result?.message?.text === 'string' ? result.message.text.trim() : '';\n return text.startsWith('@') ? text : fallbackKey;\n }\n\n private localeToTranscriptionLanguage(locale: string | undefined): string | undefined {\n const primary = locale?.trim().split('-')[0]?.toLowerCase();\n return primary || undefined;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPVoiceShellOpenOptions } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPVoiceCommandShellService } from '../voice-command-shell.service';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXEAiVoiceShellOpenCommandInput {\n initialText?: string;\n capabilityId?: string;\n caseId?: string;\n sessionId?: string;\n}\n\n//#endregion\n\n//#region ----- Command -----\n\n@Injectable()\nexport class AXEAiVoiceShellOpenCommand implements AXPCommand<AXEAiVoiceShellOpenCommandInput, void> {\n //#region ----- Services & Dependencies -----\n\n private readonly shell = inject(AXPVoiceCommandShellService);\n\n //#endregion\n\n //#region ----- Command execution -----\n\n async execute(input: AXEAiVoiceShellOpenCommandInput): AXPCommandExecuteResultPromise<void> {\n const startInput =\n input?.caseId || input?.sessionId\n ? { caseId: input.caseId, sessionId: input.sessionId }\n : input?.initialText\n ? { text: input.initialText }\n : undefined;\n const options: AXPVoiceShellOpenOptions = {\n initialText: input?.initialText,\n capabilityId: input?.capabilityId,\n startInput,\n };\n await this.shell.open(options);\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, ViewEncapsulation } from '@angular/core';\nimport { AXPVoiceCommandShellService } from '../voice-command-shell.service';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axe-ai-voice-void-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXTranslationModule],\n templateUrl: './voice-void-dialog.component.html',\n styleUrl: './voice-void-dialog.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXEAiVoiceVoidDialogComponent extends AXBasePageComponent {\n //#region ----- Services & Dependencies -----\n\n readonly shell = inject(AXPVoiceCommandShellService);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n readonly orbClass = computed(() => `voice-void-orb voice-void-orb--${this.shell.uiState()}`);\n readonly orbWrapClass = computed(() => `voice-void-orb-wrap voice-void-orb-wrap--${this.shell.uiState()}`);\n readonly isListening = computed(() => this.shell.uiState() === 'listening');\n readonly isSpeaking = computed(() => this.shell.uiState() === 'speaking');\n readonly isBusy = computed(() => {\n const state = this.shell.uiState();\n return state === 'thinking' || state === 'listening' || state === 'speaking';\n });\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n async onHangUp(): Promise<void> {\n await this.shell.hangUp(false);\n this.close();\n }\n\n async onOrbClick(): Promise<void> {\n this.shell.ensurePlayback();\n if (this.isSpeaking()) {\n await this.shell.interrupt();\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"voice-void\">\n <div class=\"voice-void-stage\">\n <!-- ----- Listening / thinking / speaking orb ----- -->\n <div [class]=\"orbWrapClass()\">\n <span class=\"voice-void-ring voice-void-ring--1\" aria-hidden=\"true\"></span>\n <span class=\"voice-void-ring voice-void-ring--2\" aria-hidden=\"true\"></span>\n <span class=\"voice-void-ring voice-void-ring--3\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n [class]=\"orbClass()\"\n (click)=\"onOrbClick()\"\n [attr.aria-label]=\"'@extensions-ai-voice-shell:actions.interrupt' | translate | async\"\n >\n @if (isSpeaking()) {\n <!-- ----- AI is speaking; click interrupts ----- -->\n <i class=\"fa-regular fa-volume-high\"></i>\n }\n <!-- ----- Live microphone ----- -->\n @else {\n <i class=\"fa-regular fa-microphone\"></i>\n }\n </button>\n @if (isBusy()) {\n <!-- ----- Waveform bars: user listen vs AI speak ----- -->\n <span class=\"voice-void-eq\" aria-hidden=\"true\">\n <span></span>\n <span></span>\n <span></span>\n <span></span>\n <span></span>\n </span>\n }\n </div>\n\n <p class=\"voice-void-status\">{{ shell.statusText() }}</p>\n\n @if (shell.lastSpoken()) {\n <!-- ----- Last spoken assistant text ----- -->\n <p class=\"voice-void-spoken\">{{ shell.lastSpoken() }}</p>\n }\n\n @if (shell.lastTranscript()) {\n <!-- ----- Last user transcript ----- -->\n <p class=\"voice-void-transcript\">{{ shell.lastTranscript() }}</p>\n }\n\n @if (shell.errorMessage()) {\n <!-- ----- Spoken / visible error ----- -->\n <p class=\"voice-void-error\">{{ shell.errorMessage() }}</p>\n }\n </div>\n\n <!-- ----- Hang up ends the live session ----- -->\n <div class=\"voice-void-toolbar\">\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.hang-up' | translate | async\"\n color=\"danger\"\n (onClick)=\"onHangUp()\"\n ></ax-button>\n </div>\n\n <p class=\"voice-void-hint\">{{ '@extensions-ai-voice-shell:dialog.hint' | translate | async }}</p>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-ai-voice-shell-client.mjs","sources":["../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-livekit.loader.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-live-rtc-connect.util.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-openrouter-mic.util.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-live-media.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-shell-header-slot.component.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-shell-header-slot.component.html","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-shell-search.provider.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-command-shell.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/ai-voice-shell-extension.module.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-capability.tokens.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-capability-registry.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/transport/http-sse-voice-transport.service.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/commands/open-voice-command-shell.command.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-void-dialog/voice-void-dialog.component.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-void-dialog/voice-void-dialog.component.html","../../../../libs/extensions/ai/voice-shell/client/src/acorex-platform-extension-ai-voice-shell-client.ts"],"sourcesContent":["//#region ----- Types -----\n\nexport type LiveKitClient = typeof import('livekit-client');\n\n//#endregion\n\n//#region ----- Loader -----\n\nlet pending: Promise<LiveKitClient> | null = null;\n\n/** Loads the LiveKit browser SDK once, when a voice session connects over RTC. */\nexport function loadLiveKitClient(): Promise<LiveKitClient> {\n pending ??= import('livekit-client');\n return pending;\n}\n\n//#endregion\n","//#region ----- LiveKit connect options -----\n\n/** Extra time for ICE on local / Docker Desktop. Matches chat-call joins. */\nexport const AXE_VOICE_LIVE_PEER_CONNECTION_TIMEOUT_MS = 45_000;\n\nconst DEFAULT_DEV_LIVEKIT_WS_PROXY_PATH = '/livekit-ws';\n\nfunction axeIsLocalDevHostname(hostname: string): boolean {\n const normalized = hostname.trim().toLowerCase();\n return normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '[::1]';\n}\n\n/**\n * Route LiveKit signaling the same way chat calls do:\n * proxy only when the UI host and LiveKit host disagree (one local, one not).\n * Local UI + local LiveKit (`ws://127.0.0.1:7880`) connects directly.\n */\nexport function axeResolveVoiceLiveKitServerUrl(serverUrl: string | undefined): string {\n const trimmed = serverUrl?.trim();\n if (!trimmed || typeof window === 'undefined') {\n return trimmed ?? '';\n }\n\n try {\n const resolved = new URL(trimmed);\n const localUi = axeIsLocalDevHostname(window.location.hostname);\n const localLiveKit = axeIsLocalDevHostname(resolved.hostname);\n const useDevProxy = (localUi && !localLiveKit) || (!localUi && localLiveKit);\n if (!useDevProxy) {\n return trimmed;\n }\n\n const proxy = new URL(window.location.origin);\n proxy.pathname = DEFAULT_DEV_LIVEKIT_WS_PROXY_PATH;\n return proxy.toString().replace(/\\/$/, '');\n } catch {\n return trimmed;\n }\n}\n\n/** Preferred URL first, then the token URL and same-origin `/livekit-ws` as fallbacks. */\nexport function axeVoiceLiveKitConnectUrls(serverUrl: string): string[] {\n const trimmed = serverUrl.trim();\n const urls: string[] = [];\n const add = (url: string) => {\n const next = url.trim();\n if (next && !urls.includes(next)) {\n urls.push(next);\n }\n };\n add(axeResolveVoiceLiveKitServerUrl(trimmed));\n add(trimmed);\n if (typeof window !== 'undefined' && axeIsLocalDevHostname(window.location.hostname)) {\n add(`${window.location.origin.replace(/^http/i, 'ws')}/livekit-ws`);\n }\n return urls.length ? urls : [trimmed];\n}\n\nexport function axeVoiceLiveRoomConnectOptions(\n serverUrl?: string,\n iceServers?: RTCIceServer[],\n forceRelay?: boolean,\n): {\n peerConnectionTimeout: number;\n rtcConfig?: RTCConfiguration;\n} {\n const options: {\n peerConnectionTimeout: number;\n rtcConfig?: RTCConfiguration;\n } = {\n peerConnectionTimeout: AXE_VOICE_LIVE_PEER_CONNECTION_TIMEOUT_MS,\n };\n\n if (forceRelay) {\n options.rtcConfig = { iceTransportPolicy: 'relay' };\n return options;\n }\n\n if (iceServers?.length) {\n options.rtcConfig = { iceServers };\n return options;\n }\n\n if (isLocalLiveKitUrl(serverUrl)) {\n options.rtcConfig = { iceTransportPolicy: 'all' };\n }\n\n return options;\n}\n\nfunction isLocalLiveKitUrl(serverUrl: string | undefined): boolean {\n if (!serverUrl?.trim()) {\n return false;\n }\n try {\n const url = new URL(serverUrl.trim());\n return axeIsLocalDevHostname(url.hostname);\n } catch {\n return false;\n }\n}\n\n//#endregion\n","//#region ----- Constants -----\n\nconst VAD = {\n rmsThreshold: 500,\n hangInMs: 80,\n bargeInHangInMs: 280,\n hangInGraceMs: 160,\n silenceHangoverMs: 700,\n minUtteranceMs: 280,\n minUtteranceRms: 180,\n maxUtteranceMs: 8_000,\n prerollMs: 200,\n} as const;\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXPVoiceOpenRouterVadEvent =\n | { event: 'start' }\n | { event: 'end'; pcm: Int16Array; sampleRate: number }\n | { event: 'cancel' };\n\nexport interface AXPVoiceOpenRouterMicHandle {\n stop(): void;\n}\n\n//#endregion\n\n//#region ----- PCM helpers -----\n\nexport function float32ToPcm16(input: Float32Array): Int16Array {\n const out = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const clamped = Math.max(-1, Math.min(1, input[i] ?? 0));\n out[i] = clamped < 0 ? Math.round(clamped * 0x8000) : Math.round(clamped * 0x7fff);\n }\n return out;\n}\n\nexport function pcm16Rms(pcm: Int16Array): number {\n if (pcm.length <= 0) {\n return 0;\n }\n let sumSquares = 0;\n for (let i = 0; i < pcm.length; i++) {\n const sample = pcm[i] ?? 0;\n sumSquares += sample * sample;\n }\n return Math.sqrt(sumSquares / pcm.length);\n}\n\nexport function pcm16ToBase64(pcm: Int16Array): string {\n const bytes = new Uint8Array(pcm.buffer, pcm.byteOffset, pcm.byteLength);\n const chunk = 0x2000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunk) {\n const slice = bytes.subarray(i, Math.min(i + chunk, bytes.length));\n binary += String.fromCharCode(...slice);\n }\n return btoa(binary);\n}\n\nexport function base64ToPcm16(raw: string): Int16Array | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const binary = atob(trimmed);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n const even = bytes.byteLength - (bytes.byteLength % 2);\n if (even < 2) {\n return null;\n }\n return new Int16Array(bytes.buffer, bytes.byteOffset, even / 2);\n } catch {\n return null;\n }\n}\n\n//#endregion\n\n//#region ----- Energy VAD -----\n\nexport class AXPVoiceOpenRouterEnergyVad {\n private preroll: Int16Array = new Int16Array(0);\n private utterance: Int16Array = new Int16Array(0);\n private speaking = false;\n private hangInMs = 0;\n private hangInSilenceMs = 0;\n private silenceMs = 0;\n private utteranceMs = 0;\n private sampleRate = 48_000;\n\n push(pcm16: Int16Array, sampleRate: number, bargeIn = false): AXPVoiceOpenRouterVadEvent | null {\n if (pcm16.length < 2 || sampleRate <= 0) {\n return null;\n }\n this.sampleRate = sampleRate;\n const frameMs = (pcm16.length / sampleRate) * 1000;\n const voiced = pcm16Rms(pcm16) >= VAD.rmsThreshold;\n const hangInNeedMs = bargeIn ? VAD.bargeInHangInMs : VAD.hangInMs;\n\n if (!this.speaking) {\n this.appendPreroll(pcm16, sampleRate);\n if (!voiced) {\n if (this.hangInMs <= 0) {\n return null;\n }\n this.hangInSilenceMs += frameMs;\n this.utterance = concatPcm(this.utterance, pcm16);\n this.utteranceMs += frameMs;\n if (this.hangInSilenceMs >= VAD.hangInGraceMs) {\n this.hangInMs = 0;\n this.hangInSilenceMs = 0;\n this.utterance = new Int16Array(0);\n this.utteranceMs = 0;\n }\n return null;\n }\n this.hangInSilenceMs = 0;\n if (this.hangInMs <= 0) {\n this.utterance = concatPcm(this.preroll, pcm16);\n this.preroll = new Int16Array(0);\n this.utteranceMs = frameMs;\n } else {\n this.utterance = concatPcm(this.utterance, pcm16);\n this.utteranceMs += frameMs;\n }\n this.hangInMs += frameMs;\n if (this.hangInMs < hangInNeedMs) {\n return null;\n }\n this.speaking = true;\n this.silenceMs = 0;\n return { event: 'start' };\n }\n\n this.utterance = concatPcm(this.utterance, pcm16);\n this.utteranceMs += frameMs;\n this.silenceMs = voiced ? 0 : this.silenceMs + frameMs;\n const ended =\n this.silenceMs >= VAD.silenceHangoverMs || this.utteranceMs >= VAD.maxUtteranceMs;\n if (!ended) {\n return null;\n }\n\n const captured = this.utterance;\n const durationMs = this.utteranceMs;\n const trailingSilenceMs = this.silenceMs;\n const rate = this.sampleRate;\n this.reset();\n const hangoverSamples = Math.max(0, Math.floor((rate * trailingSilenceMs) / 1000));\n const spoken =\n hangoverSamples > 0 && captured.length > hangoverSamples + 1\n ? captured.subarray(0, captured.length - hangoverSamples)\n : captured;\n const spokenMs = Math.max(0, durationMs - trailingSilenceMs);\n if (\n spokenMs < VAD.minUtteranceMs ||\n spoken.length < 2 ||\n pcm16Rms(spoken) < VAD.minUtteranceRms\n ) {\n return { event: 'cancel' };\n }\n return { event: 'end', pcm: spoken, sampleRate: rate };\n }\n\n reset(): void {\n this.preroll = new Int16Array(0);\n this.utterance = new Int16Array(0);\n this.speaking = false;\n this.hangInMs = 0;\n this.hangInSilenceMs = 0;\n this.silenceMs = 0;\n this.utteranceMs = 0;\n }\n\n private appendPreroll(pcm16: Int16Array, sampleRate: number): void {\n const maxSamples = Math.max(1, Math.floor((sampleRate * VAD.prerollMs) / 1000));\n this.preroll = concatPcm(this.preroll, pcm16);\n if (this.preroll.length > maxSamples) {\n this.preroll = this.preroll.subarray(this.preroll.length - maxSamples);\n }\n }\n}\n\nfunction concatPcm(left: Int16Array, right: Int16Array): Int16Array {\n const out = new Int16Array(left.length + right.length);\n out.set(left, 0);\n out.set(right, left.length);\n return out;\n}\n\n//#endregion\n\n//#region ----- Mic capture -----\n\nexport function startOpenRouterMicCapture(options: {\n context: AudioContext;\n stream: MediaStream;\n onUtterance: (pcm: Int16Array, sampleRate: number) => void;\n onSpeechStart?: () => void;\n bargeIn?: () => boolean;\n}): AXPVoiceOpenRouterMicHandle {\n const source = options.context.createMediaStreamSource(options.stream);\n const processor = options.context.createScriptProcessor(2048, 1, 1);\n const silent = options.context.createGain();\n silent.gain.value = 0;\n const vad = new AXPVoiceOpenRouterEnergyVad();\n processor.onaudioprocess = (event) => {\n const input = event.inputBuffer.getChannelData(0);\n const pcm = float32ToPcm16(input);\n const result = vad.push(pcm, options.context.sampleRate, options.bargeIn?.() === true);\n if (!result) {\n return;\n }\n if (result.event === 'start') {\n options.onSpeechStart?.();\n return;\n }\n if (result.event === 'end') {\n options.onUtterance(result.pcm, result.sampleRate);\n }\n };\n source.connect(processor);\n processor.connect(silent);\n silent.connect(options.context.destination);\n return {\n stop: () => {\n processor.onaudioprocess = null;\n try {\n processor.disconnect();\n } catch {\n // ignore\n }\n try {\n source.disconnect();\n } catch {\n // ignore\n }\n try {\n silent.disconnect();\n } catch {\n // ignore\n }\n vad.reset();\n },\n };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable } from '@angular/core';\nimport type { RemoteAudioTrack, Room, Track } from 'livekit-client';\nimport type { AXPVoiceLiveRtcJoin, AXPVoiceLiveVendorJoin } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { loadLiveKitClient, type LiveKitClient } from './voice-livekit.loader';\nimport { axeVoiceLiveKitConnectUrls, axeVoiceLiveRoomConnectOptions } from './voice-live-rtc-connect.util';\nimport {\n base64ToPcm16,\n startOpenRouterMicCapture,\n type AXPVoiceOpenRouterMicHandle,\n} from './voice-openrouter-mic.util';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXPVoiceLiveMediaCallbacks {\n onVendorTranscript?: (role: 'user' | 'assistant', text: string, isFinal: boolean) => void;\n onSpeaking?: (speaking: boolean) => void;\n onLocalSpeechStart?: () => void;\n onVendorFunctionCall?: (call: { callId: string; name: string; argumentsJson: string }) => void;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPVoiceLiveMediaService {\n private rtcRoom: Room | null = null;\n private livekit: LiveKitClient | null = null;\n private peer: RTCPeerConnection | null = null;\n private localStream: MediaStream | null = null;\n private playbackAudio: HTMLAudioElement | null = null;\n private audioContext: AudioContext | null = null;\n private dataChannel: RTCDataChannel | null = null;\n private audioSink: HTMLElement | null = null;\n private readonly remoteAudioElements = new Map<string, { track: RemoteAudioTrack; element: HTMLMediaElement }>();\n private openRouterMic: AXPVoiceOpenRouterMicHandle | null = null;\n private openRouterPlayAt = 0;\n private openRouterGeneration = 0;\n private readonly openRouterSources = new Set<AudioBufferSourceNode>();\n\n /**\n * Must run in the same user-gesture turn as the mic click (before any await).\n * Do not call getUserMedia here — a second Chrome profile will prompt twice and\n * the extra stream can lock the device before LiveKit publishes the mic.\n */\n unlockPlayback(): void {\n this.ensureAudioContext();\n this.playAttachedAudio();\n void this.rtcRoom?.startAudio().catch(() => undefined);\n }\n\n async connectRtc(join: AXPVoiceLiveRtcJoin, callbacks?: AXPVoiceLiveMediaCallbacks): Promise<void> {\n await this.teardownRtc();\n this.stopOpenRouterMic();\n this.stopOpenRouterPlayback();\n const urls = axeVoiceLiveKitConnectUrls(join.serverUrl);\n let lastErr: unknown;\n const livekit = await this.ensureLiveKit();\n for (const url of urls) {\n const room = this.createRtcRoom(livekit, callbacks);\n this.rtcRoom = room;\n try {\n await room.connect(url, join.token, axeVoiceLiveRoomConnectOptions(url, join.iceServers, join.forceRelay));\n this.attachExistingRemoteAudio(room);\n await room.startAudio().catch((err) => {\n console.warn('LiveKit startAudio failed', err);\n });\n try {\n await room.localParticipant.setMicrophoneEnabled(true);\n } catch (err) {\n throw new Error(voiceMediaErrorKey(err));\n }\n return;\n } catch (err) {\n lastErr = err;\n console.error(`LiveKit connectRtc failed (${url})`, err);\n await this.teardownRtc();\n const key = err instanceof Error && err.message.startsWith('@') ? err.message : voiceMediaErrorKey(err);\n if (key !== '@extensions-ai-voice-shell:errors.livekit-inactive') {\n throw new Error(key);\n }\n }\n }\n throw lastErr instanceof Error && lastErr.message.startsWith('@')\n ? lastErr\n : new Error(voiceMediaErrorKey(lastErr));\n }\n\n async connectOpenRouter(callbacks: {\n onUtterance: (pcm: Int16Array, sampleRate: number) => void;\n onSpeechStart?: () => void;\n bargeIn?: () => boolean;\n }): Promise<void> {\n await this.teardownRtc();\n this.stopOpenRouterMic();\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true }).catch((err: unknown) => {\n throw new Error(voiceMediaErrorKey(err));\n });\n this.localStream = stream;\n const context = this.ensureAudioContext();\n if (!context) {\n stream.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n throw new Error('@extensions-ai-voice-shell:errors.mic-unavailable');\n }\n await context.resume().catch(() => undefined);\n this.openRouterMic = startOpenRouterMicCapture({\n context,\n stream,\n onUtterance: callbacks.onUtterance,\n onSpeechStart: callbacks.onSpeechStart,\n bargeIn: callbacks.bargeIn,\n });\n }\n\n playOpenRouterPcm(pcmBase64: string, sampleRate: number): void {\n const pcm = base64ToPcm16(pcmBase64);\n const context = this.ensureAudioContext();\n if (!pcm || !context || sampleRate <= 0) {\n return;\n }\n void context.resume().catch(() => undefined);\n const buffer = context.createBuffer(1, pcm.length, sampleRate);\n const channel = buffer.getChannelData(0);\n for (let i = 0; i < pcm.length; i++) {\n channel[i] = (pcm[i] ?? 0) / 32768;\n }\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(context.destination);\n const generation = this.openRouterGeneration;\n source.onended = () => {\n this.openRouterSources.delete(source);\n };\n const startAt = Math.max(context.currentTime, this.openRouterPlayAt);\n this.openRouterPlayAt = startAt + buffer.duration;\n this.openRouterSources.add(source);\n try {\n source.start(startAt);\n } catch {\n this.openRouterSources.delete(source);\n }\n if (generation !== this.openRouterGeneration) {\n try {\n source.stop();\n } catch {\n // ignore\n }\n }\n }\n\n async connectVendor(join: AXPVoiceLiveVendorJoin, callbacks: AXPVoiceLiveMediaCallbacks): Promise<void> {\n await this.teardownRtc();\n this.stopOpenRouterMic();\n this.stopOpenRouterPlayback();\n if (join.transport !== 'openai') {\n throw new Error('@extensions-ai-voice-shell:errors.livekit-inactive');\n }\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true }).catch((err: unknown) => {\n throw new Error(voiceMediaErrorKey(err));\n });\n this.localStream = stream;\n const peer = new RTCPeerConnection();\n this.peer = peer;\n stream.getTracks().forEach((track) => peer.addTrack(track, stream));\n peer.ontrack = (event) => {\n const [remote] = event.streams;\n if (remote) {\n this.attachMediaStream(remote);\n }\n };\n const channel = peer.createDataChannel('oai-events');\n this.dataChannel = channel;\n channel.addEventListener('message', (event) => {\n this.handleVendorEvent(event.data, callbacks);\n });\n const offer = await peer.createOffer();\n await peer.setLocalDescription(offer);\n const sdpUrl = join.realtimeUrl.trim();\n const response = await fetch(sdpUrl, {\n method: 'POST',\n body: offer.sdp ?? '',\n headers: {\n Authorization: `Bearer ${join.clientSecret}`,\n 'Content-Type': 'application/sdp',\n },\n });\n if (!response.ok) {\n throw new Error('@extensions-ai-voice-shell:errors.livekit-inactive');\n }\n const answer = await response.text();\n await peer.setRemoteDescription({ type: 'answer', sdp: answer });\n }\n\n async interruptVendor(): Promise<void> {\n if (this.dataChannel?.readyState === 'open') {\n this.dataChannel.send(JSON.stringify({ type: 'response.cancel' }));\n }\n this.stopPlayback();\n }\n\n sendVendorFunctionOutput(callId: string, output: string): void {\n if (this.dataChannel?.readyState !== 'open') {\n return;\n }\n this.dataChannel.send(\n JSON.stringify({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output,\n },\n }),\n );\n this.dataChannel.send(JSON.stringify({ type: 'response.create' }));\n }\n\n stopPlayback(): void {\n this.stopOpenRouterPlayback();\n if (this.playbackAudio) {\n this.playbackAudio.pause();\n this.playbackAudio.muted = true;\n }\n for (const { track, element } of this.remoteAudioElements.values()) {\n element.muted = true;\n if (element instanceof HTMLAudioElement) {\n element.volume = 0;\n }\n track.setVolume(0);\n }\n }\n\n restorePlayback(): void {\n void this.audioContext?.resume().catch(() => undefined);\n if (this.playbackAudio) {\n this.playbackAudio.muted = false;\n this.playbackAudio.volume = 1;\n void this.playbackAudio.play().catch(() => undefined);\n }\n for (const { track, element } of this.remoteAudioElements.values()) {\n element.muted = false;\n if (element instanceof HTMLAudioElement) {\n element.volume = 1;\n }\n track.setVolume(1);\n }\n this.playAttachedAudio();\n if (!this.rtcRoom) {\n return;\n }\n void this.rtcRoom.startAudio().catch(() => undefined);\n this.attachExistingRemoteAudio(this.rtcRoom);\n }\n\n async disconnect(): Promise<void> {\n this.stopOpenRouterMic();\n this.stopOpenRouterPlayback();\n await this.teardownRtc();\n if (this.playbackAudio) {\n this.playbackAudio.pause();\n this.playbackAudio.srcObject = null;\n }\n }\n\n private async ensureLiveKit(): Promise<LiveKitClient> {\n this.livekit ??= await loadLiveKitClient();\n return this.livekit;\n }\n\n private stopOpenRouterMic(): void {\n this.openRouterMic?.stop();\n this.openRouterMic = null;\n this.localStream?.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n }\n\n private stopOpenRouterPlayback(): void {\n this.openRouterGeneration += 1;\n this.openRouterPlayAt = 0;\n for (const source of this.openRouterSources) {\n try {\n source.stop();\n } catch {\n // ignore\n }\n }\n this.openRouterSources.clear();\n }\n\n private createRtcRoom(livekit: LiveKitClient, callbacks?: AXPVoiceLiveMediaCallbacks): Room {\n const { Room, RoomEvent } = livekit;\n const room = new Room({\n adaptiveStream: true,\n dynacast: true,\n audioCaptureDefaults: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n room.on(RoomEvent.TrackSubscribed, (track) => {\n if (track.kind === 'audio') {\n this.attachRemoteTrack(track);\n }\n });\n room.on(RoomEvent.TrackUnsubscribed, (track) => {\n this.detachRemoteTrack(track);\n });\n room.on(RoomEvent.TrackPublished, (publication) => {\n if (publication.kind === 'audio' && !publication.isSubscribed) {\n void publication.setSubscribed(true);\n }\n });\n room.on(RoomEvent.ParticipantConnected, () => {\n this.attachExistingRemoteAudio(room);\n });\n room.on(RoomEvent.AudioPlaybackStatusChanged, () => {\n if (!room.canPlaybackAudio) {\n void room.startAudio().catch(() => undefined);\n }\n });\n room.on(RoomEvent.ActiveSpeakersChanged, (speakers) => {\n const localId = room.localParticipant.identity;\n if (speakers.some((speaker) => speaker.identity === localId)) {\n callbacks?.onLocalSpeechStart?.();\n }\n });\n return room;\n }\n\n private async teardownRtc(): Promise<void> {\n this.dataChannel = null;\n if (this.peer) {\n this.peer.close();\n this.peer = null;\n }\n this.localStream?.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n this.clearRemoteAudio();\n if (this.rtcRoom) {\n this.rtcRoom.removeAllListeners();\n await this.rtcRoom.disconnect();\n this.rtcRoom = null;\n }\n }\n\n private attachExistingRemoteAudio(room: Room): void {\n room.remoteParticipants.forEach((participant) => {\n participant.audioTrackPublications.forEach((publication) => {\n const track = publication.track;\n if (track && track.kind === 'audio') {\n this.attachRemoteTrack(track);\n }\n });\n });\n }\n\n private attachRemoteTrack(track: Track): void {\n const RemoteAudioTrack = this.livekit?.RemoteAudioTrack;\n if (!RemoteAudioTrack || !(track instanceof RemoteAudioTrack)) {\n return;\n }\n const key = track.sid ?? track.mediaStreamTrack?.id;\n if (!key || this.remoteAudioElements.has(key)) {\n return;\n }\n const element = track.attach();\n if (element instanceof HTMLAudioElement) {\n element.autoplay = true;\n element.muted = false;\n element.volume = 1;\n }\n this.audioSinkElement().appendChild(element);\n this.remoteAudioElements.set(key, { track, element });\n void element.play().catch((err) => {\n console.warn('LiveKit remote audio play() failed', err);\n });\n void this.rtcRoom?.startAudio().catch(() => undefined);\n }\n\n private detachRemoteTrack(track: Track): void {\n const RemoteAudioTrack = this.livekit?.RemoteAudioTrack;\n const key =\n RemoteAudioTrack && track instanceof RemoteAudioTrack\n ? (track.sid ?? track.mediaStreamTrack?.id)\n : track.mediaStreamTrack?.id;\n if (!key) {\n return;\n }\n const attached = this.remoteAudioElements.get(key);\n if (!attached) {\n return;\n }\n attached.track.detach(attached.element);\n attached.element.remove();\n this.remoteAudioElements.delete(key);\n }\n\n private clearRemoteAudio(): void {\n for (const { track, element } of this.remoteAudioElements.values()) {\n try {\n track.detach(element);\n } catch {\n // Detach is best-effort during teardown.\n }\n element.remove();\n }\n this.remoteAudioElements.clear();\n this.audioSink?.remove();\n this.audioSink = null;\n }\n\n private audioSinkElement(): HTMLElement {\n if (!this.audioSink && typeof document !== 'undefined') {\n const sink = document.createElement('div');\n sink.setAttribute('data-axe-voice-live-audio-sink', 'true');\n // display:none blocks playback in Chrome — keep the sink in layout but invisible.\n sink.style.cssText =\n 'position:fixed;width:1px;height:1px;opacity:0.01;pointer-events:none;left:0;bottom:0;';\n document.body.appendChild(sink);\n this.audioSink = sink;\n }\n return this.audioSink ?? document.body;\n }\n\n private playAttachedAudio(): void {\n for (const { element } of this.remoteAudioElements.values()) {\n element.muted = false;\n if (element instanceof HTMLAudioElement) {\n element.volume = 1;\n }\n void element.play().catch(() => undefined);\n }\n if (this.playbackAudio) {\n this.playbackAudio.muted = false;\n this.playbackAudio.volume = 1;\n void this.playbackAudio.play().catch(() => undefined);\n }\n }\n\n private attachMediaStream(stream: MediaStream): void {\n const audio = this.ensurePlaybackElement();\n if (!audio) {\n return;\n }\n audio.muted = false;\n audio.volume = 1;\n if (audio.srcObject !== stream) {\n audio.srcObject = stream;\n }\n void audio.play().catch((err) => {\n console.warn('LiveKit remote audio play() failed', err);\n });\n }\n\n private ensureAudioContext(): AudioContext | null {\n if (typeof AudioContext === 'undefined') {\n return null;\n }\n if (!this.audioContext || this.audioContext.state === 'closed') {\n this.audioContext = new AudioContext();\n }\n void this.audioContext.resume().catch(() => undefined);\n try {\n const buffer = this.audioContext.createBuffer(1, 1, 22050);\n const source = this.audioContext.createBufferSource();\n source.buffer = buffer;\n source.connect(this.audioContext.destination);\n source.start(0);\n } catch {\n // Silent tick is best-effort.\n }\n return this.audioContext;\n }\n\n private ensurePlaybackElement(): HTMLAudioElement | null {\n if (typeof Audio === 'undefined' || typeof document === 'undefined') {\n return null;\n }\n const audio = this.playbackAudio ?? new Audio();\n this.playbackAudio = audio;\n audio.autoplay = true;\n audio.muted = false;\n audio.volume = 1;\n audio.setAttribute('playsinline', 'true');\n if (!audio.isConnected) {\n this.audioSinkElement().appendChild(audio);\n }\n return audio;\n }\n\n private handleVendorEvent(raw: unknown, callbacks: AXPVoiceLiveMediaCallbacks): void {\n const text = typeof raw === 'string' ? raw : '';\n if (!text) {\n return;\n }\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(text) as Record<string, unknown>;\n } catch {\n return;\n }\n const type = typeof event['type'] === 'string' ? event['type'] : '';\n if (type === 'input_audio_buffer.speech_started') {\n callbacks.onLocalSpeechStart?.();\n return;\n }\n if (type === 'response.function_call_arguments.done') {\n const callId =\n (typeof event['call_id'] === 'string' ? event['call_id'] : '') ||\n (typeof event['id'] === 'string' ? event['id'] : '');\n const name = typeof event['name'] === 'string' ? event['name'] : '';\n const argumentsJson = typeof event['arguments'] === 'string' ? event['arguments'] : '{}';\n if (callId && name) {\n callbacks.onVendorFunctionCall?.({ callId, name, argumentsJson });\n }\n return;\n }\n if (\n type === 'response.audio.delta' ||\n type === 'response.output_audio.delta' ||\n type === 'output_audio_buffer.started'\n ) {\n this.restorePlayback();\n callbacks.onSpeaking?.(true);\n return;\n }\n if (\n type === 'response.audio.done' ||\n type === 'response.output_audio.done' ||\n type === 'response.done'\n ) {\n callbacks.onSpeaking?.(false);\n }\n if (type === 'conversation.item.input_audio_transcription.completed') {\n const transcript = typeof event['transcript'] === 'string' ? event['transcript'].trim() : '';\n if (transcript) {\n callbacks.onVendorTranscript?.('user', transcript, true);\n }\n return;\n }\n if (type === 'response.audio_transcript.done' || type === 'response.output_audio_transcript.done') {\n const transcript = typeof event['transcript'] === 'string' ? event['transcript'].trim() : '';\n if (transcript) {\n callbacks.onVendorTranscript?.('assistant', transcript, true);\n }\n }\n }\n}\n\nfunction voiceMediaErrorKey(err: unknown): string {\n const name = err instanceof DOMException ? err.name : '';\n const message = err instanceof Error ? err.message : String(err);\n if (\n name === 'NotAllowedError' ||\n name === 'PermissionDeniedError' ||\n /permission|denied|notallowed/i.test(message)\n ) {\n return '@extensions-ai-voice-shell:errors.mic-denied';\n }\n if (\n name === 'NotFoundError' ||\n name === 'NotReadableError' ||\n name === 'OverconstrainedError' ||\n name === 'AbortError' ||\n /getUserMedia|Requested device not found|Could not start audio source/i.test(message)\n ) {\n return '@extensions-ai-voice-shell:errors.mic-unavailable';\n }\n return '@extensions-ai-voice-shell:errors.livekit-inactive';\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPKeyboardShortcutPriority } from '@acorex-platform/framework-shared/core';\nimport { AXE_AI_VOICE_SHELL_OPEN_COMMAND } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPKeyboardShortcutRegistry } from '@acorex-platform/framework-client/core';\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\nimport { AXPLayoutThemeService } from '@acorex-platform/framework-client/themes/shared';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, inject } from '@angular/core';\nimport { AXPVoiceLiveMediaService } from './voice-live-media.service';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Dedicated chord — Ctrl+K remains global search. */\nexport const AXE_AI_VOICE_SHELL_SHORTCUT = 'ctrl+shift+space';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Header mic next to the conversation AI robot. Opens the voice command shell.\n */\n@Component({\n selector: 'axe-ai-voice-shell-header-slot',\n templateUrl: './voice-shell-header-slot.component.html',\n styleUrls: ['./voice-shell-header-slot.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXButtonModule, AXDecoratorModule, AXTranslationModule, AsyncPipe],\n})\nexport class AXEAiVoiceShellHeaderSlotComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly commandExecutor = inject(AXPCommandExecutor);\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n private readonly destroyRef = inject(DestroyRef);\n private readonly media = inject(AXPVoiceLiveMediaService);\n protected readonly themeStore = inject(AXPLayoutThemeService);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly shortcutDisplay = this.shortcutRegistry.formatDisplayKeys([AXE_AI_VOICE_SHELL_SHORTCUT]);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n this.shortcutRegistry.register({\n owner: this.destroyRef,\n id: 'ai-voice-shell',\n priority: AXPKeyboardShortcutPriority.Global,\n group: '@general:keyboard-shortcuts.groups.global',\n shortcuts: [\n {\n keys: [AXE_AI_VOICE_SHELL_SHORTCUT],\n title: '@general:keyboard-shortcuts.actions.open-voice-command',\n allowInEditableFields: true,\n handler: () => {\n this.media.unlockPlayback();\n void this.openVoiceCommand();\n },\n },\n ],\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async openVoiceCommand(): Promise<void> {\n this.media.unlockPlayback();\n await this.commandExecutor.execute(AXE_AI_VOICE_SHELL_OPEN_COMMAND, {});\n }\n\n //#endregion\n}\n\n//#endregion\n","<ax-button\n [iconOnly]=\"true\"\n class=\"relative\"\n [color]=\"themeStore.headerButtonColor()\"\n [look]=\"themeStore.headerButtonLook()\"\n [title]=\"\n ('@extensions-ai-voice-shell:header.open-title' | translate: { params: { shortcut: shortcutDisplay } } | async) ??\n ''\n \"\n [attr.aria-label]=\"\n ('@extensions-ai-voice-shell:header.open-title' | translate: { params: { shortcut: shortcutDisplay } } | async) ??\n ''\n \"\n (onClick)=\"openVoiceCommand()\"\n>\n <ax-icon>\n <i class=\"fa-regular fa-microphone\"></i>\n </ax-icon>\n</ax-button>\n","//#region ----- Imports -----\n\nimport { Injectable } from '@angular/core';\nimport { AXPSearchCommandProvider, AXPSearchResult } from '@acorex-platform/framework-client/common';\nimport { AXE_AI_VOICE_SHELL_OPEN_COMMAND } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\n\n//#endregion\n\n//#region ----- Search -----\n\n@Injectable()\nexport class AXEAiVoiceShellSearchCommandProvider extends AXPSearchCommandProvider {\n commands: AXPSearchResult[] = [\n {\n id: 'open-voice-command-shell',\n group: 'command',\n title: '@extensions-ai-voice-shell:search.open.title',\n icon: 'fa-light fa-microphone',\n description: '@extensions-ai-voice-shell:search.open.description',\n command: {\n name: AXE_AI_VOICE_SHELL_OPEN_COMMAND,\n },\n },\n ];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, inject, signal } from '@angular/core';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXE_AI_VOICE_SHELL_VOICE_SESSION_COMMIT_TURN_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_EXECUTE_TOOL_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_INTERRUPT_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_PUSH_AUDIO_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_START_COMMAND,\n AXE_AI_VOICE_SHELL_VOICE_SESSION_STOP_COMMAND,\n type AXPVoiceOpenRouterAudioPayload,\n type AXPVoiceSessionExecuteToolResult,\n type AXPVoiceSessionStartResult,\n type AXPVoiceShellOpenOptions,\n type AXPVoiceShellUiState,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPDialogOpener } from '@acorex-platform/framework-client/core';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport type { AXPRealtimeAiVoiceSessionPayload } from '@acorex-platform/framework-client/realtime';\nimport { pcm16ToBase64 } from './voice-openrouter-mic.util';\nimport { AXPVoiceLiveMediaService } from './voice-live-media.service';\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPVoiceCommandShellService {\n //#region ----- Services & Dependencies -----\n\n private readonly popupService = inject(AXPopupService);\n private readonly dialogOpener = inject(AXPDialogOpener);\n private readonly translation = inject(AXTranslationService);\n private readonly commandService = inject(AXPCommandService);\n private readonly media = inject(AXPVoiceLiveMediaService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly uiState = signal<AXPVoiceShellUiState>('idle');\n readonly statusText = signal('');\n readonly lastTranscript = signal('');\n readonly lastSpoken = signal('');\n readonly errorMessage = signal('');\n readonly conversationId = signal('');\n readonly sessionId = signal('');\n\n //#endregion\n\n //#region ----- Session -----\n\n private openPromise: Promise<void> | null = null;\n private mediaMode: 'openrouter' | 'rtc' | 'vendor' | null = null;\n private lastBargeInAt = 0;\n private speakingStartedAt = 0;\n\n //#endregion\n\n //#region ----- Public API -----\n\n async open(_options?: AXPVoiceShellOpenOptions): Promise<void> {\n const outcome = await this.dialogOpener.run({\n load: () =>\n import('./voice-void-dialog/voice-void-dialog.component').then(\n (module) => module.AXEAiVoiceVoidDialogComponent,\n ),\n data: { window: 'voice-shell' },\n present: async (notifyShown, component) => {\n this.media.unlockPlayback();\n this.resetUi();\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.connecting'));\n this.uiState.set('thinking');\n const title = await this.translation.translateAsync('@extensions-ai-voice-shell:dialog.title');\n const popupClosed = this.popupService\n .open(component, {\n title,\n size: 'sm',\n header: true,\n closeButton: true,\n maximizable: false,\n draggable: true,\n hasBackdrop: true,\n closeOnBackdropClick: true,\n closeOnEscape: true,\n panelClass: ['axe-ai-voice-shell-popup'],\n })\n .then(() => undefined);\n notifyShown();\n\n this.openPromise = popupClosed.finally(() => {\n this.openPromise = null;\n void this.hangUp(false);\n });\n\n void this.startLiveSession();\n return this.openPromise;\n },\n });\n\n if (outcome.duplicate) {\n return;\n }\n }\n\n ensurePlayback(): void {\n this.media.unlockPlayback();\n this.media.restorePlayback();\n }\n\n async hangUp(_closePopup = true): Promise<void> {\n const sessionId = this.sessionId();\n this.mediaMode = null;\n await this.media.disconnect();\n if (sessionId) {\n try {\n await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_STOP_COMMAND, { sessionId });\n } catch {\n // Hang up is best-effort.\n }\n }\n this.resetUi();\n }\n\n async interrupt(): Promise<void> {\n this.media.stopPlayback();\n const sessionId = this.sessionId();\n if (this.mediaMode === 'vendor') {\n await this.media.interruptVendor();\n }\n if (sessionId) {\n await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_INTERRUPT_COMMAND, { sessionId });\n }\n this.uiState.set('listening');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.listening'));\n }\n\n applyRealtime(payload: AXPRealtimeAiVoiceSessionPayload | undefined): void {\n if (!payload?.sessionId || !this.sessionId() || payload.sessionId !== this.sessionId()) {\n return;\n }\n if (payload.conversationId) {\n this.conversationId.set(payload.conversationId);\n }\n if (payload.partialTranscript) {\n this.lastTranscript.set(payload.partialTranscript);\n }\n if (payload.finalTranscript) {\n this.lastTranscript.set(payload.finalTranscript);\n }\n if (payload.spokenDelta) {\n this.lastSpoken.set(payload.spokenDelta);\n }\n if (payload.state === 'ended') {\n void this.releaseLocalSession();\n return;\n }\n if (payload.errorKey) {\n void this.setError(payload.errorKey);\n return;\n }\n void this.applyState(payload.state);\n }\n\n applyOpenRouterAudio(payload: AXPVoiceOpenRouterAudioPayload | undefined): void {\n if (!payload?.sessionId || !this.sessionId() || payload.sessionId !== this.sessionId()) {\n return;\n }\n if (!payload.pcmBase64 || !payload.sampleRate) {\n return;\n }\n this.media.playOpenRouterPcm(payload.pcmBase64, payload.sampleRate);\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n private async startLiveSession(): Promise<void> {\n try {\n const result = await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_START_COMMAND, {});\n const data = runtimeCommandPayloadData(result) as AXPVoiceSessionStartResult | undefined;\n if (!result?.success || !data?.sessionId) {\n const key =\n typeof result?.message?.text === 'string' && result.message.text.startsWith('@')\n ? result.message.text\n : '@extensions-ai-voice-shell:errors.cascade-unavailable';\n await this.setError(key);\n return;\n }\n this.sessionId.set(data.sessionId);\n this.conversationId.set(data.conversationId);\n this.mediaMode = data.mode;\n this.errorMessage.set('');\n if (data.mode === 'openrouter') {\n await this.media.connectOpenRouter({\n onUtterance: (pcm, sampleRate) => {\n void this.pushOpenRouterUtterance(data.sessionId, pcm, sampleRate);\n },\n onSpeechStart: () => this.maybeBargeIn(),\n bargeIn: () => this.uiState() === 'speaking' || this.uiState() === 'thinking',\n });\n } else if (data.mode === 'rtc' && data.rtc) {\n await this.media.connectRtc(data.rtc);\n } else if (data.mode === 'vendor' && data.vendor) {\n await this.media.connectVendor(data.vendor, {\n onSpeaking: (speaking) => {\n this.uiState.set(speaking ? 'speaking' : 'listening');\n },\n onLocalSpeechStart: () => this.maybeBargeIn(),\n onVendorTranscript: (role, text, isFinal) => {\n if (role === 'user') {\n this.lastTranscript.set(text);\n } else {\n this.lastSpoken.set(text);\n }\n if (isFinal) {\n void this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_COMMIT_TURN_COMMAND, {\n sessionId: data.sessionId,\n role,\n text,\n });\n }\n },\n onVendorFunctionCall: (call) => {\n void this.runVendorTool(data.sessionId, call);\n },\n });\n } else {\n await this.setError('@extensions-ai-voice-shell:errors.livekit-inactive');\n return;\n }\n this.uiState.set('listening');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.listening'));\n } catch (err) {\n const key =\n err instanceof Error && err.message.startsWith('@')\n ? err.message\n : '@extensions-ai-voice-shell:errors.cascade-unavailable';\n await this.hangUp(false);\n await this.setError(key);\n }\n }\n\n private maybeBargeIn(): void {\n if (this.mediaMode === 'rtc') {\n return;\n }\n const state = this.uiState();\n if (state !== 'speaking' && state !== 'thinking') {\n return;\n }\n if (state === 'speaking' && Date.now() - this.speakingStartedAt < 250) {\n return;\n }\n const now = Date.now();\n if (now - this.lastBargeInAt < 400) {\n return;\n }\n this.lastBargeInAt = now;\n this.media.stopPlayback();\n void this.interrupt();\n }\n\n private async pushOpenRouterUtterance(\n sessionId: string,\n pcm: Int16Array,\n sampleRate: number,\n ): Promise<void> {\n if (!sessionId || pcm.length < 2) {\n return;\n }\n try {\n await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_PUSH_AUDIO_COMMAND, {\n sessionId,\n pcmBase64: pcm16ToBase64(pcm),\n sampleRate,\n });\n } catch (err) {\n const key =\n err instanceof Error && err.message.startsWith('@')\n ? err.message\n : '@extensions-ai-voice-shell:errors.transcribe-failed';\n await this.setError(key);\n }\n }\n\n private async runVendorTool(\n sessionId: string,\n call: { callId: string; name: string; argumentsJson: string },\n ): Promise<void> {\n try {\n const result = await this.commandService.executeRemote(AXE_AI_VOICE_SHELL_VOICE_SESSION_EXECUTE_TOOL_COMMAND, {\n sessionId,\n name: call.name,\n argumentsJson: call.argumentsJson,\n });\n const data = runtimeCommandPayloadData(result) as AXPVoiceSessionExecuteToolResult | undefined;\n this.media.sendVendorFunctionOutput(call.callId, data?.output ?? '{\"ok\":false}');\n } catch {\n this.media.sendVendorFunctionOutput(call.callId, '{\"ok\":false}');\n }\n }\n\n private async applyState(state: AXPRealtimeAiVoiceSessionPayload['state']): Promise<void> {\n const map: Record<string, AXPVoiceShellUiState> = {\n connecting: 'thinking',\n listening: 'listening',\n thinking: 'thinking',\n speaking: 'speaking',\n interrupted: 'listening',\n ended: 'idle',\n error: 'error',\n };\n this.uiState.set(map[state] ?? 'listening');\n if (state !== 'error' && state !== 'ended') {\n this.errorMessage.set('');\n }\n if (state === 'interrupted') {\n this.media.stopPlayback();\n }\n if (state === 'speaking') {\n this.speakingStartedAt = Date.now();\n this.media.restorePlayback();\n }\n const key =\n state === 'connecting'\n ? '@extensions-ai-voice-shell:states.connecting'\n : state === 'listening'\n ? '@extensions-ai-voice-shell:states.listening'\n : state === 'thinking'\n ? '@extensions-ai-voice-shell:states.thinking'\n : state === 'speaking'\n ? '@extensions-ai-voice-shell:states.speaking'\n : state === 'interrupted'\n ? '@extensions-ai-voice-shell:states.interrupted'\n : state === 'error'\n ? '@extensions-ai-voice-shell:states.error'\n : '@extensions-ai-voice-shell:states.listening';\n this.statusText.set(await this.translation.translateAsync(key));\n }\n\n private async setError(key: string): Promise<void> {\n this.errorMessage.set(await this.translation.translateAsync(key));\n this.uiState.set('error');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.error'));\n }\n\n /** Another tab/profile started a session for this user, or the server stopped us. */\n private async releaseLocalSession(): Promise<void> {\n this.mediaMode = null;\n this.sessionId.set('');\n await this.media.disconnect();\n this.resetUi();\n }\n\n private resetUi(): void {\n this.sessionId.set('');\n this.conversationId.set('');\n this.uiState.set('idle');\n this.statusText.set('');\n this.lastTranscript.set('');\n this.lastSpoken.set('');\n this.errorMessage.set('');\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { NgModule } from '@angular/core';\nimport { AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n AXPComponentSlotModule,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXMAiManagementModule } from '@acorex-platform/module-ai-management-client';\nimport {\n AXE_AI_VOICE_OPENROUTER_AUDIO_TOPIC,\n AXE_AI_VOICE_SHELL_OPEN_COMMAND,\n type AXPVoiceOpenRouterAudioPayload,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport {\n AXPRealtimeDispatcherService,\n AXP_REALTIME_TOPIC_AI_VOICE_SESSION,\n type AXPRealtimeAiVoiceSessionPayload,\n} from '@acorex-platform/framework-client/realtime';\nimport { inject } from '@angular/core';\nimport { AXEAiVoiceShellHeaderSlotComponent } from './voice-shell-header-slot.component';\nimport { AXEAiVoiceShellSearchCommandProvider } from './voice-shell-search.provider';\nimport { AXPVoiceCommandShellService } from './voice-command-shell.service';\n\n//#endregion\n\n//#region ----- Module -----\n\n/**\n * Central live voice AI shell (void dialog + Conversation room + OpenRouter cascade).\n */\n@NgModule({\n imports: [\n AXMAiManagementModule,\n AXPComponentSlotModule.forChild({\n 'root-header-end': [\n {\n // Immediately after conversation mini-chat (55) so mic + robot sit as one AI cluster.\n priority: 56,\n name: 'ai-voice-shell',\n component: AXEAiVoiceShellHeaderSlotComponent,\n },\n ],\n }),\n ],\n providers: [\n {\n provide: AXP_SEARCH_PROVIDER,\n useClass: AXEAiVoiceShellSearchCommandProvider,\n multi: true,\n },\n provideCommandSetups([\n {\n key: AXE_AI_VOICE_SHELL_OPEN_COMMAND,\n command: () =>\n import('./commands/open-voice-command-shell.command').then((c) => c.AXEAiVoiceShellOpenCommand),\n },\n ]),\n provideAppStartUpTask(() => {\n const dispatcher = inject(AXPRealtimeDispatcherService, { optional: true });\n const shell = inject(AXPVoiceCommandShellService);\n return {\n name: 'ai-voice-shell-realtime',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeHandlers,\n run: async () => {\n dispatcher?.register({\n topic: AXP_REALTIME_TOPIC_AI_VOICE_SESSION,\n handle: (envelope) => {\n shell.applyRealtime(envelope.payload as AXPRealtimeAiVoiceSessionPayload);\n },\n });\n dispatcher?.register({\n topic: AXE_AI_VOICE_OPENROUTER_AUDIO_TOPIC,\n handle: (envelope) => {\n shell.applyOpenRouterAudio(envelope.payload as AXPVoiceOpenRouterAudioPayload);\n },\n });\n },\n };\n }),\n ],\n})\nexport class AXEAiVoiceShellExtensionModule {}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPVoiceCapabilityProvider } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\n\n//#endregion\n\n//#region ----- Tokens -----\n\n/** Multi-provider token for domain voice capabilities (assessment, later others). */\nexport const AXP_VOICE_CAPABILITY_PROVIDER = new InjectionToken<AXPVoiceCapabilityProvider>(\n 'AXP_VOICE_CAPABILITY_PROVIDER',\n);\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, inject } from '@angular/core';\nimport type {\n AXPVoiceCapabilityIntent,\n AXPVoiceCapabilityProvider,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXP_VOICE_CAPABILITY_PROVIDER } from './voice-capability.tokens';\n\n//#endregion\n\n//#region ----- Registry -----\n\n/**\n * Discovers module-owned {@link AXPVoiceCapabilityProvider} implementations.\n * The shell never imports domain internals.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPVoiceCapabilityRegistry {\n //#region ----- Services & Dependencies -----\n\n private readonly providers = inject(AXP_VOICE_CAPABILITY_PROVIDER, { optional: true }) ?? [];\n\n //#endregion\n\n //#region ----- Public API -----\n\n list(): AXPVoiceCapabilityProvider[] {\n const raw = this.providers;\n return Array.isArray(raw) ? raw : raw ? [raw] : [];\n }\n\n getById(id: string): AXPVoiceCapabilityProvider | undefined {\n const trimmed = id.trim();\n if (!trimmed) {\n return undefined;\n }\n return this.list().find((provider) => provider.id === trimmed);\n }\n\n async findForIntent(intent: AXPVoiceCapabilityIntent): Promise<AXPVoiceCapabilityProvider | undefined> {\n for (const provider of this.list()) {\n if (await provider.canHandle(intent)) {\n return provider;\n }\n }\n return undefined;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, inject } from '@angular/core';\nimport {\n AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY,\n AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY,\n AXPAiChatToolRunContextService,\n AXPAiManagerService,\n AXPAiPlatformRuntimeContextBuilder,\n createBrowserPlayableTtsBlobUrl,\n persistAiChatAttachmentImage,\n} from '@acorex-platform/module-ai-management-client';\nimport { RootConfig } from '@acorex-platform/module-ai-management-client/contracts';\nimport type {\n AXPVoiceInteractionTransport,\n AXPVoiceSttResult,\n AXPVoiceTtsResult,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { createRandomUuid, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport { first } from 'lodash';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst SPEECH_TO_TEXT_AGENT_NAME = 'speech-to-text';\nconst TEXT_TO_SPEECH_AGENT_NAME = 'text-to-speech';\n\n//#endregion\n\n//#region ----- Transport -----\n\n/**\n * v1 interaction transport: existing AI HTTP commands + assist `run` (SSE under the hood).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPHttpSseVoiceTransport implements AXPVoiceInteractionTransport {\n //#region ----- Services & Dependencies -----\n\n readonly id = 'http-sse';\n\n private readonly commandService = inject(AXPCommandService);\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly entityService = inject(AXPEntityService);\n private readonly chatToolRunContext = inject(AXPAiChatToolRunContextService);\n private readonly runtimeContextBuilder = inject(AXPAiPlatformRuntimeContextBuilder);\n private readonly aiManager = inject(AXPAiManagerService, { optional: true });\n\n //#endregion\n\n //#region ----- Public API -----\n\n async transcribe(audio: Blob, options?: { language?: string }): Promise<AXPVoiceSttResult> {\n const aiManager = this.requireAiManager();\n const assist = await aiManager.getAssistForChat();\n const assistId = assist.id?.trim();\n if (!assistId) {\n throw new Error('No AI assist is configured for speech transcription.');\n }\n const chatTransport = (await aiManager.getAssistPrimaryChatTransport(assistId)) ?? 'openai';\n const agentId = await this.findAgentIdByName(SPEECH_TO_TEXT_AGENT_NAME);\n const mimeType = audio.type?.trim() || 'audio/webm';\n const file = new File([audio], `voice-${Date.now()}.webm`, { type: mimeType });\n const { fileId } = await persistAiChatAttachmentImage(\n this.fileStorage,\n file,\n createRandomUuid(),\n );\n const language =\n options?.language?.trim() ||\n this.localeToTranscriptionLanguage(await this.resolveUiLocale());\n\n this.chatToolRunContext.setContext({\n assistId,\n chatTransport,\n ...(agentId ? { agentId } : {}),\n });\n try {\n const result = await this.commandService.execute(AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, {\n fileId,\n assistId,\n ...(agentId ? { agentId } : {}),\n ...(language ? { language } : {}),\n });\n const data = runtimeCommandPayloadData(result) as { text?: string } | undefined;\n const text = typeof data?.text === 'string' ? data.text.trim() : '';\n if (!result?.success || !text) {\n throw new Error(this.commandFailureI18nKey(result, '@extensions-ai-voice-shell:errors.transcribe-failed'));\n }\n return { text };\n } finally {\n this.chatToolRunContext.setContext(null);\n }\n }\n\n async synthesize(text: string): Promise<AXPVoiceTtsResult> {\n const trimmed = text.trim();\n if (!trimmed) {\n return { text: '' };\n }\n const aiManager = this.requireAiManager();\n const assist = await aiManager.getAssistForChat();\n const assistId = assist.id?.trim();\n if (!assistId) {\n throw new Error('No AI assist is configured for speech synthesis.');\n }\n const chatTransport = (await aiManager.getAssistPrimaryChatTransport(assistId)) ?? 'openai';\n const agentId = await this.findAgentIdByName(TEXT_TO_SPEECH_AGENT_NAME);\n\n this.chatToolRunContext.setContext({\n assistId,\n chatTransport,\n ...(agentId ? { agentId } : {}),\n });\n try {\n const result = await this.commandService.executeRemote(AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY, {\n text: trimmed,\n assistId,\n ...(agentId ? { agentId } : {}),\n });\n const data = runtimeCommandPayloadData(result) as { fileId?: string; text?: string } | undefined;\n const fileId = typeof data?.fileId === 'string' ? data.fileId.trim() : '';\n if (!result?.success || !fileId) {\n throw new Error(this.commandFailureI18nKey(result, '@extensions-ai-voice-shell:errors.assist-failed'));\n }\n const info = await this.fileStorage.getInfo(fileId);\n const binary = await this.fileStorage.download(fileId);\n const objectUrl = await createBrowserPlayableTtsBlobUrl(\n binary,\n info?.mimeType ?? binary.type,\n info?.name,\n );\n return { fileId, objectUrl, text: typeof data?.text === 'string' ? data.text : trimmed };\n } finally {\n this.chatToolRunContext.setContext(null);\n }\n }\n\n async runAssist(prompt: string, context?: Record<string, unknown>): Promise<{ text: string }> {\n const aiManager = this.requireAiManager();\n const result = await aiManager.run({\n prompt,\n context: {\n systemInstruction:\n 'You are the platform voice command assistant. Prefer AI-compatible tools. Keep spoken replies short. Confirm before destructive or submit actions.',\n structuredContext: context,\n },\n });\n return { text: result.text?.trim() ?? '' };\n }\n\n //#endregion\n\n //#region ----- Private helpers -----\n\n private requireAiManager(): AXPAiManagerService {\n if (!this.aiManager) {\n throw new Error('AI manager service is not available.');\n }\n return this.aiManager;\n }\n\n private async findAgentIdByName(name: string): Promise<string | undefined> {\n const list = await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.agent.name)\n .data<string, { id: string }>()\n .query({\n skip: 0,\n take: 1,\n filter: {\n field: 'name',\n operator: { type: 'equal' },\n value: name,\n },\n });\n return first(list.items)?.id;\n }\n\n private async resolveUiLocale(): Promise<string | undefined> {\n const ctx = await this.runtimeContextBuilder.build();\n const locale = ctx['locale'];\n return typeof locale === 'string' && locale.trim() ? locale.trim() : undefined;\n }\n\n private commandFailureI18nKey(\n result: { message?: { text?: unknown } } | null | undefined,\n fallbackKey: string,\n ): string {\n const text = typeof result?.message?.text === 'string' ? result.message.text.trim() : '';\n return text.startsWith('@') ? text : fallbackKey;\n }\n\n private localeToTranscriptionLanguage(locale: string | undefined): string | undefined {\n const primary = locale?.trim().split('-')[0]?.toLowerCase();\n return primary || undefined;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPVoiceShellOpenOptions } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPVoiceCommandShellService } from '../voice-command-shell.service';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXEAiVoiceShellOpenCommandInput {\n initialText?: string;\n capabilityId?: string;\n caseId?: string;\n sessionId?: string;\n}\n\n//#endregion\n\n//#region ----- Command -----\n\n@Injectable()\nexport class AXEAiVoiceShellOpenCommand implements AXPCommand<AXEAiVoiceShellOpenCommandInput, void> {\n //#region ----- Services & Dependencies -----\n\n private readonly shell = inject(AXPVoiceCommandShellService);\n\n //#endregion\n\n //#region ----- Command execution -----\n\n async execute(input: AXEAiVoiceShellOpenCommandInput): AXPCommandExecuteResultPromise<void> {\n const startInput =\n input?.caseId || input?.sessionId\n ? { caseId: input.caseId, sessionId: input.sessionId }\n : input?.initialText\n ? { text: input.initialText }\n : undefined;\n const options: AXPVoiceShellOpenOptions = {\n initialText: input?.initialText,\n capabilityId: input?.capabilityId,\n startInput,\n };\n await this.shell.open(options);\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, ViewEncapsulation } from '@angular/core';\nimport { AXPVoiceCommandShellService } from '../voice-command-shell.service';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axe-ai-voice-void-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXTranslationModule],\n templateUrl: './voice-void-dialog.component.html',\n styleUrl: './voice-void-dialog.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXEAiVoiceVoidDialogComponent extends AXBasePageComponent {\n //#region ----- Services & Dependencies -----\n\n readonly shell = inject(AXPVoiceCommandShellService);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n readonly orbClass = computed(() => `voice-void-orb voice-void-orb--${this.shell.uiState()}`);\n readonly orbWrapClass = computed(() => `voice-void-orb-wrap voice-void-orb-wrap--${this.shell.uiState()}`);\n readonly isListening = computed(() => this.shell.uiState() === 'listening');\n readonly isSpeaking = computed(() => this.shell.uiState() === 'speaking');\n readonly isBusy = computed(() => {\n const state = this.shell.uiState();\n return state === 'thinking' || state === 'listening' || state === 'speaking';\n });\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n async onHangUp(): Promise<void> {\n await this.shell.hangUp(false);\n this.close();\n }\n\n async onOrbClick(): Promise<void> {\n this.shell.ensurePlayback();\n if (this.isSpeaking()) {\n await this.shell.interrupt();\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"voice-void\">\n <div class=\"voice-void-stage\">\n <!-- ----- Listening / thinking / speaking orb ----- -->\n <div [class]=\"orbWrapClass()\">\n <span class=\"voice-void-ring voice-void-ring--1\" aria-hidden=\"true\"></span>\n <span class=\"voice-void-ring voice-void-ring--2\" aria-hidden=\"true\"></span>\n <span class=\"voice-void-ring voice-void-ring--3\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n [class]=\"orbClass()\"\n (click)=\"onOrbClick()\"\n [attr.aria-label]=\"'@extensions-ai-voice-shell:actions.interrupt' | translate | async\"\n >\n @if (isSpeaking()) {\n <!-- ----- AI is speaking; click interrupts ----- -->\n <i class=\"fa-regular fa-volume-high\"></i>\n }\n <!-- ----- Live microphone ----- -->\n @else {\n <i class=\"fa-regular fa-microphone\"></i>\n }\n </button>\n @if (isBusy()) {\n <!-- ----- Waveform bars: user listen vs AI speak ----- -->\n <span class=\"voice-void-eq\" aria-hidden=\"true\">\n <span></span>\n <span></span>\n <span></span>\n <span></span>\n <span></span>\n </span>\n }\n </div>\n\n <p class=\"voice-void-status\">{{ shell.statusText() }}</p>\n\n @if (shell.lastSpoken()) {\n <!-- ----- Last spoken assistant text ----- -->\n <p class=\"voice-void-spoken\">{{ shell.lastSpoken() }}</p>\n }\n\n @if (shell.lastTranscript()) {\n <!-- ----- Last user transcript ----- -->\n <p class=\"voice-void-transcript\">{{ shell.lastTranscript() }}</p>\n }\n\n @if (shell.errorMessage()) {\n <!-- ----- Spoken / visible error ----- -->\n <p class=\"voice-void-error\">{{ shell.errorMessage() }}</p>\n }\n </div>\n\n <!-- ----- Hang up ends the live session ----- -->\n <div class=\"voice-void-toolbar\">\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.hang-up' | translate | async\"\n color=\"danger\"\n (onClick)=\"onHangUp()\"\n ></ax-button>\n </div>\n\n <p class=\"voice-void-hint\">{{ '@extensions-ai-voice-shell:dialog.hint' | translate | async }}</p>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
package/package.json
CHANGED