@acorex-platform/extension-ai-voice-shell-client 0.0.33 → 0.0.37
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-ai-voice-shell-client-contracts.mjs","sources":["../../../../libs/extensions/ai/voice-shell/contracts/src/ai-compatible-operation.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-capability.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-shell.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-transport.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-shell.constants.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/index.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/acorex-platform-extension-ai-voice-shell-client-contracts.ts"],"sourcesContent":["//#region ----- Types -----\n\n/** Where an AI-compatible command or query runs. */\nexport type AXPAiCompatibleExecutionMode = 'backend' | 'frontend' | 'both';\n\n/** Safety classification for AI-compatible operations. */\nexport type AXPAiCompatibleSafetyKind = 'read-only' | 'mutating' | 'destructive';\n\nexport interface AXPAiCompatibleSafetyMeta {\n kind?: AXPAiCompatibleSafetyKind;\n sideEffects?: boolean;\n requiresConfirmation?: boolean;\n}\n\n/** Optional voice-shell hints stored in catalog `aiMetadataJson`. */\nexport interface AXPAiCompatibleVoiceMeta {\n speakInputSummary?: boolean;\n confirmPromptKey?: string;\n}\n\n/**\n * Formal AI-compatible command/query contract (parsed from catalog `aiMetadataJson`).\n * Aligns with existing `ai` sidecar fields plus optional voice hints.\n */\nexport interface AXPAiCompatibleOperationMeta {\n toolName?: string;\n shortDescription?: string;\n instruction?: string;\n tags?: string[];\n executionMode?: AXPAiCompatibleExecutionMode;\n safety?: AXPAiCompatibleSafetyMeta;\n voice?: AXPAiCompatibleVoiceMeta;\n followUpTools?: string[];\n usage?: {\n whenToUse?: string[];\n avoidWhen?: string[];\n followUpTools?: string[];\n };\n}\n\n//#endregion\n\n//#region ----- Parsing -----\n\nconst AI_TOOL_TAG = 'ai-tool';\n\nfunction asStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const items = value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n return items.length > 0 ? items : undefined;\n}\n\nfunction asBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction asSafetyKind(value: unknown): AXPAiCompatibleSafetyKind | undefined {\n if (value === 'read-only' || value === 'mutating' || value === 'destructive') {\n return value;\n }\n if (value === 'mutation') {\n return 'mutating';\n }\n return undefined;\n}\n\nfunction asExecutionMode(value: unknown): AXPAiCompatibleExecutionMode | undefined {\n if (value === 'backend' || value === 'frontend' || value === 'both') {\n return value;\n }\n return undefined;\n}\n\n/**\n * Parses catalog `aiMetadataJson` into the AI-compatible operation contract.\n * Returns `null` when the JSON is missing or invalid.\n */\nexport function parseAiCompatibleOperationMeta(\n aiMetadataJson: string | undefined | null,\n): AXPAiCompatibleOperationMeta | null {\n if (!aiMetadataJson?.trim()) {\n return null;\n }\n try {\n const raw = JSON.parse(aiMetadataJson) as Record<string, unknown>;\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {\n return null;\n }\n const safetyRaw =\n raw['safety'] != null && typeof raw['safety'] === 'object' && !Array.isArray(raw['safety'])\n ? (raw['safety'] as Record<string, unknown>)\n : undefined;\n const voiceRaw =\n raw['voice'] != null && typeof raw['voice'] === 'object' && !Array.isArray(raw['voice'])\n ? (raw['voice'] as Record<string, unknown>)\n : undefined;\n const usageRaw =\n raw['usage'] != null && typeof raw['usage'] === 'object' && !Array.isArray(raw['usage'])\n ? (raw['usage'] as Record<string, unknown>)\n : undefined;\n\n const meta: AXPAiCompatibleOperationMeta = {};\n if (typeof raw['toolName'] === 'string' && raw['toolName'].trim()) {\n meta.toolName = raw['toolName'].trim();\n }\n if (typeof raw['shortDescription'] === 'string' && raw['shortDescription'].trim()) {\n meta.shortDescription = raw['shortDescription'].trim();\n }\n if (typeof raw['instruction'] === 'string' && raw['instruction'].trim()) {\n meta.instruction = raw['instruction'].trim();\n }\n const tags = asStringArray(raw['tags']);\n if (tags) {\n meta.tags = tags;\n }\n const executionMode = asExecutionMode(raw['executionMode']);\n if (executionMode) {\n meta.executionMode = executionMode;\n }\n if (safetyRaw) {\n meta.safety = {\n kind: asSafetyKind(safetyRaw['kind']),\n sideEffects: asBoolean(safetyRaw['sideEffects']),\n requiresConfirmation: asBoolean(safetyRaw['requiresConfirmation']),\n };\n }\n if (voiceRaw) {\n meta.voice = {\n speakInputSummary: asBoolean(voiceRaw['speakInputSummary']),\n confirmPromptKey:\n typeof voiceRaw['confirmPromptKey'] === 'string' && voiceRaw['confirmPromptKey'].trim()\n ? voiceRaw['confirmPromptKey'].trim()\n : undefined,\n };\n }\n const followUpTools = asStringArray(raw['followUpTools']) ?? asStringArray(usageRaw?.['followUpTools']);\n if (followUpTools) {\n meta.followUpTools = followUpTools;\n }\n if (usageRaw) {\n meta.usage = {\n whenToUse: asStringArray(usageRaw['whenToUse']),\n avoidWhen: asStringArray(usageRaw['avoidWhen']),\n followUpTools: asStringArray(usageRaw['followUpTools']),\n };\n }\n return meta;\n } catch {\n return null;\n }\n}\n\n/**\n * True when catalog metadata opts the operation into the AI tool surface\n * (`ai-tool` tag, matching existing `commandRowExposedForAi` tag check).\n */\nexport function isAiCompatibleOperationMeta(meta: AXPAiCompatibleOperationMeta | null | undefined): boolean {\n return Array.isArray(meta?.tags) && meta.tags.includes(AI_TOOL_TAG);\n}\n\n/**\n * True when a catalog row should be exposed as an AI-compatible tool.\n * Matches `commandRowExposedForAi`: `capabilities` includes `ai`, or `aiMetadataJson` has the `ai-tool` tag.\n */\nexport function isAiCompatibleCatalogRow(row: {\n capabilities?: string | string[] | null;\n aiMetadataJson?: string | null;\n} | null | undefined): boolean {\n if (!row) {\n return false;\n }\n const caps = row.capabilities;\n if (Array.isArray(caps)) {\n if (caps.some((c) => String(c).toLowerCase() === 'ai')) {\n return true;\n }\n } else if (typeof caps === 'string' && caps.trim()) {\n const parts = caps.split(',').map((s) => s.trim().toLowerCase());\n if (parts.includes('ai')) {\n return true;\n }\n }\n return isAiCompatibleOperationMeta(parseAiCompatibleOperationMeta(row.aiMetadataJson));\n}\n\n//#endregion\n","//#region ----- Types -----\n\n/** Intent payload used to discover a voice capability. */\nexport interface AXPVoiceCapabilityIntent {\n text?: string;\n context?: Record<string, unknown>;\n}\n\n/** Spoken / display prompt returned by interview-style capabilities. */\nexport interface AXPVoicePrompt {\n sessionId: string;\n spokenPrompt: string;\n titleText?: string;\n answerKey?: string;\n widgetKind?: string;\n options?: Array<{ id: string; label: string }>;\n isRequired?: boolean;\n allowSkip?: boolean;\n comment?: { enabled: boolean; required: boolean };\n progress?: { answered: number; totalVisible: number };\n captureStrategy?: 'voice' | 'micro-capture' | 'unsupported';\n}\n\nexport type AXPVoiceNextPromptResult = AXPVoicePrompt | { done: true; sessionId: string; spokenPrompt: string };\n\nexport interface AXPVoiceApplyResult {\n ok: boolean;\n sessionId: string;\n errorCode?: string;\n spokenMessage?: string;\n requiresConfirmation?: boolean;\n next?: AXPVoiceNextPromptResult;\n}\n\nexport interface AXPVoiceSubmitResult {\n ok: boolean;\n sessionId?: string;\n spokenMessage?: string;\n errors?: Array<{ answerKey: string; message: string }>;\n}\n\nexport interface AXPVoiceSaveDraftResult {\n sessionId: string;\n spokenMessage?: string;\n}\n\n/**\n * Platform port implemented by domain modules (assessment is the first).\n * The voice shell talks only to this interface — never to viewer internals.\n */\nexport interface AXPVoiceCapabilityProvider {\n readonly id: string;\n readonly titleKey: string;\n canHandle(intent: AXPVoiceCapabilityIntent): boolean | Promise<boolean>;\n startSession(input: unknown): Promise<{ sessionId: string; spokenPrompt?: string }>;\n nextPrompt?(sessionId: string): Promise<AXPVoiceNextPromptResult>;\n applyInput?(sessionId: string, input: unknown): Promise<AXPVoiceApplyResult>;\n saveDraft?(sessionId: string): Promise<AXPVoiceSaveDraftResult | void>;\n submit?(sessionId: string): Promise<AXPVoiceSubmitResult>;\n cancel?(sessionId: string): Promise<void>;\n}\n\n//#endregion\n","//#region ----- Types -----\n\n/** Primary interaction mode of the central voice command shell. */\nexport type AXPVoiceShellMode = 'command' | 'interview' | 'confirm' | 'capture';\n\n/** Visual / animation state of the void dialog. */\nexport type AXPVoiceShellUiState =\n | 'idle'\n | 'listening'\n | 'thinking'\n | 'speaking'\n | 'confirm'\n | 'error'\n | 'capture';\n\nexport interface AXPVoiceShellConfirmRequest {\n prompt: string;\n confirmLabelKey?: string;\n cancelLabelKey?: string;\n}\n\nexport interface AXPVoiceShellOpenOptions {\n /** Optional spoken or typed kickoff utterance. */\n initialText?: string;\n /** Skip discovery and start this capability (e.g. assessment interview). */\n capabilityId?: string;\n /** Domain start payload forwarded to {@link AXPVoiceCapabilityProvider.startSession}. */\n startInput?: unknown;\n}\n\nexport interface AXPVoiceShellTranscriptTurn {\n role: 'user' | 'assistant';\n text: string;\n}\n\n//#endregion\n","//#region ----- Types -----\n\n/** Speech-to-text result from the interaction transport. */\nexport interface AXPVoiceSttResult {\n text: string;\n}\n\n/** Text-to-speech result from the interaction transport. */\nexport interface AXPVoiceTtsResult {\n fileId?: string;\n objectUrl?: string;\n text: string;\n}\n\n/**\n * Swappable interaction channel (v1 HTTP+SSE / commands; later realtime or WebRTC).\n * Domain APIs stay transport-agnostic.\n */\nexport interface AXPVoiceInteractionTransport {\n readonly id: string;\n transcribe(audio: Blob, options?: { language?: string }): Promise<AXPVoiceSttResult>;\n synthesize(text: string): Promise<AXPVoiceTtsResult>;\n runAssist?(prompt: string, context?: Record<string, unknown>): Promise<{ text: string }>;\n}\n\n//#endregion\n","//#region ----- Constants -----\n\n/** Runtime command that opens the central voice void dialog. */\nexport const AXE_AI_VOICE_SHELL_OPEN_COMMAND = 'AiVoiceShell:Open' as const;\n\n/** Assessment interview capability id (registered by assessment-management). */\nexport const AXE_ASSESSMENT_QUESTIONNAIRE_VOICE_CAPABILITY_ID =\n 'assessment-questionnaire-interview' as const;\n\nexport const ASSESSMENT_FIND_CASE_FOR_VOICE_FILL_COMMAND = 'Assessment:FindCaseForVoiceFill' as const;\nexport const ASSESSMENT_START_HEADLESS_QUESTIONNAIRE_COMMAND =\n 'Assessment:StartHeadlessQuestionnaire' as const;\nexport const ASSESSMENT_NEXT_QUESTIONNAIRE_QUESTION_COMMAND =\n 'Assessment:NextQuestionnaireQuestion' as const;\nexport const ASSESSMENT_APPLY_QUESTIONNAIRE_ANSWER_COMMAND =\n 'Assessment:ApplyQuestionnaireAnswer' as const;\nexport const ASSESSMENT_SAVE_QUESTIONNAIRE_DRAFT_COMMAND = 'Assessment:SaveQuestionnaireDraft' as const;\nexport const ASSESSMENT_SUBMIT_QUESTIONNAIRE_COMMAND = 'Assessment:SubmitQuestionnaire' as const;\nexport const ASSESSMENT_CANCEL_QUESTIONNAIRE_COMMAND = 'Assessment:CancelQuestionnaire' as const;\n\n//#endregion\n","//#region ----- Contracts barrel -----\n\nexport * from './ai-compatible-operation.types';\nexport * from './voice-capability.types';\nexport * from './voice-shell.types';\nexport * from './voice-transport.types';\nexport * from './voice-shell.constants';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAwCA;AAEA;AAEA,MAAM,WAAW,GAAG,SAAS;AAE7B,SAAS,aAAa,CAAC,KAAc,EAAA;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,SAAS;IAClB;IACA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAqB,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACxG,IAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,SAAS;AAC7C;AAEA,SAAS,SAAS,CAAC,KAAc,EAAA;AAC/B,IAAA,OAAO,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,SAAS;AACvD;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,aAAa,EAAE;AAC5E,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,KAAK,KAAK,UAAU,EAAE;AACxB,QAAA,OAAO,UAAU;IACnB;AACA,IAAA,OAAO,SAAS;AAClB;AAEA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,EAAE;AACnE,QAAA,OAAO,KAAK;IACd;AACA,IAAA,OAAO,SAAS;AAClB;AAEA;;;AAGG;AACG,SAAU,8BAA8B,CAC5C,cAAyC,EAAA;AAEzC,IAAA,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE;AAC3B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAA4B;AACjE,QAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAChE,YAAA,OAAO,IAAI;QACb;QACA,MAAM,SAAS,GACb,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACxF,cAAG,GAAG,CAAC,QAAQ;cACb,SAAS;QACf,MAAM,QAAQ,GACZ,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACrF,cAAG,GAAG,CAAC,OAAO;cACZ,SAAS;QACf,MAAM,QAAQ,GACZ,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACrF,cAAG,GAAG,CAAC,OAAO;cACZ,SAAS;QAEf,MAAM,IAAI,GAAiC,EAAE;AAC7C,QAAA,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YACjE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;QACxC;AACA,QAAA,IAAI,OAAO,GAAG,CAAC,kBAAkB,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YACjF,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE;QACxD;AACA,QAAA,IAAI,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACvE,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE;QAC9C;QACA,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAClB;QACA,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,aAAa;QACpC;QACA,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,MAAM,GAAG;AACZ,gBAAA,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACrC,gBAAA,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AAChD,gBAAA,oBAAoB,EAAE,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;aACnE;QACH;QACA,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG;AACX,gBAAA,iBAAiB,EAAE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC3D,gBAAA,gBAAgB,EACd,OAAO,QAAQ,CAAC,kBAAkB,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAAC,IAAI;AACnF,sBAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,IAAI;AACnC,sBAAE,SAAS;aAChB;QACH;AACA,QAAA,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,aAAa,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC;QACvG,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,aAAa;QACpC;QACA,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG;AACX,gBAAA,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,gBAAA,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,gBAAA,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;aACxD;QACH;AACA,QAAA,OAAO,IAAI;IACb;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEA;;;AAGG;AACG,SAAU,2BAA2B,CAAC,IAAqD,EAAA;AAC/F,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AACrE;AAEA;;;AAGG;AACG,SAAU,wBAAwB,CAAC,GAGrB,EAAA;IAClB,IAAI,CAAC,GAAG,EAAE;AACR,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY;AAC7B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE;AACtD,YAAA,OAAO,IAAI;QACb;IACF;SAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAChE,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;IACF;IACA,OAAO,2BAA2B,CAAC,8BAA8B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACxF;AAEA;;AC3LA;AA8DA;;AC9DA;AAmCA;;ACnCA;AAyBA;;ACzBA;AAEA;AACO,MAAM,+BAA+B,GAAG;AAE/C;AACO,MAAM,gDAAgD,GAC3D;AAEK,MAAM,2CAA2C,GAAG;AACpD,MAAM,+CAA+C,GAC1D;AACK,MAAM,8CAA8C,GACzD;AACK,MAAM,6CAA6C,GACxD;AACK,MAAM,2CAA2C,GAAG;AACpD,MAAM,uCAAuC,GAAG;AAChD,MAAM,uCAAuC,GAAG;AAEvD;;ACpBA;AAQA;;ACRA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-ai-voice-shell-client-contracts.mjs","sources":["../../../../libs/extensions/ai/voice-shell/contracts/src/ai-compatible-operation.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-capability.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-shell.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-transport.types.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/voice-shell.constants.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/index.ts","../../../../libs/extensions/ai/voice-shell/contracts/src/acorex-platform-extension-ai-voice-shell-client-contracts.ts"],"sourcesContent":["//#region ----- Types -----\n\n/** Where an AI-compatible command or query runs. */\nexport type AXPAiCompatibleExecutionMode = 'backend' | 'frontend' | 'both';\n\n/** Safety classification for AI-compatible operations. */\nexport type AXPAiCompatibleSafetyKind = 'read-only' | 'mutating' | 'destructive';\n\nexport interface AXPAiCompatibleSafetyMeta {\n kind?: AXPAiCompatibleSafetyKind;\n sideEffects?: boolean;\n requiresConfirmation?: boolean;\n}\n\n/** Optional voice-shell hints stored in catalog `aiMetadataJson`. */\nexport interface AXPAiCompatibleVoiceMeta {\n speakInputSummary?: boolean;\n confirmPromptKey?: string;\n}\n\n/**\n * Formal AI-compatible command/query contract (parsed from catalog `aiMetadataJson`).\n * Aligns with existing `ai` sidecar fields plus optional voice hints.\n */\nexport interface AXPAiCompatibleOperationMeta {\n toolName?: string;\n shortDescription?: string;\n instruction?: string;\n tags?: string[];\n executionMode?: AXPAiCompatibleExecutionMode;\n safety?: AXPAiCompatibleSafetyMeta;\n voice?: AXPAiCompatibleVoiceMeta;\n followUpTools?: string[];\n usage?: {\n whenToUse?: string[];\n avoidWhen?: string[];\n followUpTools?: string[];\n };\n}\n\n//#endregion\n\n//#region ----- Parsing -----\n\nconst AI_TOOL_TAG = 'ai-tool';\n\nfunction asStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const items = value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n return items.length > 0 ? items : undefined;\n}\n\nfunction asBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction asSafetyKind(value: unknown): AXPAiCompatibleSafetyKind | undefined {\n if (value === 'read-only' || value === 'mutating' || value === 'destructive') {\n return value;\n }\n if (value === 'mutation') {\n return 'mutating';\n }\n return undefined;\n}\n\nfunction asExecutionMode(value: unknown): AXPAiCompatibleExecutionMode | undefined {\n if (value === 'backend' || value === 'frontend' || value === 'both') {\n return value;\n }\n return undefined;\n}\n\n/**\n * Parses catalog `aiMetadataJson` into the AI-compatible operation contract.\n * Returns `null` when the JSON is missing or invalid.\n */\nexport function parseAiCompatibleOperationMeta(\n aiMetadataJson: string | undefined | null,\n): AXPAiCompatibleOperationMeta | null {\n if (!aiMetadataJson?.trim()) {\n return null;\n }\n try {\n const raw = JSON.parse(aiMetadataJson) as Record<string, unknown>;\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {\n return null;\n }\n const safetyRaw =\n raw['safety'] != null && typeof raw['safety'] === 'object' && !Array.isArray(raw['safety'])\n ? (raw['safety'] as Record<string, unknown>)\n : undefined;\n const voiceRaw =\n raw['voice'] != null && typeof raw['voice'] === 'object' && !Array.isArray(raw['voice'])\n ? (raw['voice'] as Record<string, unknown>)\n : undefined;\n const usageRaw =\n raw['usage'] != null && typeof raw['usage'] === 'object' && !Array.isArray(raw['usage'])\n ? (raw['usage'] as Record<string, unknown>)\n : undefined;\n\n const meta: AXPAiCompatibleOperationMeta = {};\n if (typeof raw['toolName'] === 'string' && raw['toolName'].trim()) {\n meta.toolName = raw['toolName'].trim();\n }\n if (typeof raw['shortDescription'] === 'string' && raw['shortDescription'].trim()) {\n meta.shortDescription = raw['shortDescription'].trim();\n }\n if (typeof raw['instruction'] === 'string' && raw['instruction'].trim()) {\n meta.instruction = raw['instruction'].trim();\n }\n const tags = asStringArray(raw['tags']);\n if (tags) {\n meta.tags = tags;\n }\n const executionMode = asExecutionMode(raw['executionMode']);\n if (executionMode) {\n meta.executionMode = executionMode;\n }\n if (safetyRaw) {\n meta.safety = {\n kind: asSafetyKind(safetyRaw['kind']),\n sideEffects: asBoolean(safetyRaw['sideEffects']),\n requiresConfirmation: asBoolean(safetyRaw['requiresConfirmation']),\n };\n }\n if (voiceRaw) {\n meta.voice = {\n speakInputSummary: asBoolean(voiceRaw['speakInputSummary']),\n confirmPromptKey:\n typeof voiceRaw['confirmPromptKey'] === 'string' && voiceRaw['confirmPromptKey'].trim()\n ? voiceRaw['confirmPromptKey'].trim()\n : undefined,\n };\n }\n const followUpTools = asStringArray(raw['followUpTools']) ?? asStringArray(usageRaw?.['followUpTools']);\n if (followUpTools) {\n meta.followUpTools = followUpTools;\n }\n if (usageRaw) {\n meta.usage = {\n whenToUse: asStringArray(usageRaw['whenToUse']),\n avoidWhen: asStringArray(usageRaw['avoidWhen']),\n followUpTools: asStringArray(usageRaw['followUpTools']),\n };\n }\n return meta;\n } catch {\n return null;\n }\n}\n\n/**\n * True when catalog metadata opts the operation into the AI tool surface\n * (`ai-tool` tag, matching existing `commandRowExposedForAi` tag check).\n */\nexport function isAiCompatibleOperationMeta(meta: AXPAiCompatibleOperationMeta | null | undefined): boolean {\n return Array.isArray(meta?.tags) && meta.tags.includes(AI_TOOL_TAG);\n}\n\n/**\n * True when a catalog row should be exposed as an AI-compatible tool.\n * Matches `commandRowExposedForAi`: `capabilities` includes `ai`, or `aiMetadataJson` has the `ai-tool` tag.\n */\nexport function isAiCompatibleCatalogRow(row: {\n capabilities?: string | string[] | null;\n aiMetadataJson?: string | null;\n} | null | undefined): boolean {\n if (!row) {\n return false;\n }\n const caps = row.capabilities;\n if (Array.isArray(caps)) {\n if (caps.some((c) => String(c).toLowerCase() === 'ai')) {\n return true;\n }\n } else if (typeof caps === 'string' && caps.trim()) {\n const parts = caps.split(',').map((s) => s.trim().toLowerCase());\n if (parts.includes('ai')) {\n return true;\n }\n }\n return isAiCompatibleOperationMeta(parseAiCompatibleOperationMeta(row.aiMetadataJson));\n}\n\n//#endregion\n","//#region ----- Types -----\n\n/** Intent payload used to discover a voice capability. */\nexport interface AXPVoiceCapabilityIntent {\n text?: string;\n context?: Record<string, unknown>;\n}\n\n/** Spoken / display prompt returned by interview-style capabilities. */\nexport interface AXPVoicePrompt {\n sessionId: string;\n spokenPrompt: string;\n titleText?: string;\n answerKey?: string;\n widgetKind?: string;\n options?: Array<{ id: string; label: string }>;\n isRequired?: boolean;\n allowSkip?: boolean;\n comment?: { enabled: boolean; required: boolean };\n progress?: { answered: number; totalVisible: number };\n captureStrategy?: 'voice' | 'micro-capture' | 'unsupported';\n}\n\nexport type AXPVoiceNextPromptResult = AXPVoicePrompt | { done: true; sessionId: string; spokenPrompt: string };\n\nexport interface AXPVoiceApplyResult {\n ok: boolean;\n sessionId: string;\n errorCode?: string;\n spokenMessage?: string;\n requiresConfirmation?: boolean;\n next?: AXPVoiceNextPromptResult;\n}\n\nexport interface AXPVoiceSubmitResult {\n ok: boolean;\n sessionId?: string;\n spokenMessage?: string;\n errors?: Array<{ answerKey: string; message: string }>;\n}\n\nexport interface AXPVoiceSaveDraftResult {\n sessionId: string;\n spokenMessage?: string;\n}\n\n/**\n * Platform port implemented by domain modules (assessment is the first).\n * The voice shell talks only to this interface — never to viewer internals.\n */\nexport interface AXPVoiceCapabilityProvider {\n readonly id: string;\n readonly titleKey: string;\n canHandle(intent: AXPVoiceCapabilityIntent): boolean | Promise<boolean>;\n startSession(input: unknown): Promise<{ sessionId: string; spokenPrompt?: string }>;\n nextPrompt?(sessionId: string): Promise<AXPVoiceNextPromptResult>;\n applyInput?(sessionId: string, input: unknown): Promise<AXPVoiceApplyResult>;\n saveDraft?(sessionId: string): Promise<AXPVoiceSaveDraftResult | void>;\n submit?(sessionId: string): Promise<AXPVoiceSubmitResult>;\n cancel?(sessionId: string): Promise<void>;\n}\n\n//#endregion\n","//#region ----- Types -----\n\n/** Primary interaction mode of the central voice command shell. */\nexport type AXPVoiceShellMode = 'command' | 'interview' | 'confirm' | 'capture';\n\n/** Visual / animation state of the void dialog. */\nexport type AXPVoiceShellUiState =\n | 'idle'\n | 'listening'\n | 'thinking'\n | 'speaking'\n | 'confirm'\n | 'error'\n | 'capture';\n\nexport interface AXPVoiceShellConfirmRequest {\n prompt: string;\n confirmLabelKey?: string;\n cancelLabelKey?: string;\n}\n\nexport interface AXPVoiceShellOpenOptions {\n /** Optional spoken or typed kickoff utterance. */\n initialText?: string;\n /** Skip discovery and start this capability (e.g. assessment interview). */\n capabilityId?: string;\n /** Domain start payload forwarded to {@link AXPVoiceCapabilityProvider.startSession}. */\n startInput?: unknown;\n}\n\nexport interface AXPVoiceShellTranscriptTurn {\n role: 'user' | 'assistant';\n text: string;\n}\n\n//#endregion\n","//#region ----- Types -----\n\n/** Speech-to-text result from the interaction transport. */\nexport interface AXPVoiceSttResult {\n text: string;\n}\n\n/** Text-to-speech result from the interaction transport. */\nexport interface AXPVoiceTtsResult {\n fileId?: string;\n objectUrl?: string;\n text: string;\n}\n\n/**\n * Swappable interaction channel (v1 HTTP+SSE / commands; later realtime or WebRTC).\n * Domain APIs stay transport-agnostic.\n */\nexport interface AXPVoiceInteractionTransport {\n readonly id: string;\n transcribe(audio: Blob, options?: { language?: string }): Promise<AXPVoiceSttResult>;\n synthesize(text: string): Promise<AXPVoiceTtsResult>;\n runAssist?(prompt: string, context?: Record<string, unknown>): Promise<{ text: string }>;\n}\n\n//#endregion\n","//#region ----- Constants -----\n\n/** Runtime command that opens the central voice void dialog. */\nexport const AXE_AI_VOICE_SHELL_OPEN_COMMAND = 'AiVoiceShell:Open' as const;\n\n/** Assessment interview capability id (registered by assessment-management). */\nexport const AXE_ASSESSMENT_QUESTIONNAIRE_VOICE_CAPABILITY_ID =\n 'assessment-questionnaire-interview' as const;\n\nexport const ASSESSMENT_FIND_CASE_FOR_VOICE_FILL_COMMAND = 'Assessment:FindCaseForVoiceFill' as const;\nexport const ASSESSMENT_START_HEADLESS_QUESTIONNAIRE_COMMAND =\n 'Assessment:StartHeadlessQuestionnaire' as const;\nexport const ASSESSMENT_NEXT_QUESTIONNAIRE_QUESTION_COMMAND =\n 'Assessment:NextQuestionnaireQuestion' as const;\nexport const ASSESSMENT_APPLY_QUESTIONNAIRE_ANSWER_COMMAND =\n 'Assessment:ApplyQuestionnaireAnswer' as const;\nexport const ASSESSMENT_SAVE_QUESTIONNAIRE_DRAFT_COMMAND = 'Assessment:SaveQuestionnaireDraft' as const;\nexport const ASSESSMENT_SUBMIT_QUESTIONNAIRE_COMMAND = 'Assessment:SubmitQuestionnaire' as const;\nexport const ASSESSMENT_CANCEL_QUESTIONNAIRE_COMMAND = 'Assessment:CancelQuestionnaire' as const;\n\n//#endregion\n","//#region ----- Contracts barrel -----\n\nexport * from './ai-compatible-operation.types';\nexport * from './voice-capability.types';\nexport * from './voice-shell.types';\nexport * from './voice-transport.types';\nexport * from './voice-shell.constants';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -67,7 +67,7 @@ class AXEAiVoiceShellHeaderSlotComponent {
|
|
|
67
67
|
await this.commandExecutor.execute(AXE_AI_VOICE_SHELL_OPEN_COMMAND, {});
|
|
68
68
|
}
|
|
69
69
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEAiVoiceShellHeaderSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXEAiVoiceShellHeaderSlotComponent, isStandalone: true, selector: "axe-ai-voice-shell-header-slot", ngImport: i0, template: "<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", styles: ["axe-ai-voice-shell-header-slot{position:relative}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "
|
|
70
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXEAiVoiceShellHeaderSlotComponent, isStandalone: true, selector: "axe-ai-voice-shell-header-slot", ngImport: i0, template: "<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", styles: ["axe-ai-voice-shell-header-slot{position:relative}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
71
71
|
}
|
|
72
72
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEAiVoiceShellHeaderSlotComponent, decorators: [{
|
|
73
73
|
type: Component,
|
|
@@ -1008,7 +1008,7 @@ class AXEAiVoiceVoidDialogComponent extends AXBasePageComponent {
|
|
|
1008
1008
|
this.activeStream = undefined;
|
|
1009
1009
|
}
|
|
1010
1010
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEAiVoiceVoidDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1011
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXEAiVoiceVoidDialogComponent, isStandalone: true, selector: "axe-ai-voice-void-dialog", usesInheritance: true, ngImport: i0, template: "<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)=\"onMicClick()\"\n [disabled]=\"!canListen() && !isListening()\"\n [attr.aria-label]=\"'@extensions-ai-voice-shell:actions.tap-to-talk' | translate | async\"\n >\n @if (isSpeaking()) {\n <!-- ----- AI is speaking ----- -->\n <i class=\"fa-regular fa-volume-high\"></i>\n }\n <!-- ----- Tap-to-talk / user speaking ----- -->\n @else {\n <i class=\"fa-regular fa-microphone\"></i>\n }\n </button>\n @if (isListening() || isSpeaking()) {\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 (progressLabel()) {\n <!-- ----- Interview progress counter ----- -->\n <p class=\"voice-void-progress\">{{ progressLabel() }}</p>\n }\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 @if (showConfirm()) {\n <!-- ----- Confirm chips for submit / destructive actions ----- -->\n <div class=\"voice-void-confirm\">\n <p class=\"voice-void-confirm-prompt\">{{ shell.confirmRequest()?.prompt }}</p>\n <div class=\"voice-void-confirm-actions\">\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.submit' | translate | async\"\n color=\"primary\"\n (onClick)=\"onConfirmYes()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.keep-editing' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onConfirmNo()\"\n ></ax-button>\n </div>\n </div>\n }\n\n <!-- ----- Secondary interview / listen actions ----- -->\n <div class=\"voice-void-toolbar\">\n @if (isListening()) {\n <!-- ----- Stop listening without sending ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-listen' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelListen()\"\n ></ax-button>\n }\n <!-- ----- Interview session actions ----- -->\n @if (shell.mode() === 'interview') {\n <!-- ----- Draft save and cancel while filling by voice ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.save-draft' | translate | async\"\n [look]=\"'outline'\"\n (onClick)=\"onSaveDraft()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-interview' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelInterview()\"\n ></ax-button>\n }\n </div>\n\n <p class=\"voice-void-hint\">{{ '@extensions-ai-voice-shell:dialog.hint' | translate | async }}</p>\n</div>\n", styles: [":host,axe-ai-voice-void-dialog{display:block;height:auto}.axe-ai-voice-shell-popup .ax-popup-content,.axe-ai-voice-shell-popup .ax-popup-body{overflow:visible}.voice-void{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:16rem;padding:1.25rem 1rem .75rem;gap:1rem}.voice-void-stage{display:flex;flex-direction:column;align-items:center;gap:.75rem;max-width:22rem;text-align:center}.voice-void-orb-wrap{position:relative;display:flex;align-items:center;justify-content:center;width:9.5rem;height:9.5rem}.voice-void-ring{position:absolute;inset:1.1rem;border-radius:50%;pointer-events:none;opacity:0}.voice-void-orb{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;width:6.25rem;height:6.25rem;border:none;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500, 59 130 246));color:rgb(var(--ax-sys-color-on-primary, 255 255 255));font-size:1.75rem;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease,background-color .2s ease}.voice-void-orb:disabled{cursor:default;opacity:.92}.voice-void-orb--idle{box-shadow:0 .5rem 1.25rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .28)}.voice-void-orb--listening{animation:voice-void-user-pulse 1.05s ease-in-out infinite}.voice-void-orb-wrap--listening .voice-void-ring{border:2px solid rgb(var(--ax-sys-color-primary-400, 96 165 250))}.voice-void-orb-wrap--listening .voice-void-ring--1{animation:voice-void-user-ripple 1.5s ease-out infinite}.voice-void-orb-wrap--listening .voice-void-ring--2{animation:voice-void-user-ripple 1.5s ease-out .28s infinite}.voice-void-orb-wrap--listening .voice-void-ring--3{animation:voice-void-user-ripple 1.5s ease-out .56s infinite}.voice-void-orb--thinking{opacity:.8;animation:voice-void-breathe 1.8s ease-in-out infinite}.voice-void-orb--speaking{background:rgb(var(--ax-sys-color-primary-700, 29 78 216));animation:voice-void-ai-glow 1.2s ease-in-out infinite}.voice-void-orb-wrap--speaking .voice-void-ring{border:2px solid rgb(var(--ax-sys-color-primary-300, 147 197 253) / .7)}.voice-void-orb-wrap--speaking .voice-void-ring--1{animation:voice-void-ai-orbit 2.4s linear infinite}.voice-void-orb-wrap--speaking .voice-void-ring--2{inset:.55rem;animation:voice-void-ai-orbit 3.2s linear infinite reverse}.voice-void-orb-wrap--speaking .voice-void-ring--3{display:none}.voice-void-orb--confirm,.voice-void-orb--error{background:rgb(var(--ax-sys-color-warning-500, 217 119 6))}.voice-void-eq{position:absolute;z-index:2;bottom:.85rem;display:none;align-items:flex-end;gap:.18rem;height:1.1rem;pointer-events:none}.voice-void-orb-wrap--listening .voice-void-eq,.voice-void-orb-wrap--speaking .voice-void-eq{display:flex}.voice-void-eq span{display:block;width:.18rem;border-radius:999px;background:rgb(var(--ax-sys-color-on-primary, 255 255 255));transform-origin:bottom center}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(1),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(1){animation:voice-void-eq-bar .7s ease-in-out infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(2),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(2){animation:voice-void-eq-bar .7s ease-in-out .1s infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(3),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(3){animation:voice-void-eq-bar .7s ease-in-out .18s infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(4),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(4){animation:voice-void-eq-bar .7s ease-in-out .08s infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(5),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(5){animation:voice-void-eq-bar .7s ease-in-out .22s infinite}.voice-void-orb-wrap--speaking .voice-void-eq span{animation-duration:.95s}.voice-void-status{margin:0;font-weight:600}.voice-void-progress,.voice-void-spoken,.voice-void-transcript,.voice-void-error,.voice-void-hint,.voice-void-confirm-prompt{margin:0}.voice-void-spoken,.voice-void-transcript{max-height:4.5rem;overflow:auto;font-size:.875rem}.voice-void-spoken,.voice-void-transcript,.voice-void-hint{color:rgb(var(--ax-sys-color-on-surface) / .8)}.voice-void-error{color:rgb(var(--ax-sys-color-danger, 185 28 28))}.voice-void-confirm,.voice-void-toolbar{display:flex;flex-wrap:wrap;gap:.75rem;justify-content:center;align-items:center}.voice-void-confirm{flex-direction:column}.voice-void-hint{font-size:.8125rem}@keyframes voice-void-user-pulse{0%,to{transform:scale(1);box-shadow:0 0 rgb(var(--ax-sys-color-primary-500, 59 130 246) / .4)}50%{transform:scale(1.06);box-shadow:0 0 0 .65rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .12)}}@keyframes voice-void-user-ripple{0%{transform:scale(.92);opacity:.55}to{transform:scale(1.55);opacity:0}}@keyframes voice-void-ai-glow{0%,to{transform:scale(1);box-shadow:0 0 0 .35rem rgb(var(--ax-sys-color-primary-300, 147 197 253) / .35),0 0 1.75rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .55)}50%{transform:scale(1.04);box-shadow:0 0 0 .7rem rgb(var(--ax-sys-color-primary-300, 147 197 253) / .18),0 0 2.25rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .75)}}@keyframes voice-void-ai-orbit{0%{transform:scale(1) rotate(0);opacity:.45;border-style:dashed}50%{opacity:.85}to{transform:scale(1.12) rotate(360deg);opacity:.45;border-style:dashed}}@keyframes voice-void-breathe{0%,to{transform:scale(1);opacity:.8}50%{transform:scale(1.06);opacity:1}}@keyframes voice-void-eq-bar{0%,to{height:.28rem}40%{height:.95rem}70%{height:.45rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1011
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXEAiVoiceVoidDialogComponent, isStandalone: true, selector: "axe-ai-voice-void-dialog", usesInheritance: true, ngImport: i0, template: "<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)=\"onMicClick()\"\n [disabled]=\"!canListen() && !isListening()\"\n [attr.aria-label]=\"'@extensions-ai-voice-shell:actions.tap-to-talk' | translate | async\"\n >\n @if (isSpeaking()) {\n <!-- ----- AI is speaking ----- -->\n <i class=\"fa-regular fa-volume-high\"></i>\n }\n <!-- ----- Tap-to-talk / user speaking ----- -->\n @else {\n <i class=\"fa-regular fa-microphone\"></i>\n }\n </button>\n @if (isListening() || isSpeaking()) {\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 (progressLabel()) {\n <!-- ----- Interview progress counter ----- -->\n <p class=\"voice-void-progress\">{{ progressLabel() }}</p>\n }\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 @if (showConfirm()) {\n <!-- ----- Confirm chips for submit / destructive actions ----- -->\n <div class=\"voice-void-confirm\">\n <p class=\"voice-void-confirm-prompt\">{{ shell.confirmRequest()?.prompt }}</p>\n <div class=\"voice-void-confirm-actions\">\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.submit' | translate | async\"\n color=\"primary\"\n (onClick)=\"onConfirmYes()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.keep-editing' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onConfirmNo()\"\n ></ax-button>\n </div>\n </div>\n }\n\n <!-- ----- Secondary interview / listen actions ----- -->\n <div class=\"voice-void-toolbar\">\n @if (isListening()) {\n <!-- ----- Stop listening without sending ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-listen' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelListen()\"\n ></ax-button>\n }\n <!-- ----- Interview session actions ----- -->\n @if (shell.mode() === 'interview') {\n <!-- ----- Draft save and cancel while filling by voice ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.save-draft' | translate | async\"\n [look]=\"'outline'\"\n (onClick)=\"onSaveDraft()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-interview' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelInterview()\"\n ></ax-button>\n }\n </div>\n\n <p class=\"voice-void-hint\">{{ '@extensions-ai-voice-shell:dialog.hint' | translate | async }}</p>\n</div>\n", styles: [":host,axe-ai-voice-void-dialog{display:block;height:auto}.axe-ai-voice-shell-popup .ax-popup-content,.axe-ai-voice-shell-popup .ax-popup-body{overflow:visible}.voice-void{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:16rem;padding:1.25rem 1rem .75rem;gap:1rem}.voice-void-stage{display:flex;flex-direction:column;align-items:center;gap:.75rem;max-width:22rem;text-align:center}.voice-void-orb-wrap{position:relative;display:flex;align-items:center;justify-content:center;width:9.5rem;height:9.5rem}.voice-void-ring{position:absolute;inset:1.1rem;border-radius:50%;pointer-events:none;opacity:0}.voice-void-orb{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;width:6.25rem;height:6.25rem;border:none;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500, 59 130 246));color:rgb(var(--ax-sys-color-on-primary, 255 255 255));font-size:1.75rem;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease,background-color .2s ease}.voice-void-orb:disabled{cursor:default;opacity:.92}.voice-void-orb--idle{box-shadow:0 .5rem 1.25rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .28)}.voice-void-orb--listening{animation:voice-void-user-pulse 1.05s ease-in-out infinite}.voice-void-orb-wrap--listening .voice-void-ring{border:2px solid rgb(var(--ax-sys-color-primary-400, 96 165 250))}.voice-void-orb-wrap--listening .voice-void-ring--1{animation:voice-void-user-ripple 1.5s ease-out infinite}.voice-void-orb-wrap--listening .voice-void-ring--2{animation:voice-void-user-ripple 1.5s ease-out .28s infinite}.voice-void-orb-wrap--listening .voice-void-ring--3{animation:voice-void-user-ripple 1.5s ease-out .56s infinite}.voice-void-orb--thinking{opacity:.8;animation:voice-void-breathe 1.8s ease-in-out infinite}.voice-void-orb--speaking{background:rgb(var(--ax-sys-color-primary-700, 29 78 216));animation:voice-void-ai-glow 1.2s ease-in-out infinite}.voice-void-orb-wrap--speaking .voice-void-ring{border:2px solid rgb(var(--ax-sys-color-primary-300, 147 197 253) / .7)}.voice-void-orb-wrap--speaking .voice-void-ring--1{animation:voice-void-ai-orbit 2.4s linear infinite}.voice-void-orb-wrap--speaking .voice-void-ring--2{inset:.55rem;animation:voice-void-ai-orbit 3.2s linear infinite reverse}.voice-void-orb-wrap--speaking .voice-void-ring--3{display:none}.voice-void-orb--confirm,.voice-void-orb--error{background:rgb(var(--ax-sys-color-warning-500, 217 119 6))}.voice-void-eq{position:absolute;z-index:2;bottom:.85rem;display:none;align-items:flex-end;gap:.18rem;height:1.1rem;pointer-events:none}.voice-void-orb-wrap--listening .voice-void-eq,.voice-void-orb-wrap--speaking .voice-void-eq{display:flex}.voice-void-eq span{display:block;width:.18rem;border-radius:999px;background:rgb(var(--ax-sys-color-on-primary, 255 255 255));transform-origin:bottom center}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(1),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(1){animation:voice-void-eq-bar .7s ease-in-out infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(2),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(2){animation:voice-void-eq-bar .7s ease-in-out .1s infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(3),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(3){animation:voice-void-eq-bar .7s ease-in-out .18s infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(4),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(4){animation:voice-void-eq-bar .7s ease-in-out .08s infinite}.voice-void-orb-wrap--listening .voice-void-eq span:nth-child(5),.voice-void-orb-wrap--speaking .voice-void-eq span:nth-child(5){animation:voice-void-eq-bar .7s ease-in-out .22s infinite}.voice-void-orb-wrap--speaking .voice-void-eq span{animation-duration:.95s}.voice-void-status{margin:0;font-weight:600}.voice-void-progress,.voice-void-spoken,.voice-void-transcript,.voice-void-error,.voice-void-hint,.voice-void-confirm-prompt{margin:0}.voice-void-spoken,.voice-void-transcript{max-height:4.5rem;overflow:auto;font-size:.875rem}.voice-void-spoken,.voice-void-transcript,.voice-void-hint{color:rgb(var(--ax-sys-color-on-surface) / .8)}.voice-void-error{color:rgb(var(--ax-sys-color-danger, 185 28 28))}.voice-void-confirm,.voice-void-toolbar{display:flex;flex-wrap:wrap;gap:.75rem;justify-content:center;align-items:center}.voice-void-confirm{flex-direction:column}.voice-void-hint{font-size:.8125rem}@keyframes voice-void-user-pulse{0%,to{transform:scale(1);box-shadow:0 0 rgb(var(--ax-sys-color-primary-500, 59 130 246) / .4)}50%{transform:scale(1.06);box-shadow:0 0 0 .65rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .12)}}@keyframes voice-void-user-ripple{0%{transform:scale(.92);opacity:.55}to{transform:scale(1.55);opacity:0}}@keyframes voice-void-ai-glow{0%,to{transform:scale(1);box-shadow:0 0 0 .35rem rgb(var(--ax-sys-color-primary-300, 147 197 253) / .35),0 0 1.75rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .55)}50%{transform:scale(1.04);box-shadow:0 0 0 .7rem rgb(var(--ax-sys-color-primary-300, 147 197 253) / .18),0 0 2.25rem rgb(var(--ax-sys-color-primary-500, 59 130 246) / .75)}}@keyframes voice-void-ai-orbit{0%{transform:scale(1) rotate(0);opacity:.45;border-style:dashed}50%{opacity:.85}to{transform:scale(1.12) rotate(360deg);opacity:.45;border-style:dashed}}@keyframes voice-void-breathe{0%,to{transform:scale(1);opacity:.8}50%{transform:scale(1.06);opacity:1}}@keyframes voice-void-eq-bar{0%,to{height:.28rem}40%{height:.95rem}70%{height:.45rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1012
1012
|
}
|
|
1013
1013
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEAiVoiceVoidDialogComponent, decorators: [{
|
|
1014
1014
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-ai-voice-shell-client.mjs","sources":["../../../../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/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/browser-speech-synthesis.util.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-command-shell.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 ----- 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';\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 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 void this.openVoiceCommand();\n },\n },\n ],\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async openVoiceCommand(): Promise<void> {\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 { NgModule } from '@angular/core';\nimport { AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXPComponentSlotModule } from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXMAiManagementModule } from '@acorex-platform/module-ai-management-client';\nimport { AXE_AI_VOICE_SHELL_OPEN_COMMAND } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXEAiVoiceShellHeaderSlotComponent } from './voice-shell-header-slot.component';\nimport { AXEAiVoiceShellSearchCommandProvider } from './voice-shell-search.provider';\n\n//#endregion\n\n//#region ----- Module -----\n\n/**\n * Central voice AI command shell (void dialog + capability registry + HTTP/SSE transport).\n * Register next to {@link AXMAiManagementModule}. Domain modules register {@link AXP_VOICE_CAPABILITY_PROVIDER}.\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 ],\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 ----- Browser speech -----\n\nexport function canUseBrowserSpeechSynthesis(): boolean {\n return typeof window !== 'undefined' && typeof window.speechSynthesis?.speak === 'function';\n}\n\n/** Unlock speech synthesis during a user gesture so later replies can be spoken. */\nexport function primeBrowserSpeechSynthesis(): void {\n if (!canUseBrowserSpeechSynthesis()) {\n return;\n }\n try {\n window.speechSynthesis.cancel();\n const silent = new SpeechSynthesisUtterance(' ');\n silent.volume = 0;\n silent.rate = 10;\n window.speechSynthesis.speak(silent);\n window.speechSynthesis.cancel();\n } catch {\n // Ignore browsers that reject the silent prime utterance.\n }\n}\n\nexport function cancelBrowserSpeechSynthesis(): void {\n if (!canUseBrowserSpeechSynthesis()) {\n return;\n }\n window.speechSynthesis.cancel();\n}\n\nexport function speakWithBrowserSpeechSynthesis(text: string): Promise<boolean> {\n const trimmed = text.trim();\n if (!trimmed || !canUseBrowserSpeechSynthesis()) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n try {\n window.speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(trimmed);\n const done = (ok: boolean): void => {\n utterance.onend = null;\n utterance.onerror = null;\n resolve(ok);\n };\n utterance.onend = () => done(true);\n utterance.onerror = () => done(false);\n window.speechSynthesis.speak(utterance);\n } catch {\n resolve(false);\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 type {\n AXPVoiceApplyResult,\n AXPVoiceCapabilityProvider,\n AXPVoiceNextPromptResult,\n AXPVoiceShellConfirmRequest,\n AXPVoiceShellMode,\n AXPVoiceShellOpenOptions,\n AXPVoiceShellTranscriptTurn,\n AXPVoiceShellUiState,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXE_ASSESSMENT_QUESTIONNAIRE_VOICE_CAPABILITY_ID } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPVoiceCapabilityRegistry } from './voice-capability-registry.service';\nimport { AXPHttpSseVoiceTransport } from './transport/http-sse-voice-transport.service';\nimport {\n cancelBrowserSpeechSynthesis,\n speakWithBrowserSpeechSynthesis,\n} from './browser-speech-synthesis.util';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst INTERVIEW_INTENT_RE =\n /\\b(fill|inspect|inspection|questionnaire|assessment|survey|checklist|فرم|پرسشنامه|بازرسی)\\b/i;\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Session coordinator for the central voice void dialog.\n * Does not import assessment internals — only the capability registry and transport.\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 registry = inject(AXPVoiceCapabilityRegistry);\n private readonly transport = inject(AXPHttpSseVoiceTransport);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly uiState = signal<AXPVoiceShellUiState>('idle');\n readonly mode = signal<AXPVoiceShellMode>('command');\n readonly statusText = signal('');\n readonly lastTranscript = signal('');\n readonly lastSpoken = signal('');\n readonly errorMessage = signal('');\n readonly confirmRequest = signal<AXPVoiceShellConfirmRequest | null>(null);\n readonly turns = signal<AXPVoiceShellTranscriptTurn[]>([]);\n readonly interviewProgress = signal<{ answered: number; totalVisible: number } | null>(null);\n\n //#endregion\n\n //#region ----- Session -----\n\n private activeCapability: AXPVoiceCapabilityProvider | null = null;\n private activeSessionId: string | null = null;\n private pendingSpokenConfirm: { kind: 'submit' } | null = null;\n private currentAudio: HTMLAudioElement | null = null;\n private currentObjectUrl: string | null = null;\n private openPromise: Promise<void> | null = null;\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.resetSession();\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\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 this.stopPlayback();\n this.resetSession();\n });\n\n if (options?.capabilityId || options?.startInput) {\n void this.beginCapabilitySession(options);\n } else if (options?.initialText?.trim()) {\n void this.handleUserText(options.initialText.trim());\n }\n\n return this.openPromise;\n }\n\n async enterListening(): Promise<void> {\n this.stopPlayback();\n this.uiState.set('listening');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.listening'));\n this.errorMessage.set('');\n }\n\n async cancelListening(): Promise<void> {\n this.uiState.set('idle');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n async reportError(key: string, detail?: string): Promise<void> {\n await this.setError(key, detail);\n }\n\n async submitRecording(audio: Blob): Promise<void> {\n this.uiState.set('thinking');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.thinking'));\n try {\n const { text } = await this.transport.transcribe(audio);\n if (!text.trim()) {\n await this.setError('@extensions-ai-voice-shell:errors.empty-transcript');\n return;\n }\n await this.handleUserText(text.trim());\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.transcribe-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n async handleUserText(text: string): Promise<void> {\n const trimmed = text.trim();\n if (!trimmed) {\n return;\n }\n this.lastTranscript.set(trimmed);\n this.appendTurn('user', trimmed);\n this.uiState.set('thinking');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.thinking'));\n this.errorMessage.set('');\n\n if (this.mode() === 'confirm' && this.pendingSpokenConfirm) {\n await this.handleConfirmUtterance(trimmed);\n return;\n }\n\n if (this.mode() === 'interview' && this.activeCapability && this.activeSessionId) {\n await this.applyInterviewUtterance(trimmed);\n return;\n }\n\n const intent = { text: trimmed };\n const capability =\n this.registry.getById(AXE_ASSESSMENT_QUESTIONNAIRE_VOICE_CAPABILITY_ID) && INTERVIEW_INTENT_RE.test(trimmed)\n ? await this.registry.findForIntent(intent)\n : await this.registry.findForIntent(intent);\n\n if (capability) {\n await this.beginCapabilitySession({ capabilityId: capability.id, startInput: { text: trimmed } });\n return;\n }\n\n await this.runCommandAssist(trimmed);\n }\n\n async confirmYes(): Promise<void> {\n if (this.pendingSpokenConfirm?.kind === 'submit') {\n await this.submitInterview();\n return;\n }\n this.confirmRequest.set(null);\n this.mode.set(this.activeSessionId ? 'interview' : 'command');\n this.uiState.set('idle');\n }\n\n async confirmNo(): Promise<void> {\n this.pendingSpokenConfirm = null;\n this.confirmRequest.set(null);\n if (this.activeSessionId) {\n this.mode.set('interview');\n const stay = await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submit-cancelled');\n await this.speak(stay);\n return;\n }\n this.mode.set('command');\n this.uiState.set('idle');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n async saveInterviewDraft(): Promise<void> {\n if (!this.activeCapability?.saveDraft || !this.activeSessionId) {\n return;\n }\n this.uiState.set('thinking');\n try {\n const result = await this.activeCapability.saveDraft(this.activeSessionId);\n const spoken =\n result && typeof result === 'object' && 'spokenMessage' in result && result.spokenMessage\n ? result.spokenMessage\n : await this.translation.translateAsync('@extensions-ai-voice-shell:interview.draft-saved');\n await this.speak(spoken);\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.save-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n async cancelInterview(): Promise<void> {\n if (this.activeCapability?.cancel && this.activeSessionId) {\n await this.activeCapability.cancel(this.activeSessionId);\n }\n this.resetSession();\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n stopPlayback(): void {\n if (this.currentAudio) {\n this.currentAudio.pause();\n this.currentAudio = null;\n }\n if (this.currentObjectUrl) {\n URL.revokeObjectURL(this.currentObjectUrl);\n this.currentObjectUrl = null;\n }\n cancelBrowserSpeechSynthesis();\n }\n\n //#endregion\n\n //#region ----- Interview / command -----\n\n private async beginCapabilitySession(options: AXPVoiceShellOpenOptions): Promise<void> {\n const startInput = options.startInput;\n const startText =\n startInput != null && typeof startInput === 'object' && 'text' in startInput\n ? String((startInput as { text?: unknown }).text ?? '')\n : '';\n const capability = options.capabilityId\n ? this.registry.getById(options.capabilityId)\n : await this.registry.findForIntent({\n text: startText || undefined,\n context:\n startInput != null && typeof startInput === 'object'\n ? (startInput as Record<string, unknown>)\n : undefined,\n });\n if (!capability) {\n await this.setError('@extensions-ai-voice-shell:errors.no-capability');\n return;\n }\n this.uiState.set('thinking');\n try {\n const started = await capability.startSession(options.startInput ?? {});\n this.activeCapability = capability;\n this.activeSessionId = started.sessionId;\n this.mode.set('interview');\n if (started.spokenPrompt) {\n await this.speak(started.spokenPrompt);\n }\n if (capability.nextPrompt) {\n await this.speakNextPrompt();\n }\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.start-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async speakNextPrompt(): Promise<void> {\n if (!this.activeCapability?.nextPrompt || !this.activeSessionId) {\n return;\n }\n const next = await this.activeCapability.nextPrompt(this.activeSessionId);\n await this.handleNextPrompt(next);\n }\n\n private async handleNextPrompt(next: AXPVoiceNextPromptResult): Promise<void> {\n if ('done' in next && next.done) {\n this.interviewProgress.set(null);\n await this.enterSubmitConfirm(next.spokenPrompt);\n return;\n }\n if ('spokenPrompt' in next) {\n if ('progress' in next && next.progress) {\n this.interviewProgress.set(next.progress);\n }\n await this.speak(next.spokenPrompt);\n }\n }\n\n private async applyInterviewUtterance(text: string): Promise<void> {\n if (!this.activeCapability?.applyInput || !this.activeSessionId) {\n return;\n }\n try {\n const result: AXPVoiceApplyResult = await this.activeCapability.applyInput(this.activeSessionId, {\n text,\n });\n if (!result.ok) {\n await this.speak(\n result.spokenMessage ??\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.apply-failed')),\n );\n return;\n }\n if (result.next) {\n await this.handleNextPrompt(result.next);\n return;\n }\n await this.speakNextPrompt();\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.apply-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async enterSubmitConfirm(spoken?: string): Promise<void> {\n this.mode.set('confirm');\n this.pendingSpokenConfirm = { kind: 'submit' };\n const prompt =\n spoken?.trim() ||\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submit-confirm'));\n this.confirmRequest.set({\n prompt,\n confirmLabelKey: '@extensions-ai-voice-shell:actions.submit',\n cancelLabelKey: '@extensions-ai-voice-shell:actions.keep-editing',\n });\n await this.speak(prompt);\n }\n\n private async handleConfirmUtterance(text: string): Promise<void> {\n const normalized = text.trim().toLowerCase();\n const yes = /^(yes|y|ok|okay|sure|submit|confirm|بله|آره|باشه|تایید)$/i.test(normalized);\n const no = /^(no|n|cancel|stop|نه|خیر|لغو)$/i.test(normalized);\n if (yes) {\n await this.confirmYes();\n return;\n }\n if (no) {\n await this.confirmNo();\n return;\n }\n await this.speak(await this.translation.translateAsync('@extensions-ai-voice-shell:interview.confirm-repeat'));\n }\n\n private async submitInterview(): Promise<void> {\n if (!this.activeCapability?.submit || !this.activeSessionId) {\n return;\n }\n this.uiState.set('thinking');\n try {\n const result = await this.activeCapability.submit(this.activeSessionId);\n this.pendingSpokenConfirm = null;\n this.confirmRequest.set(null);\n if (!result.ok) {\n const spoken =\n result.spokenMessage ||\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submit-failed'));\n await this.speak(spoken);\n this.mode.set('interview');\n return;\n }\n const spoken =\n result.spokenMessage ||\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submitted'));\n await this.speak(spoken);\n this.resetSession();\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.submit-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async runCommandAssist(text: string): Promise<void> {\n try {\n const { text: reply } = await this.transport.runAssist(text, {\n voiceShell: true,\n mode: 'command',\n });\n const spoken =\n reply.trim() || (await this.translation.translateAsync('@extensions-ai-voice-shell:command.empty-reply'));\n await this.speak(spoken);\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.assist-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async speak(text: string): Promise<void> {\n const trimmed = text.trim();\n if (!trimmed) {\n this.uiState.set('idle');\n return;\n }\n this.lastSpoken.set(trimmed);\n this.appendTurn('assistant', trimmed);\n this.uiState.set('speaking');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.speaking'));\n this.stopPlayback();\n try {\n const tts = await this.transport.synthesize(trimmed);\n if (tts.objectUrl) {\n this.currentObjectUrl = tts.objectUrl;\n const played = await this.playObjectUrl(tts.objectUrl);\n if (played) {\n await this.finishSpeaking();\n return;\n }\n }\n } catch {\n // Fall through to browser speech when server TTS is unavailable.\n }\n await speakWithBrowserSpeechSynthesis(trimmed);\n await this.finishSpeaking();\n }\n\n private async finishSpeaking(): Promise<void> {\n if (this.mode() === 'confirm') {\n this.uiState.set('confirm');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.confirm'));\n return;\n }\n this.uiState.set('idle');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n private playObjectUrl(url: string): Promise<boolean> {\n return new Promise((resolve) => {\n const audio = new Audio(url);\n this.currentAudio = audio;\n const finish = (ok: boolean): void => {\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n resolve(ok);\n };\n const onEnded = (): void => finish(true);\n const onError = (): void => finish(false);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n void audio.play().catch(() => finish(false));\n });\n }\n\n private async setError(key: string, detail?: string): Promise<void> {\n const messageKey = detail?.startsWith('@') ? detail : key;\n this.errorMessage.set(await this.translation.translateAsync(messageKey));\n this.uiState.set('error');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.error'));\n }\n\n private appendTurn(role: 'user' | 'assistant', text: string): void {\n this.turns.update((current) => [...current, { role, text }]);\n }\n\n private resetSession(): void {\n this.activeCapability = null;\n this.activeSessionId = null;\n this.pendingSpokenConfirm = null;\n this.confirmRequest.set(null);\n this.interviewProgress.set(null);\n this.mode.set('command');\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 { 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, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n inject,\n} from '@angular/core';\nimport {\n cancelBrowserSpeechSynthesis,\n primeBrowserSpeechSynthesis,\n} from '../browser-speech-synthesis.util';\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 private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State -----\n\n private mediaRecorder?: MediaRecorder;\n private audioChunks: Blob[] = [];\n private activeStream?: MediaStream;\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 canListen = computed(() => {\n const state = this.shell.uiState();\n return state === 'idle' || state === 'error' || state === 'confirm';\n });\n readonly isListening = computed(() => this.shell.uiState() === 'listening');\n readonly isSpeaking = computed(() => this.shell.uiState() === 'speaking');\n readonly showConfirm = computed(() => this.shell.uiState() === 'confirm' && this.shell.confirmRequest() != null);\n readonly progressLabel = computed(() => {\n const progress = this.shell.interviewProgress();\n if (!progress || progress.totalVisible <= 0) {\n return '';\n }\n return `${progress.answered}/${progress.totalVisible}`;\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n this.destroyRef.onDestroy(() => {\n this.stopTracks();\n cancelBrowserSpeechSynthesis();\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n async onMicClick(): Promise<void> {\n if (isPlatformBrowser(this.platformId)) {\n primeBrowserSpeechSynthesis();\n }\n if (this.isListening()) {\n await this.stopAndSubmit();\n return;\n }\n if (!this.canListen()) {\n return;\n }\n await this.startRecording();\n }\n\n async onCancelListen(): Promise<void> {\n this.stopTracks();\n this.audioChunks = [];\n await this.shell.cancelListening();\n }\n\n async onConfirmYes(): Promise<void> {\n await this.shell.confirmYes();\n }\n\n async onConfirmNo(): Promise<void> {\n await this.shell.confirmNo();\n }\n\n async onSaveDraft(): Promise<void> {\n await this.shell.saveInterviewDraft();\n }\n\n async onCancelInterview(): Promise<void> {\n await this.shell.cancelInterview();\n }\n\n //#endregion\n\n //#region ----- Recording -----\n\n private async startRecording(): Promise<void> {\n if (!isPlatformBrowser(this.platformId) || !navigator.mediaDevices?.getUserMedia) {\n await this.shell.reportError('@extensions-ai-voice-shell:errors.mic-unavailable');\n return;\n }\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.activeStream = stream;\n this.audioChunks = [];\n const recorder = new MediaRecorder(stream);\n this.mediaRecorder = recorder;\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n };\n recorder.start(250);\n await this.shell.enterListening();\n } catch {\n this.stopTracks();\n await this.shell.reportError('@extensions-ai-voice-shell:errors.mic-denied');\n }\n }\n\n private async stopAndSubmit(): Promise<void> {\n const recorder = this.mediaRecorder;\n if (!recorder || recorder.state !== 'recording') {\n this.stopTracks();\n await this.shell.cancelListening();\n return;\n }\n const blob = await new Promise<Blob | null>((resolve) => {\n recorder.onstop = () => {\n const mime = recorder.mimeType?.trim() || this.audioChunks[0]?.type?.trim() || 'audio/webm';\n const audioBlob = new Blob(this.audioChunks, { type: mime });\n resolve(audioBlob.size > 0 ? audioBlob : null);\n };\n recorder.requestData();\n recorder.stop();\n });\n this.stopTracks();\n if (!blob) {\n await this.shell.cancelListening();\n return;\n }\n await this.shell.submitRecording(blob);\n }\n\n private stopTracks(): void {\n if (this.mediaRecorder?.state === 'recording') {\n this.mediaRecorder.stop();\n }\n this.mediaRecorder = undefined;\n this.activeStream?.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\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)=\"onMicClick()\"\n [disabled]=\"!canListen() && !isListening()\"\n [attr.aria-label]=\"'@extensions-ai-voice-shell:actions.tap-to-talk' | translate | async\"\n >\n @if (isSpeaking()) {\n <!-- ----- AI is speaking ----- -->\n <i class=\"fa-regular fa-volume-high\"></i>\n }\n <!-- ----- Tap-to-talk / user speaking ----- -->\n @else {\n <i class=\"fa-regular fa-microphone\"></i>\n }\n </button>\n @if (isListening() || isSpeaking()) {\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 (progressLabel()) {\n <!-- ----- Interview progress counter ----- -->\n <p class=\"voice-void-progress\">{{ progressLabel() }}</p>\n }\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 @if (showConfirm()) {\n <!-- ----- Confirm chips for submit / destructive actions ----- -->\n <div class=\"voice-void-confirm\">\n <p class=\"voice-void-confirm-prompt\">{{ shell.confirmRequest()?.prompt }}</p>\n <div class=\"voice-void-confirm-actions\">\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.submit' | translate | async\"\n color=\"primary\"\n (onClick)=\"onConfirmYes()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.keep-editing' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onConfirmNo()\"\n ></ax-button>\n </div>\n </div>\n }\n\n <!-- ----- Secondary interview / listen actions ----- -->\n <div class=\"voice-void-toolbar\">\n @if (isListening()) {\n <!-- ----- Stop listening without sending ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-listen' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelListen()\"\n ></ax-button>\n }\n <!-- ----- Interview session actions ----- -->\n @if (shell.mode() === 'interview') {\n <!-- ----- Draft save and cancel while filling by voice ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.save-draft' | translate | async\"\n [look]=\"'outline'\"\n (onClick)=\"onSaveDraft()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-interview' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelInterview()\"\n ></ax-button>\n }\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-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/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/browser-speech-synthesis.util.ts","../../../../libs/extensions/ai/voice-shell/client/src/lib/voice-command-shell.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 ----- 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';\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 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 void this.openVoiceCommand();\n },\n },\n ],\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async openVoiceCommand(): Promise<void> {\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 { NgModule } from '@angular/core';\nimport { AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXPComponentSlotModule } from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXMAiManagementModule } from '@acorex-platform/module-ai-management-client';\nimport { AXE_AI_VOICE_SHELL_OPEN_COMMAND } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXEAiVoiceShellHeaderSlotComponent } from './voice-shell-header-slot.component';\nimport { AXEAiVoiceShellSearchCommandProvider } from './voice-shell-search.provider';\n\n//#endregion\n\n//#region ----- Module -----\n\n/**\n * Central voice AI command shell (void dialog + capability registry + HTTP/SSE transport).\n * Register next to {@link AXMAiManagementModule}. Domain modules register {@link AXP_VOICE_CAPABILITY_PROVIDER}.\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 ],\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 ----- Browser speech -----\n\nexport function canUseBrowserSpeechSynthesis(): boolean {\n return typeof window !== 'undefined' && typeof window.speechSynthesis?.speak === 'function';\n}\n\n/** Unlock speech synthesis during a user gesture so later replies can be spoken. */\nexport function primeBrowserSpeechSynthesis(): void {\n if (!canUseBrowserSpeechSynthesis()) {\n return;\n }\n try {\n window.speechSynthesis.cancel();\n const silent = new SpeechSynthesisUtterance(' ');\n silent.volume = 0;\n silent.rate = 10;\n window.speechSynthesis.speak(silent);\n window.speechSynthesis.cancel();\n } catch {\n // Ignore browsers that reject the silent prime utterance.\n }\n}\n\nexport function cancelBrowserSpeechSynthesis(): void {\n if (!canUseBrowserSpeechSynthesis()) {\n return;\n }\n window.speechSynthesis.cancel();\n}\n\nexport function speakWithBrowserSpeechSynthesis(text: string): Promise<boolean> {\n const trimmed = text.trim();\n if (!trimmed || !canUseBrowserSpeechSynthesis()) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n try {\n window.speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(trimmed);\n const done = (ok: boolean): void => {\n utterance.onend = null;\n utterance.onerror = null;\n resolve(ok);\n };\n utterance.onend = () => done(true);\n utterance.onerror = () => done(false);\n window.speechSynthesis.speak(utterance);\n } catch {\n resolve(false);\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 type {\n AXPVoiceApplyResult,\n AXPVoiceCapabilityProvider,\n AXPVoiceNextPromptResult,\n AXPVoiceShellConfirmRequest,\n AXPVoiceShellMode,\n AXPVoiceShellOpenOptions,\n AXPVoiceShellTranscriptTurn,\n AXPVoiceShellUiState,\n} from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXE_ASSESSMENT_QUESTIONNAIRE_VOICE_CAPABILITY_ID } from '@acorex-platform/extension-ai-voice-shell-client/contracts';\nimport { AXPVoiceCapabilityRegistry } from './voice-capability-registry.service';\nimport { AXPHttpSseVoiceTransport } from './transport/http-sse-voice-transport.service';\nimport {\n cancelBrowserSpeechSynthesis,\n speakWithBrowserSpeechSynthesis,\n} from './browser-speech-synthesis.util';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst INTERVIEW_INTENT_RE =\n /\\b(fill|inspect|inspection|questionnaire|assessment|survey|checklist|فرم|پرسشنامه|بازرسی)\\b/i;\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Session coordinator for the central voice void dialog.\n * Does not import assessment internals — only the capability registry and transport.\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 registry = inject(AXPVoiceCapabilityRegistry);\n private readonly transport = inject(AXPHttpSseVoiceTransport);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly uiState = signal<AXPVoiceShellUiState>('idle');\n readonly mode = signal<AXPVoiceShellMode>('command');\n readonly statusText = signal('');\n readonly lastTranscript = signal('');\n readonly lastSpoken = signal('');\n readonly errorMessage = signal('');\n readonly confirmRequest = signal<AXPVoiceShellConfirmRequest | null>(null);\n readonly turns = signal<AXPVoiceShellTranscriptTurn[]>([]);\n readonly interviewProgress = signal<{ answered: number; totalVisible: number } | null>(null);\n\n //#endregion\n\n //#region ----- Session -----\n\n private activeCapability: AXPVoiceCapabilityProvider | null = null;\n private activeSessionId: string | null = null;\n private pendingSpokenConfirm: { kind: 'submit' } | null = null;\n private currentAudio: HTMLAudioElement | null = null;\n private currentObjectUrl: string | null = null;\n private openPromise: Promise<void> | null = null;\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.resetSession();\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\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 this.stopPlayback();\n this.resetSession();\n });\n\n if (options?.capabilityId || options?.startInput) {\n void this.beginCapabilitySession(options);\n } else if (options?.initialText?.trim()) {\n void this.handleUserText(options.initialText.trim());\n }\n\n return this.openPromise;\n }\n\n async enterListening(): Promise<void> {\n this.stopPlayback();\n this.uiState.set('listening');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.listening'));\n this.errorMessage.set('');\n }\n\n async cancelListening(): Promise<void> {\n this.uiState.set('idle');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n async reportError(key: string, detail?: string): Promise<void> {\n await this.setError(key, detail);\n }\n\n async submitRecording(audio: Blob): Promise<void> {\n this.uiState.set('thinking');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.thinking'));\n try {\n const { text } = await this.transport.transcribe(audio);\n if (!text.trim()) {\n await this.setError('@extensions-ai-voice-shell:errors.empty-transcript');\n return;\n }\n await this.handleUserText(text.trim());\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.transcribe-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n async handleUserText(text: string): Promise<void> {\n const trimmed = text.trim();\n if (!trimmed) {\n return;\n }\n this.lastTranscript.set(trimmed);\n this.appendTurn('user', trimmed);\n this.uiState.set('thinking');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.thinking'));\n this.errorMessage.set('');\n\n if (this.mode() === 'confirm' && this.pendingSpokenConfirm) {\n await this.handleConfirmUtterance(trimmed);\n return;\n }\n\n if (this.mode() === 'interview' && this.activeCapability && this.activeSessionId) {\n await this.applyInterviewUtterance(trimmed);\n return;\n }\n\n const intent = { text: trimmed };\n const capability =\n this.registry.getById(AXE_ASSESSMENT_QUESTIONNAIRE_VOICE_CAPABILITY_ID) && INTERVIEW_INTENT_RE.test(trimmed)\n ? await this.registry.findForIntent(intent)\n : await this.registry.findForIntent(intent);\n\n if (capability) {\n await this.beginCapabilitySession({ capabilityId: capability.id, startInput: { text: trimmed } });\n return;\n }\n\n await this.runCommandAssist(trimmed);\n }\n\n async confirmYes(): Promise<void> {\n if (this.pendingSpokenConfirm?.kind === 'submit') {\n await this.submitInterview();\n return;\n }\n this.confirmRequest.set(null);\n this.mode.set(this.activeSessionId ? 'interview' : 'command');\n this.uiState.set('idle');\n }\n\n async confirmNo(): Promise<void> {\n this.pendingSpokenConfirm = null;\n this.confirmRequest.set(null);\n if (this.activeSessionId) {\n this.mode.set('interview');\n const stay = await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submit-cancelled');\n await this.speak(stay);\n return;\n }\n this.mode.set('command');\n this.uiState.set('idle');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n async saveInterviewDraft(): Promise<void> {\n if (!this.activeCapability?.saveDraft || !this.activeSessionId) {\n return;\n }\n this.uiState.set('thinking');\n try {\n const result = await this.activeCapability.saveDraft(this.activeSessionId);\n const spoken =\n result && typeof result === 'object' && 'spokenMessage' in result && result.spokenMessage\n ? result.spokenMessage\n : await this.translation.translateAsync('@extensions-ai-voice-shell:interview.draft-saved');\n await this.speak(spoken);\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.save-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n async cancelInterview(): Promise<void> {\n if (this.activeCapability?.cancel && this.activeSessionId) {\n await this.activeCapability.cancel(this.activeSessionId);\n }\n this.resetSession();\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n stopPlayback(): void {\n if (this.currentAudio) {\n this.currentAudio.pause();\n this.currentAudio = null;\n }\n if (this.currentObjectUrl) {\n URL.revokeObjectURL(this.currentObjectUrl);\n this.currentObjectUrl = null;\n }\n cancelBrowserSpeechSynthesis();\n }\n\n //#endregion\n\n //#region ----- Interview / command -----\n\n private async beginCapabilitySession(options: AXPVoiceShellOpenOptions): Promise<void> {\n const startInput = options.startInput;\n const startText =\n startInput != null && typeof startInput === 'object' && 'text' in startInput\n ? String((startInput as { text?: unknown }).text ?? '')\n : '';\n const capability = options.capabilityId\n ? this.registry.getById(options.capabilityId)\n : await this.registry.findForIntent({\n text: startText || undefined,\n context:\n startInput != null && typeof startInput === 'object'\n ? (startInput as Record<string, unknown>)\n : undefined,\n });\n if (!capability) {\n await this.setError('@extensions-ai-voice-shell:errors.no-capability');\n return;\n }\n this.uiState.set('thinking');\n try {\n const started = await capability.startSession(options.startInput ?? {});\n this.activeCapability = capability;\n this.activeSessionId = started.sessionId;\n this.mode.set('interview');\n if (started.spokenPrompt) {\n await this.speak(started.spokenPrompt);\n }\n if (capability.nextPrompt) {\n await this.speakNextPrompt();\n }\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.start-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async speakNextPrompt(): Promise<void> {\n if (!this.activeCapability?.nextPrompt || !this.activeSessionId) {\n return;\n }\n const next = await this.activeCapability.nextPrompt(this.activeSessionId);\n await this.handleNextPrompt(next);\n }\n\n private async handleNextPrompt(next: AXPVoiceNextPromptResult): Promise<void> {\n if ('done' in next && next.done) {\n this.interviewProgress.set(null);\n await this.enterSubmitConfirm(next.spokenPrompt);\n return;\n }\n if ('spokenPrompt' in next) {\n if ('progress' in next && next.progress) {\n this.interviewProgress.set(next.progress);\n }\n await this.speak(next.spokenPrompt);\n }\n }\n\n private async applyInterviewUtterance(text: string): Promise<void> {\n if (!this.activeCapability?.applyInput || !this.activeSessionId) {\n return;\n }\n try {\n const result: AXPVoiceApplyResult = await this.activeCapability.applyInput(this.activeSessionId, {\n text,\n });\n if (!result.ok) {\n await this.speak(\n result.spokenMessage ??\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.apply-failed')),\n );\n return;\n }\n if (result.next) {\n await this.handleNextPrompt(result.next);\n return;\n }\n await this.speakNextPrompt();\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.apply-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async enterSubmitConfirm(spoken?: string): Promise<void> {\n this.mode.set('confirm');\n this.pendingSpokenConfirm = { kind: 'submit' };\n const prompt =\n spoken?.trim() ||\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submit-confirm'));\n this.confirmRequest.set({\n prompt,\n confirmLabelKey: '@extensions-ai-voice-shell:actions.submit',\n cancelLabelKey: '@extensions-ai-voice-shell:actions.keep-editing',\n });\n await this.speak(prompt);\n }\n\n private async handleConfirmUtterance(text: string): Promise<void> {\n const normalized = text.trim().toLowerCase();\n const yes = /^(yes|y|ok|okay|sure|submit|confirm|بله|آره|باشه|تایید)$/i.test(normalized);\n const no = /^(no|n|cancel|stop|نه|خیر|لغو)$/i.test(normalized);\n if (yes) {\n await this.confirmYes();\n return;\n }\n if (no) {\n await this.confirmNo();\n return;\n }\n await this.speak(await this.translation.translateAsync('@extensions-ai-voice-shell:interview.confirm-repeat'));\n }\n\n private async submitInterview(): Promise<void> {\n if (!this.activeCapability?.submit || !this.activeSessionId) {\n return;\n }\n this.uiState.set('thinking');\n try {\n const result = await this.activeCapability.submit(this.activeSessionId);\n this.pendingSpokenConfirm = null;\n this.confirmRequest.set(null);\n if (!result.ok) {\n const spoken =\n result.spokenMessage ||\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submit-failed'));\n await this.speak(spoken);\n this.mode.set('interview');\n return;\n }\n const spoken =\n result.spokenMessage ||\n (await this.translation.translateAsync('@extensions-ai-voice-shell:interview.submitted'));\n await this.speak(spoken);\n this.resetSession();\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.submit-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async runCommandAssist(text: string): Promise<void> {\n try {\n const { text: reply } = await this.transport.runAssist(text, {\n voiceShell: true,\n mode: 'command',\n });\n const spoken =\n reply.trim() || (await this.translation.translateAsync('@extensions-ai-voice-shell:command.empty-reply'));\n await this.speak(spoken);\n } catch (err) {\n await this.setError(\n '@extensions-ai-voice-shell:errors.assist-failed',\n err instanceof Error ? err.message : undefined,\n );\n }\n }\n\n private async speak(text: string): Promise<void> {\n const trimmed = text.trim();\n if (!trimmed) {\n this.uiState.set('idle');\n return;\n }\n this.lastSpoken.set(trimmed);\n this.appendTurn('assistant', trimmed);\n this.uiState.set('speaking');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.speaking'));\n this.stopPlayback();\n try {\n const tts = await this.transport.synthesize(trimmed);\n if (tts.objectUrl) {\n this.currentObjectUrl = tts.objectUrl;\n const played = await this.playObjectUrl(tts.objectUrl);\n if (played) {\n await this.finishSpeaking();\n return;\n }\n }\n } catch {\n // Fall through to browser speech when server TTS is unavailable.\n }\n await speakWithBrowserSpeechSynthesis(trimmed);\n await this.finishSpeaking();\n }\n\n private async finishSpeaking(): Promise<void> {\n if (this.mode() === 'confirm') {\n this.uiState.set('confirm');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.confirm'));\n return;\n }\n this.uiState.set('idle');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.idle'));\n }\n\n private playObjectUrl(url: string): Promise<boolean> {\n return new Promise((resolve) => {\n const audio = new Audio(url);\n this.currentAudio = audio;\n const finish = (ok: boolean): void => {\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n resolve(ok);\n };\n const onEnded = (): void => finish(true);\n const onError = (): void => finish(false);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n void audio.play().catch(() => finish(false));\n });\n }\n\n private async setError(key: string, detail?: string): Promise<void> {\n const messageKey = detail?.startsWith('@') ? detail : key;\n this.errorMessage.set(await this.translation.translateAsync(messageKey));\n this.uiState.set('error');\n this.statusText.set(await this.translation.translateAsync('@extensions-ai-voice-shell:states.error'));\n }\n\n private appendTurn(role: 'user' | 'assistant', text: string): void {\n this.turns.update((current) => [...current, { role, text }]);\n }\n\n private resetSession(): void {\n this.activeCapability = null;\n this.activeSessionId = null;\n this.pendingSpokenConfirm = null;\n this.confirmRequest.set(null);\n this.interviewProgress.set(null);\n this.mode.set('command');\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 { 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, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n inject,\n} from '@angular/core';\nimport {\n cancelBrowserSpeechSynthesis,\n primeBrowserSpeechSynthesis,\n} from '../browser-speech-synthesis.util';\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 private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State -----\n\n private mediaRecorder?: MediaRecorder;\n private audioChunks: Blob[] = [];\n private activeStream?: MediaStream;\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 canListen = computed(() => {\n const state = this.shell.uiState();\n return state === 'idle' || state === 'error' || state === 'confirm';\n });\n readonly isListening = computed(() => this.shell.uiState() === 'listening');\n readonly isSpeaking = computed(() => this.shell.uiState() === 'speaking');\n readonly showConfirm = computed(() => this.shell.uiState() === 'confirm' && this.shell.confirmRequest() != null);\n readonly progressLabel = computed(() => {\n const progress = this.shell.interviewProgress();\n if (!progress || progress.totalVisible <= 0) {\n return '';\n }\n return `${progress.answered}/${progress.totalVisible}`;\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n this.destroyRef.onDestroy(() => {\n this.stopTracks();\n cancelBrowserSpeechSynthesis();\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n async onMicClick(): Promise<void> {\n if (isPlatformBrowser(this.platformId)) {\n primeBrowserSpeechSynthesis();\n }\n if (this.isListening()) {\n await this.stopAndSubmit();\n return;\n }\n if (!this.canListen()) {\n return;\n }\n await this.startRecording();\n }\n\n async onCancelListen(): Promise<void> {\n this.stopTracks();\n this.audioChunks = [];\n await this.shell.cancelListening();\n }\n\n async onConfirmYes(): Promise<void> {\n await this.shell.confirmYes();\n }\n\n async onConfirmNo(): Promise<void> {\n await this.shell.confirmNo();\n }\n\n async onSaveDraft(): Promise<void> {\n await this.shell.saveInterviewDraft();\n }\n\n async onCancelInterview(): Promise<void> {\n await this.shell.cancelInterview();\n }\n\n //#endregion\n\n //#region ----- Recording -----\n\n private async startRecording(): Promise<void> {\n if (!isPlatformBrowser(this.platformId) || !navigator.mediaDevices?.getUserMedia) {\n await this.shell.reportError('@extensions-ai-voice-shell:errors.mic-unavailable');\n return;\n }\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.activeStream = stream;\n this.audioChunks = [];\n const recorder = new MediaRecorder(stream);\n this.mediaRecorder = recorder;\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n };\n recorder.start(250);\n await this.shell.enterListening();\n } catch {\n this.stopTracks();\n await this.shell.reportError('@extensions-ai-voice-shell:errors.mic-denied');\n }\n }\n\n private async stopAndSubmit(): Promise<void> {\n const recorder = this.mediaRecorder;\n if (!recorder || recorder.state !== 'recording') {\n this.stopTracks();\n await this.shell.cancelListening();\n return;\n }\n const blob = await new Promise<Blob | null>((resolve) => {\n recorder.onstop = () => {\n const mime = recorder.mimeType?.trim() || this.audioChunks[0]?.type?.trim() || 'audio/webm';\n const audioBlob = new Blob(this.audioChunks, { type: mime });\n resolve(audioBlob.size > 0 ? audioBlob : null);\n };\n recorder.requestData();\n recorder.stop();\n });\n this.stopTracks();\n if (!blob) {\n await this.shell.cancelListening();\n return;\n }\n await this.shell.submitRecording(blob);\n }\n\n private stopTracks(): void {\n if (this.mediaRecorder?.state === 'recording') {\n this.mediaRecorder.stop();\n }\n this.mediaRecorder = undefined;\n this.activeStream?.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\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)=\"onMicClick()\"\n [disabled]=\"!canListen() && !isListening()\"\n [attr.aria-label]=\"'@extensions-ai-voice-shell:actions.tap-to-talk' | translate | async\"\n >\n @if (isSpeaking()) {\n <!-- ----- AI is speaking ----- -->\n <i class=\"fa-regular fa-volume-high\"></i>\n }\n <!-- ----- Tap-to-talk / user speaking ----- -->\n @else {\n <i class=\"fa-regular fa-microphone\"></i>\n }\n </button>\n @if (isListening() || isSpeaking()) {\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 (progressLabel()) {\n <!-- ----- Interview progress counter ----- -->\n <p class=\"voice-void-progress\">{{ progressLabel() }}</p>\n }\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 @if (showConfirm()) {\n <!-- ----- Confirm chips for submit / destructive actions ----- -->\n <div class=\"voice-void-confirm\">\n <p class=\"voice-void-confirm-prompt\">{{ shell.confirmRequest()?.prompt }}</p>\n <div class=\"voice-void-confirm-actions\">\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.submit' | translate | async\"\n color=\"primary\"\n (onClick)=\"onConfirmYes()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.keep-editing' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onConfirmNo()\"\n ></ax-button>\n </div>\n </div>\n }\n\n <!-- ----- Secondary interview / listen actions ----- -->\n <div class=\"voice-void-toolbar\">\n @if (isListening()) {\n <!-- ----- Stop listening without sending ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-listen' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelListen()\"\n ></ax-button>\n }\n <!-- ----- Interview session actions ----- -->\n @if (shell.mode() === 'interview') {\n <!-- ----- Draft save and cancel while filling by voice ----- -->\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.save-draft' | translate | async\"\n [look]=\"'outline'\"\n (onClick)=\"onSaveDraft()\"\n ></ax-button>\n <ax-button\n [text]=\"'@extensions-ai-voice-shell:actions.cancel-interview' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"onCancelInterview()\"\n ></ax-button>\n }\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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"}
|