@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.4.0 → 0.4.2

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.
Files changed (146) hide show
  1. package/dist/context/ChatBotContext.d.ts.map +1 -1
  2. package/dist/context/ChatBotContext.js +84 -405
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/permissionState.d.ts +53 -0
  7. package/dist/permissionState.d.ts.map +1 -0
  8. package/dist/permissionState.js +217 -0
  9. package/dist/types/ChatBotTypes.d.ts +0 -5
  10. package/dist/types/ChatBotTypes.d.ts.map +1 -1
  11. package/dist/ui/ChatBotHeader.d.ts.map +1 -1
  12. package/dist/ui/ChatBotHeader.js +6 -2
  13. package/dist/ui/ChatBotUI.d.ts.map +1 -1
  14. package/dist/ui/ChatBotUI.js +13 -4
  15. package/dist/ui/MessageList.d.ts.map +1 -1
  16. package/dist/ui/MessageList.js +11 -6
  17. package/dist/ui/PermissionForm.d.ts.map +1 -1
  18. package/dist/ui/PermissionForm.js +6 -9
  19. package/dist/ui/styles/isolatedStyles.d.ts.map +1 -1
  20. package/dist/ui/styles/isolatedStyles.js +1 -0
  21. package/package.json +3 -3
  22. package/src/context/ChatBotContext.tsx +92 -437
  23. package/src/index.ts +5 -0
  24. package/src/types/ChatBotTypes.ts +2 -6
  25. package/src/ui/ChatBotHeader.tsx +9 -3
  26. package/src/ui/ChatBotUI.tsx +14 -5
  27. package/src/ui/MessageList.tsx +6 -0
  28. package/src/ui/PermissionForm.tsx +7 -12
  29. package/src/ui/styles/isolatedStyles.ts +1 -0
  30. package/dist/NxtlinqAgentChat.d.ts +0 -26
  31. package/dist/NxtlinqAgentChat.d.ts.map +0 -1
  32. package/dist/NxtlinqAgentChat.js +0 -28
  33. package/dist/components/AgentAssistantShell.d.ts +0 -5
  34. package/dist/components/AgentAssistantShell.d.ts.map +0 -1
  35. package/dist/components/AgentAssistantShell.js +0 -52
  36. package/dist/components/AgentComposer.d.ts +0 -3
  37. package/dist/components/AgentComposer.d.ts.map +0 -1
  38. package/dist/components/AgentComposer.js +0 -60
  39. package/dist/components/AgentMessageList.d.ts +0 -3
  40. package/dist/components/AgentMessageList.d.ts.map +0 -1
  41. package/dist/components/AgentMessageList.js +0 -37
  42. package/dist/components/AgentRemoteAudio.d.ts +0 -4
  43. package/dist/components/AgentRemoteAudio.d.ts.map +0 -1
  44. package/dist/components/AgentRemoteAudio.js +0 -34
  45. package/dist/components/AgentVoiceBar.d.ts +0 -3
  46. package/dist/components/AgentVoiceBar.d.ts.map +0 -1
  47. package/dist/components/AgentVoiceBar.js +0 -91
  48. package/dist/components/PresetMessageChips.d.ts +0 -3
  49. package/dist/components/PresetMessageChips.d.ts.map +0 -1
  50. package/dist/components/PresetMessageChips.js +0 -23
  51. package/dist/context/AgentAssistantContext.d.ts +0 -32
  52. package/dist/context/AgentAssistantContext.d.ts.map +0 -1
  53. package/dist/context/AgentAssistantContext.js +0 -179
  54. package/dist/legacy/assets/images/adiSideItalicDataUri.d.ts +0 -2
  55. package/dist/legacy/assets/images/adiSideItalicDataUri.d.ts.map +0 -1
  56. package/dist/legacy/assets/images/adiSideItalicDataUri.js +0 -1
  57. package/dist/legacy/chatbot/ChatBot.d.ts +0 -5
  58. package/dist/legacy/chatbot/ChatBot.d.ts.map +0 -1
  59. package/dist/legacy/chatbot/ChatBot.js +0 -35
  60. package/dist/legacy/chatbot/context/ChatBotContext.d.ts +0 -5
  61. package/dist/legacy/chatbot/context/ChatBotContext.d.ts.map +0 -1
  62. package/dist/legacy/chatbot/context/ChatBotContext.js +0 -2922
  63. package/dist/legacy/chatbot/types/ChatBotTypes.d.ts +0 -166
  64. package/dist/legacy/chatbot/types/ChatBotTypes.d.ts.map +0 -1
  65. package/dist/legacy/chatbot/types/ChatBotTypes.js +0 -1
  66. package/dist/legacy/chatbot/ui/BerifyMeModal.d.ts +0 -17
  67. package/dist/legacy/chatbot/ui/BerifyMeModal.d.ts.map +0 -1
  68. package/dist/legacy/chatbot/ui/BerifyMeModal.js +0 -110
  69. package/dist/legacy/chatbot/ui/ChatBotHeader.d.ts +0 -15
  70. package/dist/legacy/chatbot/ui/ChatBotHeader.d.ts.map +0 -1
  71. package/dist/legacy/chatbot/ui/ChatBotHeader.js +0 -62
  72. package/dist/legacy/chatbot/ui/ChatBotUI.d.ts +0 -3
  73. package/dist/legacy/chatbot/ui/ChatBotUI.d.ts.map +0 -1
  74. package/dist/legacy/chatbot/ui/ChatBotUI.js +0 -557
  75. package/dist/legacy/chatbot/ui/MessageInput.d.ts +0 -3
  76. package/dist/legacy/chatbot/ui/MessageInput.d.ts.map +0 -1
  77. package/dist/legacy/chatbot/ui/MessageInput.js +0 -321
  78. package/dist/legacy/chatbot/ui/MessageList.d.ts +0 -4
  79. package/dist/legacy/chatbot/ui/MessageList.d.ts.map +0 -1
  80. package/dist/legacy/chatbot/ui/MessageList.js +0 -455
  81. package/dist/legacy/chatbot/ui/ModelSelector.d.ts +0 -4
  82. package/dist/legacy/chatbot/ui/ModelSelector.d.ts.map +0 -1
  83. package/dist/legacy/chatbot/ui/ModelSelector.js +0 -122
  84. package/dist/legacy/chatbot/ui/NotificationModal.d.ts +0 -15
  85. package/dist/legacy/chatbot/ui/NotificationModal.d.ts.map +0 -1
  86. package/dist/legacy/chatbot/ui/NotificationModal.js +0 -53
  87. package/dist/legacy/chatbot/ui/PermissionForm.d.ts +0 -8
  88. package/dist/legacy/chatbot/ui/PermissionForm.d.ts.map +0 -1
  89. package/dist/legacy/chatbot/ui/PermissionForm.js +0 -465
  90. package/dist/legacy/chatbot/ui/PresetMessages.d.ts +0 -4
  91. package/dist/legacy/chatbot/ui/PresetMessages.d.ts.map +0 -1
  92. package/dist/legacy/chatbot/ui/PresetMessages.js +0 -33
  93. package/dist/legacy/chatbot/ui/VoiceModePanel.d.ts +0 -3
  94. package/dist/legacy/chatbot/ui/VoiceModePanel.d.ts.map +0 -1
  95. package/dist/legacy/chatbot/ui/VoiceModePanel.js +0 -95
  96. package/dist/legacy/chatbot/ui/chatBotHeaderParts.d.ts +0 -15
  97. package/dist/legacy/chatbot/ui/chatBotHeaderParts.d.ts.map +0 -1
  98. package/dist/legacy/chatbot/ui/chatBotHeaderParts.js +0 -50
  99. package/dist/legacy/chatbot/ui/styles/isolatedStyles.d.ts +0 -73
  100. package/dist/legacy/chatbot/ui/styles/isolatedStyles.d.ts.map +0 -1
  101. package/dist/legacy/chatbot/ui/styles/isolatedStyles.js +0 -985
  102. package/dist/legacy/index.d.ts +0 -14
  103. package/dist/legacy/index.d.ts.map +0 -1
  104. package/dist/legacy/index.js +0 -12
  105. package/dist/theme/defaultTheme.d.ts +0 -3
  106. package/dist/theme/defaultTheme.d.ts.map +0 -1
  107. package/dist/theme/defaultTheme.js +0 -20
  108. package/dist/types.d.ts +0 -62
  109. package/dist/types.d.ts.map +0 -1
  110. package/dist/types.js +0 -1
  111. package/dist/voice/useVoiceConnectOrchestration.d.ts +0 -21
  112. package/dist/voice/useVoiceConnectOrchestration.d.ts.map +0 -1
  113. package/dist/voice/useVoiceConnectOrchestration.js +0 -86
  114. package/dist/voice/useVoiceMicState.d.ts +0 -15
  115. package/dist/voice/useVoiceMicState.d.ts.map +0 -1
  116. package/dist/voice/useVoiceMicState.js +0 -94
  117. package/dist/voice/useVoiceSilenceCommit.d.ts +0 -10
  118. package/dist/voice/useVoiceSilenceCommit.d.ts.map +0 -1
  119. package/dist/voice/useVoiceSilenceCommit.js +0 -67
  120. package/dist/voice/useVoiceTranscriptMessages.d.ts +0 -18
  121. package/dist/voice/useVoiceTranscriptMessages.d.ts.map +0 -1
  122. package/dist/voice/useVoiceTranscriptMessages.js +0 -132
  123. package/dist/voice/useWsRealtimeAudio.d.ts +0 -18
  124. package/dist/voice/useWsRealtimeAudio.d.ts.map +0 -1
  125. package/dist/voice/useWsRealtimeAudio.js +0 -102
  126. package/dist/voice/voiceMicConstants.d.ts +0 -4
  127. package/dist/voice/voiceMicConstants.d.ts.map +0 -1
  128. package/dist/voice/voiceMicConstants.js +0 -10
  129. package/dist/voice/voiceUserBubble.d.ts +0 -10
  130. package/dist/voice/voiceUserBubble.d.ts.map +0 -1
  131. package/dist/voice/voiceUserBubble.js +0 -52
  132. package/dist/voice/ws/BrowserWsPcmPlayer.d.ts +0 -23
  133. package/dist/voice/ws/BrowserWsPcmPlayer.d.ts.map +0 -1
  134. package/dist/voice/ws/BrowserWsPcmPlayer.js +0 -137
  135. package/dist/voice/ws/BrowserWsPcmRecorder.d.ts +0 -17
  136. package/dist/voice/ws/BrowserWsPcmRecorder.d.ts.map +0 -1
  137. package/dist/voice/ws/BrowserWsPcmRecorder.js +0 -71
  138. package/dist/voice/ws/float32ToPcm16.d.ts +0 -2
  139. package/dist/voice/ws/float32ToPcm16.d.ts.map +0 -1
  140. package/dist/voice/ws/float32ToPcm16.js +0 -8
  141. package/dist/voice/ws/voiceSilenceConstants.d.ts +0 -5
  142. package/dist/voice/ws/voiceSilenceConstants.d.ts.map +0 -1
  143. package/dist/voice/ws/voiceSilenceConstants.js +0 -4
  144. package/dist/voice/ws/wsRealtimeConstants.d.ts +0 -2
  145. package/dist/voice/ws/wsRealtimeConstants.d.ts.map +0 -1
  146. package/dist/voice/ws/wsRealtimeConstants.js +0 -1
@@ -1,32 +0,0 @@
1
- import type { VoiceStatus } from '@bytexbyte/nxtlinq-ai-agent-core-development';
2
- import { type UseNxtlinqAgentResult, type UseNxtlinqVoiceResult } from '@bytexbyte/nxtlinq-ai-agent-web-development';
3
- import React, { type ReactNode } from 'react';
4
- import type { AgentAssistantTheme, NxtlinqAgentChatProps, PresetMessage } from '../types';
5
- export type InteractionMode = 'text' | 'voice';
6
- export type AgentAssistantContextValue = UseNxtlinqAgentResult & UseNxtlinqVoiceResult & {
7
- theme: AgentAssistantTheme;
8
- title: string;
9
- placeholder: string;
10
- presetMessages: PresetMessage[];
11
- interactionMode: InteractionMode;
12
- setInteractionMode: (mode: InteractionMode) => void;
13
- inputText: string;
14
- setInputText: (text: string) => void;
15
- isVoiceAvailable: boolean;
16
- isVoiceConnecting: boolean;
17
- isMicMuted: boolean;
18
- isMicHeldForAssistant: boolean;
19
- toggleVoiceMicMute: () => void;
20
- isVoiceChannelReady: boolean;
21
- enableFileUpload: boolean;
22
- sendText: () => Promise<void>;
23
- selectPreset: (preset: PresetMessage) => Promise<void>;
24
- };
25
- export type AgentAssistantProviderProps = {
26
- children: ReactNode;
27
- ui: Pick<NxtlinqAgentChatProps, 'title' | 'placeholder' | 'presetMessages' | 'enableVoice' | 'enableFileUpload' | 'theme' | 'startWithMicMuted' | 'holdMicDuringAssistant'>;
28
- };
29
- export declare function AgentAssistantProvider({ children, ui, }: AgentAssistantProviderProps): React.ReactElement;
30
- export declare function useAgentAssistant(): AgentAssistantContextValue;
31
- export declare function voiceStatusLabel(status: VoiceStatus): string;
32
- //# sourceMappingURL=AgentAssistantContext.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentAssistantContext.d.ts","sourceRoot":"","sources":["../../src/context/AgentAssistantContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK1F,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/C,MAAM,MAAM,0BAA0B,GAAG,qBAAqB,GAC5D,qBAAqB,GAAG;IACxB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD,CAAC;AAIF,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,EAAE,EAAE,IAAI,CACN,qBAAqB,EACnB,OAAO,GACP,aAAa,GACb,gBAAgB,GAChB,aAAa,GACb,kBAAkB,GAClB,OAAO,GACP,mBAAmB,GACnB,wBAAwB,CAC3B,CAAC;CACH,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,EAAE,GACH,EAAE,2BAA2B,GAAG,KAAK,CAAC,YAAY,CA8MlD;AAED,wBAAgB,iBAAiB,IAAI,0BAA0B,CAQ9D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAU5D"}
@@ -1,179 +0,0 @@
1
- import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
- import { useNxtlinqAgent, useNxtlinqVoice, } from '@bytexbyte/nxtlinq-ai-agent-web-development';
3
- import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
4
- import { defaultAgentAssistantTheme } from '../theme/defaultTheme';
5
- import { useVoiceConnectOrchestration } from '../voice/useVoiceConnectOrchestration';
6
- import { useVoiceMicState } from '../voice/useVoiceMicState';
7
- import { useVoiceTranscriptMessages } from '../voice/useVoiceTranscriptMessages';
8
- const AgentAssistantContext = createContext(null);
9
- export function AgentAssistantProvider({ children, ui, }) {
10
- const agent = useNxtlinqAgent();
11
- const voice = useNxtlinqVoice();
12
- const [interactionMode, setInteractionModeState] = useState('text');
13
- const [inputText, setInputText] = useState('');
14
- const [isVoiceConnecting, setIsVoiceConnecting] = useState(false);
15
- const isVoiceAvailable = ui.enableVoice !== false;
16
- const micStartsMuted = ui.startWithMicMuted ?? true;
17
- const handleVoiceBargeIn = useCallback(() => {
18
- voice.interrupt();
19
- }, [voice]);
20
- const { isMicMuted, isMicHeldForAssistant, toggleVoiceMicMute, prepareForVoiceConnect, resetMicState, clearAssistantMicHold, } = useVoiceMicState(voice, isVoiceConnecting, {
21
- startWithMicMuted: micStartsMuted,
22
- holdMicDuringAssistant: ui.holdMicDuringAssistant ?? true,
23
- onBargeIn: handleVoiceBargeIn,
24
- });
25
- const voiceTranscriptApi = useMemo(() => ({
26
- getMessages: () => agent.agent.getSnapshot().messages,
27
- updateMessages: (updater) => {
28
- agent.setMessages(updater(agent.agent.getSnapshot().messages));
29
- },
30
- syncVoiceTurnHistory: agent.syncVoiceTurnHistory,
31
- }), [agent.agent, agent.setMessages, agent.syncVoiceTurnHistory]);
32
- const { handleTranscript, handleDone, clearVoiceStream } = useVoiceTranscriptMessages(voiceTranscriptApi, interactionMode, voice.voiceSessionId);
33
- const setInteractionMode = useCallback((mode) => {
34
- if (mode === 'text' && interactionMode === 'voice') {
35
- void voice.stopVoice('switch_to_text').then(() => {
36
- clearVoiceStream();
37
- resetMicState();
38
- });
39
- }
40
- setInteractionModeState(mode);
41
- }, [interactionMode, voice, resetMicState, clearVoiceStream]);
42
- useEffect(() => {
43
- if (interactionMode === 'text' && voice.voiceSessionId != null) {
44
- void voice.stopVoice('mode_text_cleanup').then(() => {
45
- clearVoiceStream();
46
- resetMicState();
47
- });
48
- }
49
- }, [interactionMode, voice.voiceSessionId, voice, resetMicState, clearVoiceStream]);
50
- const orchestrationCallbacks = useMemo(() => ({
51
- handleTranscript,
52
- handleDone,
53
- clearVoiceStream,
54
- prepareForVoiceConnect,
55
- resetMicState,
56
- clearAssistantMicHold,
57
- setInteractionMode,
58
- setIsVoiceConnecting,
59
- }), [
60
- handleTranscript,
61
- handleDone,
62
- clearVoiceStream,
63
- prepareForVoiceConnect,
64
- resetMicState,
65
- clearAssistantMicHold,
66
- setInteractionMode,
67
- ]);
68
- const { wrappedStartVoice, wrappedStopVoice, wrappedInterrupt, isVoiceChannelReady, } = useVoiceConnectOrchestration(agent, voice, interactionMode, micStartsMuted, orchestrationCallbacks);
69
- // iOS 切換 App 或相機後返回時,若 WebRTC App Channel 已斷開則自動停止語音 session,
70
- // 避免麥克風圖示顯示活躍但狀態卡在 Idle 的問題。
71
- useEffect(() => {
72
- if (typeof document === 'undefined')
73
- return;
74
- const handleVisibilityChange = () => {
75
- if (document.visibilityState !== 'visible')
76
- return;
77
- if (voice.voiceSessionId == null)
78
- return;
79
- const session = agent.agent.getVoiceSession();
80
- if (!session?.isAppChannelOpen()) {
81
- void wrappedStopVoice();
82
- }
83
- };
84
- document.addEventListener('visibilitychange', handleVisibilityChange);
85
- return () => document.removeEventListener('visibilitychange', handleVisibilityChange);
86
- }, [voice.voiceSessionId, agent.agent, wrappedStopVoice]);
87
- const theme = useMemo(() => ({
88
- ...defaultAgentAssistantTheme,
89
- ...ui.theme,
90
- colors: { ...defaultAgentAssistantTheme.colors, ...ui.theme?.colors },
91
- spacing: { ...defaultAgentAssistantTheme.spacing, ...ui.theme?.spacing },
92
- radius: { ...defaultAgentAssistantTheme.radius, ...ui.theme?.radius },
93
- typography: {
94
- ...defaultAgentAssistantTheme.typography,
95
- ...ui.theme?.typography,
96
- },
97
- }), [ui.theme]);
98
- const sendText = useCallback(async () => {
99
- const text = inputText.trim();
100
- if (!text || agent.isLoading)
101
- return;
102
- setInputText('');
103
- await agent.sendMessage(text);
104
- }, [agent, inputText]);
105
- const selectPreset = useCallback(async (preset) => {
106
- if (preset.autoSend) {
107
- await agent.sendMessage(preset.text);
108
- }
109
- else {
110
- setInputText(preset.text);
111
- }
112
- }, [agent]);
113
- const value = useMemo(() => ({
114
- ...agent,
115
- ...voice,
116
- startVoice: wrappedStartVoice,
117
- stopVoice: wrappedStopVoice,
118
- interrupt: wrappedInterrupt,
119
- theme,
120
- title: ui.title ?? 'AI Assistant',
121
- placeholder: ui.placeholder ?? 'Type a message…',
122
- presetMessages: ui.presetMessages ?? [],
123
- interactionMode,
124
- setInteractionMode,
125
- inputText,
126
- setInputText,
127
- isVoiceAvailable,
128
- isVoiceConnecting,
129
- isMicMuted,
130
- isMicHeldForAssistant,
131
- toggleVoiceMicMute,
132
- isVoiceChannelReady,
133
- enableFileUpload: ui.enableFileUpload !== false,
134
- sendText,
135
- selectPreset,
136
- }), [
137
- agent,
138
- voice,
139
- wrappedStartVoice,
140
- wrappedStopVoice,
141
- wrappedInterrupt,
142
- theme,
143
- ui.title,
144
- ui.placeholder,
145
- ui.presetMessages,
146
- ui.enableFileUpload,
147
- interactionMode,
148
- setInteractionMode,
149
- inputText,
150
- isVoiceAvailable,
151
- isVoiceConnecting,
152
- isMicMuted,
153
- isMicHeldForAssistant,
154
- toggleVoiceMicMute,
155
- isVoiceChannelReady,
156
- sendText,
157
- selectPreset,
158
- voice.voiceStatus,
159
- ]);
160
- return (_jsx(AgentAssistantContext.Provider, { value: value, children: children }));
161
- }
162
- export function useAgentAssistant() {
163
- const ctx = useContext(AgentAssistantContext);
164
- if (!ctx) {
165
- throw new Error('useAgentAssistant must be used within <NxtlinqAgentChat> or <AgentAssistantProvider>');
166
- }
167
- return ctx;
168
- }
169
- export function voiceStatusLabel(status) {
170
- const labels = {
171
- idle: 'Ready',
172
- listening: 'Listening',
173
- transcribing: 'Transcribing',
174
- thinking: 'Thinking',
175
- generating: 'Generating',
176
- speaking: 'Speaking',
177
- };
178
- return labels[status] ?? status;
179
- }