@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.4.0 → 0.4.1
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.
- package/dist/context/ChatBotContext.d.ts.map +1 -1
- package/dist/context/ChatBotContext.js +9 -3
- package/dist/types/ChatBotTypes.d.ts +0 -5
- package/dist/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/ui/ChatBotHeader.d.ts.map +1 -1
- package/dist/ui/ChatBotHeader.js +6 -2
- package/dist/ui/ChatBotUI.d.ts.map +1 -1
- package/dist/ui/ChatBotUI.js +8 -1
- package/dist/ui/styles/isolatedStyles.d.ts.map +1 -1
- package/dist/ui/styles/isolatedStyles.js +1 -0
- package/package.json +2 -2
- package/src/context/ChatBotContext.tsx +9 -2
- package/src/types/ChatBotTypes.ts +2 -6
- package/src/ui/ChatBotHeader.tsx +9 -3
- package/src/ui/ChatBotUI.tsx +8 -1
- package/src/ui/styles/isolatedStyles.ts +1 -0
- package/dist/NxtlinqAgentChat.d.ts +0 -26
- package/dist/NxtlinqAgentChat.d.ts.map +0 -1
- package/dist/NxtlinqAgentChat.js +0 -28
- package/dist/components/AgentAssistantShell.d.ts +0 -5
- package/dist/components/AgentAssistantShell.d.ts.map +0 -1
- package/dist/components/AgentAssistantShell.js +0 -52
- package/dist/components/AgentComposer.d.ts +0 -3
- package/dist/components/AgentComposer.d.ts.map +0 -1
- package/dist/components/AgentComposer.js +0 -60
- package/dist/components/AgentMessageList.d.ts +0 -3
- package/dist/components/AgentMessageList.d.ts.map +0 -1
- package/dist/components/AgentMessageList.js +0 -37
- package/dist/components/AgentRemoteAudio.d.ts +0 -4
- package/dist/components/AgentRemoteAudio.d.ts.map +0 -1
- package/dist/components/AgentRemoteAudio.js +0 -34
- package/dist/components/AgentVoiceBar.d.ts +0 -3
- package/dist/components/AgentVoiceBar.d.ts.map +0 -1
- package/dist/components/AgentVoiceBar.js +0 -91
- package/dist/components/PresetMessageChips.d.ts +0 -3
- package/dist/components/PresetMessageChips.d.ts.map +0 -1
- package/dist/components/PresetMessageChips.js +0 -23
- package/dist/context/AgentAssistantContext.d.ts +0 -32
- package/dist/context/AgentAssistantContext.d.ts.map +0 -1
- package/dist/context/AgentAssistantContext.js +0 -179
- package/dist/legacy/assets/images/adiSideItalicDataUri.d.ts +0 -2
- package/dist/legacy/assets/images/adiSideItalicDataUri.d.ts.map +0 -1
- package/dist/legacy/assets/images/adiSideItalicDataUri.js +0 -1
- package/dist/legacy/chatbot/ChatBot.d.ts +0 -5
- package/dist/legacy/chatbot/ChatBot.d.ts.map +0 -1
- package/dist/legacy/chatbot/ChatBot.js +0 -35
- package/dist/legacy/chatbot/context/ChatBotContext.d.ts +0 -5
- package/dist/legacy/chatbot/context/ChatBotContext.d.ts.map +0 -1
- package/dist/legacy/chatbot/context/ChatBotContext.js +0 -2922
- package/dist/legacy/chatbot/types/ChatBotTypes.d.ts +0 -166
- package/dist/legacy/chatbot/types/ChatBotTypes.d.ts.map +0 -1
- package/dist/legacy/chatbot/types/ChatBotTypes.js +0 -1
- package/dist/legacy/chatbot/ui/BerifyMeModal.d.ts +0 -17
- package/dist/legacy/chatbot/ui/BerifyMeModal.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/BerifyMeModal.js +0 -110
- package/dist/legacy/chatbot/ui/ChatBotHeader.d.ts +0 -15
- package/dist/legacy/chatbot/ui/ChatBotHeader.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/ChatBotHeader.js +0 -62
- package/dist/legacy/chatbot/ui/ChatBotUI.d.ts +0 -3
- package/dist/legacy/chatbot/ui/ChatBotUI.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/ChatBotUI.js +0 -557
- package/dist/legacy/chatbot/ui/MessageInput.d.ts +0 -3
- package/dist/legacy/chatbot/ui/MessageInput.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/MessageInput.js +0 -321
- package/dist/legacy/chatbot/ui/MessageList.d.ts +0 -4
- package/dist/legacy/chatbot/ui/MessageList.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/MessageList.js +0 -455
- package/dist/legacy/chatbot/ui/ModelSelector.d.ts +0 -4
- package/dist/legacy/chatbot/ui/ModelSelector.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/ModelSelector.js +0 -122
- package/dist/legacy/chatbot/ui/NotificationModal.d.ts +0 -15
- package/dist/legacy/chatbot/ui/NotificationModal.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/NotificationModal.js +0 -53
- package/dist/legacy/chatbot/ui/PermissionForm.d.ts +0 -8
- package/dist/legacy/chatbot/ui/PermissionForm.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/PermissionForm.js +0 -465
- package/dist/legacy/chatbot/ui/PresetMessages.d.ts +0 -4
- package/dist/legacy/chatbot/ui/PresetMessages.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/PresetMessages.js +0 -33
- package/dist/legacy/chatbot/ui/VoiceModePanel.d.ts +0 -3
- package/dist/legacy/chatbot/ui/VoiceModePanel.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/VoiceModePanel.js +0 -95
- package/dist/legacy/chatbot/ui/chatBotHeaderParts.d.ts +0 -15
- package/dist/legacy/chatbot/ui/chatBotHeaderParts.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/chatBotHeaderParts.js +0 -50
- package/dist/legacy/chatbot/ui/styles/isolatedStyles.d.ts +0 -73
- package/dist/legacy/chatbot/ui/styles/isolatedStyles.d.ts.map +0 -1
- package/dist/legacy/chatbot/ui/styles/isolatedStyles.js +0 -985
- package/dist/legacy/index.d.ts +0 -14
- package/dist/legacy/index.d.ts.map +0 -1
- package/dist/legacy/index.js +0 -12
- package/dist/theme/defaultTheme.d.ts +0 -3
- package/dist/theme/defaultTheme.d.ts.map +0 -1
- package/dist/theme/defaultTheme.js +0 -20
- package/dist/types.d.ts +0 -62
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/voice/useVoiceConnectOrchestration.d.ts +0 -21
- package/dist/voice/useVoiceConnectOrchestration.d.ts.map +0 -1
- package/dist/voice/useVoiceConnectOrchestration.js +0 -86
- package/dist/voice/useVoiceMicState.d.ts +0 -15
- package/dist/voice/useVoiceMicState.d.ts.map +0 -1
- package/dist/voice/useVoiceMicState.js +0 -94
- package/dist/voice/useVoiceSilenceCommit.d.ts +0 -10
- package/dist/voice/useVoiceSilenceCommit.d.ts.map +0 -1
- package/dist/voice/useVoiceSilenceCommit.js +0 -67
- package/dist/voice/useVoiceTranscriptMessages.d.ts +0 -18
- package/dist/voice/useVoiceTranscriptMessages.d.ts.map +0 -1
- package/dist/voice/useVoiceTranscriptMessages.js +0 -132
- package/dist/voice/useWsRealtimeAudio.d.ts +0 -18
- package/dist/voice/useWsRealtimeAudio.d.ts.map +0 -1
- package/dist/voice/useWsRealtimeAudio.js +0 -102
- package/dist/voice/voiceMicConstants.d.ts +0 -4
- package/dist/voice/voiceMicConstants.d.ts.map +0 -1
- package/dist/voice/voiceMicConstants.js +0 -10
- package/dist/voice/voiceUserBubble.d.ts +0 -10
- package/dist/voice/voiceUserBubble.d.ts.map +0 -1
- package/dist/voice/voiceUserBubble.js +0 -52
- package/dist/voice/ws/BrowserWsPcmPlayer.d.ts +0 -23
- package/dist/voice/ws/BrowserWsPcmPlayer.d.ts.map +0 -1
- package/dist/voice/ws/BrowserWsPcmPlayer.js +0 -137
- package/dist/voice/ws/BrowserWsPcmRecorder.d.ts +0 -17
- package/dist/voice/ws/BrowserWsPcmRecorder.d.ts.map +0 -1
- package/dist/voice/ws/BrowserWsPcmRecorder.js +0 -71
- package/dist/voice/ws/float32ToPcm16.d.ts +0 -2
- package/dist/voice/ws/float32ToPcm16.d.ts.map +0 -1
- package/dist/voice/ws/float32ToPcm16.js +0 -8
- package/dist/voice/ws/voiceSilenceConstants.d.ts +0 -5
- package/dist/voice/ws/voiceSilenceConstants.d.ts.map +0 -1
- package/dist/voice/ws/voiceSilenceConstants.js +0 -4
- package/dist/voice/ws/wsRealtimeConstants.d.ts +0 -2
- package/dist/voice/ws/wsRealtimeConstants.d.ts.map +0 -1
- package/dist/voice/ws/wsRealtimeConstants.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatBotContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyB/B,OAAO,EAEL,kBAAkB,EAClB,YAAY,EAEb,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,UAAU,0BAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"ChatBotContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatBotContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyB/B,OAAO,EAEL,kBAAkB,EAClB,YAAY,EAEb,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,UAAU,0BAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA+vGlD,CAAC"}
|
|
@@ -30,9 +30,7 @@ idvBannerDismissSeconds = 86400,
|
|
|
30
30
|
// 24 hours in seconds
|
|
31
31
|
isStopRecordingOnSend = false,
|
|
32
32
|
// Custom error message to display in chat
|
|
33
|
-
customError,
|
|
34
|
-
// PII display mode
|
|
35
|
-
piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, sttGlossary, }) => {
|
|
33
|
+
customError, voiceThresholds, debugVoiceRms = false, sttGlossary, }) => {
|
|
36
34
|
// Set API hosts immediately based on environment (before any API calls)
|
|
37
35
|
setApiHosts(environment);
|
|
38
36
|
const nxtlinqApi = React.useMemo(() => (serviceToken || getAuthToken
|
|
@@ -769,6 +767,11 @@ piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, sttGlossary
|
|
|
769
767
|
// AI Model related state
|
|
770
768
|
const [modelsFromApi, setModelsFromApi] = React.useState([]);
|
|
771
769
|
const [selectedModelIndex, setSelectedModelIndex] = useLocalStorage('selectedAIModelIndex', 0);
|
|
770
|
+
// PII protection status: fetched from the service's own config (via serviceId + credentials
|
|
771
|
+
// already provided to the SDK), not passed in by the host app. Defaults to off until the fetch
|
|
772
|
+
// below resolves, matching how modelsFromApi starts empty.
|
|
773
|
+
const [enablePiiProtection, setEnablePiiProtection] = React.useState(false);
|
|
774
|
+
const piiDisplayMode = enablePiiProtection ? 'redacted' : 'plain';
|
|
772
775
|
// Use models from API only (no default fallback)
|
|
773
776
|
// This ensures SDK always uses Dashboard-configured models
|
|
774
777
|
const effectiveAvailableModels = React.useMemo(() => {
|
|
@@ -787,6 +790,9 @@ piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, sttGlossary
|
|
|
787
790
|
if ('availableModels' in result && Array.isArray(result.availableModels)) {
|
|
788
791
|
setModelsFromApi(result.availableModels);
|
|
789
792
|
}
|
|
793
|
+
if ('enablePiiProtection' in result) {
|
|
794
|
+
setEnablePiiProtection(!!result.enablePiiProtection);
|
|
795
|
+
}
|
|
790
796
|
}
|
|
791
797
|
catch (error) {
|
|
792
798
|
console.error('Failed to fetch available models from API:', error);
|
|
@@ -64,11 +64,6 @@ export interface ChatBotProps {
|
|
|
64
64
|
berifymeMode?: 'built-in' | 'external';
|
|
65
65
|
isStopRecordingOnSend?: boolean;
|
|
66
66
|
customError?: string;
|
|
67
|
-
/** PII display mode: how PII protection is visualized in chat messages
|
|
68
|
-
* - 'plain': No visualization, messages look like normal chat
|
|
69
|
-
* - 'redacted': Anonymized text with PII tokens displayed (default)
|
|
70
|
-
*/
|
|
71
|
-
piiDisplayMode?: 'plain' | 'redacted';
|
|
72
67
|
/** Override mic VAD thresholds. Useful for tuning sensitivity per deployment. */
|
|
73
68
|
voiceThresholds?: {
|
|
74
69
|
speechRmsThreshold?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAErI,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,KAAK,IAAI,KACP,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,SAAS,CAAC,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC,WAAW,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAElD,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,eAAe,CAAC,EAAE;QAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sGAAsG;IACtG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;IAC1C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE;QACZ,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAChD,eAAe,EAAE,OAAO,CAAC;IAEzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,aAAa,EAAE,CAAC;IAG7B,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IAErC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IAGvB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,qBAAqB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,uBAAuB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC;IAE7C,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACvD,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAGnD,aAAa,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IACxF,YAAY,EAAE,CAAC,sBAAsB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,uBAAuB,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,sBAAsB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,MAAM,OAAO,CAAC;IAE/B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAG3B,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IAC3D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotHeader.d.ts","sourceRoot":"","sources":["../../src/ui/ChatBotHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACjE,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IACrC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"ChatBotHeader.d.ts","sourceRoot":"","sources":["../../src/ui/ChatBotHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACjE,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IACrC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA2HtD,CAAC"}
|
package/dist/ui/ChatBotHeader.js
CHANGED
|
@@ -49,14 +49,18 @@ export const ChatBotHeader = ({ mobileLayout, isDragging, onDragStart, isVoiceMo
|
|
|
49
49
|
z-index: 2 !important;
|
|
50
50
|
display: flex !important;
|
|
51
51
|
justify-content: space-between !important;
|
|
52
|
-
align-items:
|
|
52
|
+
align-items: flex-start !important;
|
|
53
53
|
width: 100% !important;
|
|
54
54
|
pointer-events: none !important;
|
|
55
55
|
`, children: [_jsxs("div", { css: css `
|
|
56
56
|
display: flex !important;
|
|
57
57
|
align-items: center !important;
|
|
58
|
+
flex-wrap: wrap !important;
|
|
59
|
+
row-gap: 8px !important;
|
|
58
60
|
gap: 10px !important;
|
|
59
61
|
min-width: 0 !important;
|
|
62
|
+
flex: 1 1 auto !important;
|
|
63
|
+
padding-top: 2px !important;
|
|
60
64
|
pointer-events: none !important;
|
|
61
|
-
`, children: [_jsx("h3", { css: headerTitle, children: "AI Agent" }), metaChips] }), actions] }))] }));
|
|
65
|
+
`, children: [_jsx("h3", { css: [headerTitle, css `flex-shrink: 0 !important;`], children: "AI Agent" }), metaChips] }), _jsx("div", { css: css `flex-shrink: 0 !important;`, children: actions })] }))] }));
|
|
62
66
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../src/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../src/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqG/B,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAitB7B,CAAC"}
|
package/dist/ui/ChatBotUI.js
CHANGED
|
@@ -14,6 +14,12 @@ import { chatWindow, errorToast, floatingButton, idvBanner, idvBannerText, idvBa
|
|
|
14
14
|
const MOBILE_BREAKPOINT = 768;
|
|
15
15
|
const MOBILE_EDGE_MARGIN = 12;
|
|
16
16
|
const MOBILE_FAB_POSITION = { right: MOBILE_EDGE_MARGIN, bottom: MOBILE_EDGE_MARGIN };
|
|
17
|
+
// Below this widget width, the desktop header's single-row layout (title + model/PII chips +
|
|
18
|
+
// voice/settings/close actions, all in one line) has no room left and the chips start
|
|
19
|
+
// overlapping the actions. The user can drag the window this narrow (MIN_WIDTH is 320px) even
|
|
20
|
+
// on a wide desktop viewport, so this must be driven by the widget's own width, not just
|
|
21
|
+
// window.innerWidth — falling back to the same stacked layout used on mobile viewports.
|
|
22
|
+
const HEADER_COMPACT_WIDTH = 420;
|
|
17
23
|
const isMobileViewport = () => typeof window !== 'undefined' && window.innerWidth <= MOBILE_BREAKPOINT;
|
|
18
24
|
// Toast Notification Component
|
|
19
25
|
const ToastNotification = ({ type, message, onClose, isChatOpen = false }) => {
|
|
@@ -59,6 +65,7 @@ export const ChatBotUI = () => {
|
|
|
59
65
|
const { dimensions, handleResizeStart, positionAdjustment } = useResizable(positionRef);
|
|
60
66
|
const { position, handleDragStart, isDragging, updatePosition } = useDraggable(dimensions);
|
|
61
67
|
const [mobileLayout, setMobileLayout] = React.useState(isMobileViewport);
|
|
68
|
+
const headerCompactLayout = mobileLayout || dimensions.width < HEADER_COMPACT_WIDTH;
|
|
62
69
|
React.useEffect(() => {
|
|
63
70
|
if (typeof window === 'undefined')
|
|
64
71
|
return;
|
|
@@ -523,7 +530,7 @@ export const ChatBotUI = () => {
|
|
|
523
530
|
left: ${MOBILE_EDGE_MARGIN}px !important;
|
|
524
531
|
top: ${MOBILE_EDGE_MARGIN}px !important;
|
|
525
532
|
` : ''}
|
|
526
|
-
`], children: [!mobileLayout && (_jsxs(_Fragment, { children: [_jsx("div", { css: resizeHandleNW, onPointerDown: handleResizeStart('nw'), title: "Resize", "aria-label": "Resize chat window from top-left" }), _jsx("div", { css: resizeHandleNE, onPointerDown: handleResizeStart('ne'), title: "Resize", "aria-label": "Resize chat window from top-right" }), _jsx("div", { css: resizeHandleSW, onPointerDown: handleResizeStart('sw'), title: "Resize", "aria-label": "Resize chat window from bottom-left" }), _jsx("div", { css: resizeHandleSE, onPointerDown: handleResizeStart('se'), title: "Resize", "aria-label": "Resize chat window from bottom-right" })] })), _jsx(ChatBotHeader, { mobileLayout:
|
|
533
|
+
`], children: [!mobileLayout && (_jsxs(_Fragment, { children: [_jsx("div", { css: resizeHandleNW, onPointerDown: handleResizeStart('nw'), title: "Resize", "aria-label": "Resize chat window from top-left" }), _jsx("div", { css: resizeHandleNE, onPointerDown: handleResizeStart('ne'), title: "Resize", "aria-label": "Resize chat window from top-right" }), _jsx("div", { css: resizeHandleSW, onPointerDown: handleResizeStart('sw'), title: "Resize", "aria-label": "Resize chat window from bottom-left" }), _jsx("div", { css: resizeHandleSE, onPointerDown: handleResizeStart('se'), title: "Resize", "aria-label": "Resize chat window from bottom-right" })] })), _jsx(ChatBotHeader, { mobileLayout: headerCompactLayout, isDragging: isDragging, onDragStart: handleDragStart, isVoiceMode: isVoiceMode, isVoiceConnecting: isVoiceConnecting, onVoiceToggle: () => void ((isVoiceMode || isVoiceConnecting) ? exitVoiceMode() : enterVoiceMode()), piiDisplayMode: piiDisplayMode, isAITLoading: isAITLoading, onSettingsClick: handleSettingsClick, onClose: handleClose }), showIDVSuggestion && hitAddress && !props.requireWalletIDVVerification && !hasBerifymeToken && !isWalletVerifiedWithBerifyme && (_jsxs("div", { "data-idv-banner": true, css: idvBanner, children: [_jsx("div", { css: css `
|
|
527
534
|
font-size: 20px !important;
|
|
528
535
|
color: #f39c12 !important;
|
|
529
536
|
`, children: "\uD83D\uDCA1" }), _jsxs("div", { css: css `flex: 1 !important;`, children: [_jsx("h5", { css: idvBannerTitle, children: walletTextUtils.getWalletText('Recommended: Verify Your Wallet', serviceId) }), _jsx("p", { css: idvBannerText, children: walletTextUtils.getWalletText('While not required, verifying your wallet with Berify.me provides additional security and trust for your AI agent interactions.', serviceId) }), _jsx("button", { onClick: () => onVerifyWallet('berifyme'), css: idvVerifyButton, children: walletTextUtils.getWalletText('Verify Wallet', serviceId) })] }), _jsx("button", { onClick: handleDismissIDV, css: idvDismissButton, title: `Hide for ${Math.floor((props.idvBannerDismissSeconds || 86400) / 3600)} hours`, children: "\u00D7" })] })), !showIDVSuggestion && dismissUntil && timeRemaining && (_jsxs("div", { css: css `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolatedStyles.d.ts","sourceRoot":"","sources":["../../../src/ui/styles/isolatedStyles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,2CAwBpB,CAAC;AAGF,eAAO,MAAM,YAAY,2CAmExB,CAAC;AAGF,eAAO,MAAM,cAAc,2CAqD1B,CAAC;AAGF,eAAO,MAAM,UAAU,2CA2BtB,CAAC;AAgBF,8DAA8D;AAC9D,eAAO,MAAM,YAAY,2CAKxB,CAAC;AAEF,eAAO,MAAM,cAAc,2CAK1B,CAAC;AAEF,eAAO,MAAM,cAAc,2CAK1B,CAAC;AAEF,eAAO,MAAM,cAAc,2CAK1B,CAAC;AAEF,eAAO,MAAM,cAAc,2CAK1B,CAAC;AAGF,eAAO,MAAM,UAAU,2CAStB,CAAC;AAGF,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"isolatedStyles.d.ts","sourceRoot":"","sources":["../../../src/ui/styles/isolatedStyles.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytexbyte/nxtlinq-ai-agent-ui-react-development",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Official React Web UI for nxtlinq AI Agent — drop-in chat widget",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -55,4 +55,4 @@
|
|
|
55
55
|
"react-dom": "^18.2.0",
|
|
56
56
|
"typescript": "^5.4.2"
|
|
57
57
|
}
|
|
58
|
-
}
|
|
58
|
+
}
|
|
@@ -79,8 +79,6 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
79
79
|
isStopRecordingOnSend = false,
|
|
80
80
|
// Custom error message to display in chat
|
|
81
81
|
customError,
|
|
82
|
-
// PII display mode
|
|
83
|
-
piiDisplayMode = 'redacted',
|
|
84
82
|
voiceThresholds,
|
|
85
83
|
debugVoiceRms = false,
|
|
86
84
|
sttGlossary,
|
|
@@ -894,6 +892,12 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
894
892
|
const [modelsFromApi, setModelsFromApi] = React.useState<AIModel[]>([]);
|
|
895
893
|
const [selectedModelIndex, setSelectedModelIndex] = useLocalStorage<number>('selectedAIModelIndex', 0);
|
|
896
894
|
|
|
895
|
+
// PII protection status: fetched from the service's own config (via serviceId + credentials
|
|
896
|
+
// already provided to the SDK), not passed in by the host app. Defaults to off until the fetch
|
|
897
|
+
// below resolves, matching how modelsFromApi starts empty.
|
|
898
|
+
const [enablePiiProtection, setEnablePiiProtection] = React.useState(false);
|
|
899
|
+
const piiDisplayMode: 'plain' | 'redacted' = enablePiiProtection ? 'redacted' : 'plain';
|
|
900
|
+
|
|
897
901
|
// Use models from API only (no default fallback)
|
|
898
902
|
// This ensures SDK always uses Dashboard-configured models
|
|
899
903
|
const effectiveAvailableModels = React.useMemo(() => {
|
|
@@ -915,6 +919,9 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
915
919
|
if ('availableModels' in result && Array.isArray(result.availableModels)) {
|
|
916
920
|
setModelsFromApi(result.availableModels);
|
|
917
921
|
}
|
|
922
|
+
if ('enablePiiProtection' in result) {
|
|
923
|
+
setEnablePiiProtection(!!result.enablePiiProtection);
|
|
924
|
+
}
|
|
918
925
|
} catch (error) {
|
|
919
926
|
console.error('Failed to fetch available models from API:', error);
|
|
920
927
|
// Silently fail and use default models
|
|
@@ -81,11 +81,6 @@ export interface ChatBotProps {
|
|
|
81
81
|
isStopRecordingOnSend?: boolean; // Stop recording automatically when sending message (default: false)
|
|
82
82
|
// Custom error message to display in chat
|
|
83
83
|
customError?: string; // Custom error message to display as a chat message when provided
|
|
84
|
-
/** PII display mode: how PII protection is visualized in chat messages
|
|
85
|
-
* - 'plain': No visualization, messages look like normal chat
|
|
86
|
-
* - 'redacted': Anonymized text with PII tokens displayed (default)
|
|
87
|
-
*/
|
|
88
|
-
piiDisplayMode?: 'plain' | 'redacted';
|
|
89
84
|
/** Override mic VAD thresholds. Useful for tuning sensitivity per deployment. */
|
|
90
85
|
voiceThresholds?: {
|
|
91
86
|
speechRmsThreshold?: number;
|
|
@@ -139,7 +134,8 @@ export interface ChatBotContextType {
|
|
|
139
134
|
selectedModelIndex: number;
|
|
140
135
|
showModelSelector: boolean;
|
|
141
136
|
suggestions: PresetMessage[];
|
|
142
|
-
// PII Protection visualization
|
|
137
|
+
// PII Protection visualization — derived internally from the service's own config
|
|
138
|
+
// (fetched via serviceId + credentials), never settable from outside the provider.
|
|
143
139
|
piiDisplayMode: 'plain' | 'redacted';
|
|
144
140
|
// Realtime voice mode (WebRTC)
|
|
145
141
|
isVoiceMode: boolean;
|
package/src/ui/ChatBotHeader.tsx
CHANGED
|
@@ -121,21 +121,27 @@ export const ChatBotHeader: React.FC<ChatBotHeaderProps> = ({
|
|
|
121
121
|
z-index: 2 !important;
|
|
122
122
|
display: flex !important;
|
|
123
123
|
justify-content: space-between !important;
|
|
124
|
-
align-items:
|
|
124
|
+
align-items: flex-start !important;
|
|
125
125
|
width: 100% !important;
|
|
126
126
|
pointer-events: none !important;
|
|
127
127
|
`}>
|
|
128
128
|
<div css={css`
|
|
129
129
|
display: flex !important;
|
|
130
130
|
align-items: center !important;
|
|
131
|
+
flex-wrap: wrap !important;
|
|
132
|
+
row-gap: 8px !important;
|
|
131
133
|
gap: 10px !important;
|
|
132
134
|
min-width: 0 !important;
|
|
135
|
+
flex: 1 1 auto !important;
|
|
136
|
+
padding-top: 2px !important;
|
|
133
137
|
pointer-events: none !important;
|
|
134
138
|
`}>
|
|
135
|
-
<h3 css={headerTitle}>AI Agent</h3>
|
|
139
|
+
<h3 css={[headerTitle, css`flex-shrink: 0 !important;`]}>AI Agent</h3>
|
|
136
140
|
{metaChips}
|
|
137
141
|
</div>
|
|
138
|
-
{
|
|
142
|
+
<div css={css`flex-shrink: 0 !important;`}>
|
|
143
|
+
{actions}
|
|
144
|
+
</div>
|
|
139
145
|
</div>
|
|
140
146
|
)}
|
|
141
147
|
</div>
|
package/src/ui/ChatBotUI.tsx
CHANGED
|
@@ -33,6 +33,12 @@ import {
|
|
|
33
33
|
const MOBILE_BREAKPOINT = 768;
|
|
34
34
|
const MOBILE_EDGE_MARGIN = 12;
|
|
35
35
|
const MOBILE_FAB_POSITION = { right: MOBILE_EDGE_MARGIN, bottom: MOBILE_EDGE_MARGIN } as const;
|
|
36
|
+
// Below this widget width, the desktop header's single-row layout (title + model/PII chips +
|
|
37
|
+
// voice/settings/close actions, all in one line) has no room left and the chips start
|
|
38
|
+
// overlapping the actions. The user can drag the window this narrow (MIN_WIDTH is 320px) even
|
|
39
|
+
// on a wide desktop viewport, so this must be driven by the widget's own width, not just
|
|
40
|
+
// window.innerWidth — falling back to the same stacked layout used on mobile viewports.
|
|
41
|
+
const HEADER_COMPACT_WIDTH = 420;
|
|
36
42
|
|
|
37
43
|
const isMobileViewport = (): boolean =>
|
|
38
44
|
typeof window !== 'undefined' && window.innerWidth <= MOBILE_BREAKPOINT;
|
|
@@ -123,6 +129,7 @@ export const ChatBotUI: React.FC = () => {
|
|
|
123
129
|
const { position, handleDragStart, isDragging, updatePosition } = useDraggable(dimensions);
|
|
124
130
|
|
|
125
131
|
const [mobileLayout, setMobileLayout] = React.useState(isMobileViewport);
|
|
132
|
+
const headerCompactLayout = mobileLayout || dimensions.width < HEADER_COMPACT_WIDTH;
|
|
126
133
|
React.useEffect(() => {
|
|
127
134
|
if (typeof window === 'undefined') return;
|
|
128
135
|
const mq = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`);
|
|
@@ -709,7 +716,7 @@ export const ChatBotUI: React.FC = () => {
|
|
|
709
716
|
)}
|
|
710
717
|
|
|
711
718
|
<ChatBotHeader
|
|
712
|
-
mobileLayout={
|
|
719
|
+
mobileLayout={headerCompactLayout}
|
|
713
720
|
isDragging={isDragging}
|
|
714
721
|
onDragStart={handleDragStart}
|
|
715
722
|
isVoiceMode={isVoiceMode}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { NxtlinqAgentChatProps } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* Drop-in React Web assistant UI wired to `@bytexbyte/nxtlinq-ai-agent-web-development`.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```tsx
|
|
8
|
-
* import { NxtlinqAgentChat } from '@bytexbyte/nxtlinq-ai-agent-ui-react-development';
|
|
9
|
-
*
|
|
10
|
-
* export default function Page() {
|
|
11
|
-
* return (
|
|
12
|
-
* <NxtlinqAgentChat
|
|
13
|
-
* style={{ height: '100vh' }}
|
|
14
|
-
* serviceId="..."
|
|
15
|
-
* apiKey="..."
|
|
16
|
-
* apiSecret="..."
|
|
17
|
-
* environment="staging"
|
|
18
|
-
* pseudoId={userId}
|
|
19
|
-
* loadHistoryOnMount
|
|
20
|
-
* />
|
|
21
|
-
* );
|
|
22
|
-
* }
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export declare function NxtlinqAgentChat({ title, placeholder, presetMessages, loadHistoryOnMount, historyLast, enableVoice, enableFileUpload, startInVoiceMode, startWithMicMuted, holdMicDuringAssistant, theme, style, headerStyle, onMessage, onError, onToolUse, children, fetchImpl, getTimezone, resetOnIdentityChange, ...agentConfig }: NxtlinqAgentChatProps): React.ReactElement;
|
|
26
|
-
//# sourceMappingURL=NxtlinqAgentChat.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NxtlinqAgentChat.d.ts","sourceRoot":"","sources":["../src/NxtlinqAgentChat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,WAAW,EACX,cAAc,EACd,kBAA0B,EAC1B,WAAW,EACX,WAAkB,EAClB,gBAAuB,EACvB,gBAAwB,EACxB,iBAAwB,EACxB,sBAA6B,EAC7B,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,qBAAqB,EACrB,GAAG,WAAW,EACf,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CA6B5C"}
|
package/dist/NxtlinqAgentChat.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import { NxtlinqAgentProvider } from '@bytexbyte/nxtlinq-ai-agent-web-development';
|
|
3
|
-
import { AgentAssistantShell } from './components/AgentAssistantShell';
|
|
4
|
-
/**
|
|
5
|
-
* Drop-in React Web assistant UI wired to `@bytexbyte/nxtlinq-ai-agent-web-development`.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```tsx
|
|
9
|
-
* import { NxtlinqAgentChat } from '@bytexbyte/nxtlinq-ai-agent-ui-react-development';
|
|
10
|
-
*
|
|
11
|
-
* export default function Page() {
|
|
12
|
-
* return (
|
|
13
|
-
* <NxtlinqAgentChat
|
|
14
|
-
* style={{ height: '100vh' }}
|
|
15
|
-
* serviceId="..."
|
|
16
|
-
* apiKey="..."
|
|
17
|
-
* apiSecret="..."
|
|
18
|
-
* environment="staging"
|
|
19
|
-
* pseudoId={userId}
|
|
20
|
-
* loadHistoryOnMount
|
|
21
|
-
* />
|
|
22
|
-
* );
|
|
23
|
-
* }
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export function NxtlinqAgentChat({ title, placeholder, presetMessages, loadHistoryOnMount = false, historyLast, enableVoice = true, enableFileUpload = true, startInVoiceMode = false, startWithMicMuted = true, holdMicDuringAssistant = true, theme, style, headerStyle, onMessage, onError, onToolUse, children, fetchImpl, getTimezone, resetOnIdentityChange, ...agentConfig }) {
|
|
27
|
-
return (_jsxs(NxtlinqAgentProvider, { fetchImpl: fetchImpl, getTimezone: getTimezone, resetOnIdentityChange: resetOnIdentityChange, onMessage: onMessage, onError: onError, onToolUse: onToolUse, ...agentConfig, children: [_jsx(AgentAssistantShell, { title: title, placeholder: placeholder, presetMessages: presetMessages, loadHistoryOnMount: loadHistoryOnMount, historyLast: historyLast, enableVoice: enableVoice, enableFileUpload: enableFileUpload, startInVoiceMode: startInVoiceMode, startWithMicMuted: startWithMicMuted, holdMicDuringAssistant: holdMicDuringAssistant, theme: theme, style: style, headerStyle: headerStyle }), children] }));
|
|
28
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { NxtlinqAgentChatProps } from '../types';
|
|
3
|
-
export type AgentAssistantShellProps = Pick<NxtlinqAgentChatProps, 'title' | 'placeholder' | 'presetMessages' | 'enableVoice' | 'enableFileUpload' | 'theme' | 'style' | 'headerStyle' | 'loadHistoryOnMount' | 'historyLast' | 'startInVoiceMode' | 'startWithMicMuted' | 'holdMicDuringAssistant'>;
|
|
4
|
-
export declare function AgentAssistantShell(props: AgentAssistantShellProps): React.ReactElement;
|
|
5
|
-
//# sourceMappingURL=AgentAssistantShell.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentAssistantShell.d.ts","sourceRoot":"","sources":["../../src/components/AgentAssistantShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAK3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAOtD,MAAM,MAAM,wBAAwB,GAAG,IAAI,CACzC,qBAAqB,EACnB,OAAO,GACP,aAAa,GACb,gBAAgB,GAChB,aAAa,GACb,kBAAkB,GAClB,OAAO,GACP,OAAO,GACP,aAAa,GACb,oBAAoB,GACpB,aAAa,GACb,kBAAkB,GAClB,mBAAmB,GACnB,wBAAwB,CAC3B,CAAC;AA2DF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAiBvF"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef, useState } from 'react';
|
|
3
|
-
import { AgentAssistantProvider, useAgentAssistant, } from '../context/AgentAssistantContext';
|
|
4
|
-
import { AgentComposer } from './AgentComposer';
|
|
5
|
-
import { AgentMessageList } from './AgentMessageList';
|
|
6
|
-
import { AgentRemoteAudio } from './AgentRemoteAudio';
|
|
7
|
-
import { AgentVoiceBar } from './AgentVoiceBar';
|
|
8
|
-
import { PresetMessageChips } from './PresetMessageChips';
|
|
9
|
-
function AgentAssistantInner({ title, headerStyle, style, loadHistoryOnMount, historyLast, startInVoiceMode, }) {
|
|
10
|
-
const { theme, loadHistory, startVoice, isVoiceAvailable } = useAgentAssistant();
|
|
11
|
-
const [historyReady, setHistoryReady] = useState(!loadHistoryOnMount);
|
|
12
|
-
const voiceAutoStartRef = useRef(false);
|
|
13
|
-
useEffect(() => {
|
|
14
|
-
if (loadHistoryOnMount) {
|
|
15
|
-
void loadHistory({ last: historyLast ?? 50 }).finally(() => setHistoryReady(true));
|
|
16
|
-
}
|
|
17
|
-
}, [loadHistory, loadHistoryOnMount, historyLast]);
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
if (!startInVoiceMode || !isVoiceAvailable || voiceAutoStartRef.current)
|
|
20
|
-
return;
|
|
21
|
-
voiceAutoStartRef.current = true;
|
|
22
|
-
void startVoice();
|
|
23
|
-
}, [startInVoiceMode, isVoiceAvailable, startVoice]);
|
|
24
|
-
return (_jsxs("div", { style: {
|
|
25
|
-
display: 'flex',
|
|
26
|
-
flexDirection: 'column',
|
|
27
|
-
flex: 1,
|
|
28
|
-
minHeight: 0,
|
|
29
|
-
backgroundColor: theme.colors.background,
|
|
30
|
-
...style,
|
|
31
|
-
}, children: [_jsx("header", { style: {
|
|
32
|
-
padding: theme.spacing.md,
|
|
33
|
-
borderBottom: `1px solid ${theme.colors.border}`,
|
|
34
|
-
backgroundColor: theme.colors.surface,
|
|
35
|
-
fontSize: theme.typography.titleSize,
|
|
36
|
-
fontWeight: 600,
|
|
37
|
-
color: theme.colors.assistantText,
|
|
38
|
-
...headerStyle,
|
|
39
|
-
}, children: title ?? 'AI Assistant' }), _jsx(PresetMessageChips, {}), historyReady ? _jsx(AgentMessageList, {}) : _jsx("div", { style: { flex: 1 } }), _jsx(AgentVoiceBar, {}), _jsx(AgentComposer, {}), _jsx(AgentRemoteAudio, {})] }));
|
|
40
|
-
}
|
|
41
|
-
export function AgentAssistantShell(props) {
|
|
42
|
-
return (_jsx(AgentAssistantProvider, { ui: {
|
|
43
|
-
title: props.title,
|
|
44
|
-
placeholder: props.placeholder,
|
|
45
|
-
presetMessages: props.presetMessages,
|
|
46
|
-
enableVoice: props.enableVoice,
|
|
47
|
-
enableFileUpload: props.enableFileUpload,
|
|
48
|
-
theme: props.theme,
|
|
49
|
-
startWithMicMuted: props.startWithMicMuted,
|
|
50
|
-
holdMicDuringAssistant: props.holdMicDuringAssistant,
|
|
51
|
-
}, children: _jsx(AgentAssistantInner, { ...props }) }));
|
|
52
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentComposer.d.ts","sourceRoot":"","sources":["../../src/components/AgentComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,wBAAgB,aAAa,IAAI,KAAK,CAAC,YAAY,GAAG,IAAI,CAkIzD"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { useAgentAssistant } from '../context/AgentAssistantContext';
|
|
4
|
-
export function AgentComposer() {
|
|
5
|
-
const { theme, placeholder, inputText, setInputText, sendText, isLoading, isVoiceAvailable, interactionMode, startVoice, isVoiceConnecting, enableFileUpload, sendMessage, } = useAgentAssistant();
|
|
6
|
-
const fileInputRef = React.useRef(null);
|
|
7
|
-
if (interactionMode === 'voice') {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
const handleFiles = async (files) => {
|
|
11
|
-
if (!files?.length)
|
|
12
|
-
return;
|
|
13
|
-
const { fileToAttachment } = await import('@bytexbyte/nxtlinq-ai-agent-web-development');
|
|
14
|
-
const attachments = await Promise.all(Array.from(files).map((file) => fileToAttachment(file)));
|
|
15
|
-
await sendMessage(attachments.length ? `Uploaded ${attachments.length} file(s)` : '', { attachments });
|
|
16
|
-
if (fileInputRef.current)
|
|
17
|
-
fileInputRef.current.value = '';
|
|
18
|
-
};
|
|
19
|
-
return (_jsxs("div", { style: {
|
|
20
|
-
borderTop: `1px solid ${theme.colors.border}`,
|
|
21
|
-
backgroundColor: theme.colors.surface,
|
|
22
|
-
padding: theme.spacing.md,
|
|
23
|
-
}, children: [_jsxs("div", { style: { display: 'flex', gap: theme.spacing.sm, alignItems: 'flex-end' }, children: [enableFileUpload ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => fileInputRef.current?.click(), disabled: isLoading, style: {
|
|
24
|
-
width: 36,
|
|
25
|
-
height: 36,
|
|
26
|
-
borderRadius: theme.radius.button,
|
|
27
|
-
border: `1px solid ${theme.colors.border}`,
|
|
28
|
-
backgroundColor: theme.colors.surface,
|
|
29
|
-
cursor: 'pointer',
|
|
30
|
-
}, "aria-label": "Upload file", children: "+" }), _jsx("input", { ref: fileInputRef, type: "file", multiple: true, accept: "image/*,.pdf,.doc,.docx,.txt", style: { display: 'none' }, onChange: (e) => void handleFiles(e.target.files) })] })) : null, _jsx("textarea", { value: inputText, onChange: (e) => setInputText(e.target.value), placeholder: placeholder, rows: 2, disabled: isLoading, maxLength: 4000, style: {
|
|
31
|
-
flex: 1,
|
|
32
|
-
resize: 'none',
|
|
33
|
-
border: `1px solid ${theme.colors.border}`,
|
|
34
|
-
borderRadius: theme.radius.panel,
|
|
35
|
-
padding: theme.spacing.sm,
|
|
36
|
-
fontSize: theme.typography.bodySize,
|
|
37
|
-
color: theme.colors.assistantText,
|
|
38
|
-
} }), _jsx("button", { type: "button", onClick: () => void sendText(), disabled: isLoading || !inputText.trim(), style: {
|
|
39
|
-
backgroundColor: theme.colors.primary,
|
|
40
|
-
color: theme.colors.primaryText,
|
|
41
|
-
border: 'none',
|
|
42
|
-
borderRadius: theme.radius.button,
|
|
43
|
-
padding: `${theme.spacing.sm}px ${theme.spacing.md}px`,
|
|
44
|
-
fontWeight: 600,
|
|
45
|
-
opacity: isLoading || !inputText.trim() ? 0.5 : 1,
|
|
46
|
-
cursor: 'pointer',
|
|
47
|
-
}, children: "Send" })] }), isVoiceAvailable ? (_jsx("button", { type: "button", onClick: () => {
|
|
48
|
-
startVoice().catch((err) => {
|
|
49
|
-
console.warn('[nxtlinq] startVoice failed:', err);
|
|
50
|
-
});
|
|
51
|
-
}, disabled: isVoiceConnecting, style: {
|
|
52
|
-
display: 'block',
|
|
53
|
-
margin: `${theme.spacing.sm}px auto 0`,
|
|
54
|
-
border: 'none',
|
|
55
|
-
background: 'none',
|
|
56
|
-
color: theme.colors.primary,
|
|
57
|
-
fontSize: theme.typography.captionSize,
|
|
58
|
-
cursor: 'pointer',
|
|
59
|
-
}, children: isVoiceConnecting ? 'Connecting voice…' : 'Switch to voice mode' })) : null] }));
|
|
60
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentMessageList.d.ts","sourceRoot":"","sources":["../../src/components/AgentMessageList.tsx"],"names":[],"mappings":"AACA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAyCjD,wBAAgB,gBAAgB,IAAI,KAAK,CAAC,YAAY,CAmCrD"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef } from 'react';
|
|
3
|
-
import { useAgentAssistant } from '../context/AgentAssistantContext';
|
|
4
|
-
function MessageBubble({ message }) {
|
|
5
|
-
const { theme } = useAgentAssistant();
|
|
6
|
-
const isUser = message.role === 'user';
|
|
7
|
-
const displayText = message.partialContent && message.isStreaming
|
|
8
|
-
? message.partialContent
|
|
9
|
-
: message.content;
|
|
10
|
-
return (_jsx("div", { style: {
|
|
11
|
-
display: 'flex',
|
|
12
|
-
justifyContent: isUser ? 'flex-end' : 'flex-start',
|
|
13
|
-
marginBottom: theme.spacing.sm,
|
|
14
|
-
}, children: _jsxs("div", { style: {
|
|
15
|
-
maxWidth: '85%',
|
|
16
|
-
padding: `${theme.spacing.sm}px ${theme.spacing.md}px`,
|
|
17
|
-
borderRadius: theme.radius.bubble,
|
|
18
|
-
backgroundColor: isUser ? theme.colors.userBubble : theme.colors.assistantBubble,
|
|
19
|
-
color: isUser ? theme.colors.userText : theme.colors.assistantText,
|
|
20
|
-
fontSize: theme.typography.bodySize,
|
|
21
|
-
whiteSpace: 'pre-wrap',
|
|
22
|
-
}, children: [displayText || ' ', message.error ? (_jsx("div", { style: { color: theme.colors.error, fontSize: theme.typography.captionSize }, children: message.error })) : null] }) }));
|
|
23
|
-
}
|
|
24
|
-
export function AgentMessageList() {
|
|
25
|
-
const { messages, isLoading, theme } = useAgentAssistant();
|
|
26
|
-
const endRef = useRef(null);
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
endRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
29
|
-
}, [messages.length, messages[messages.length - 1]?.content, messages[messages.length - 1]?.partialContent]);
|
|
30
|
-
return (_jsxs("div", { style: {
|
|
31
|
-
flex: 1,
|
|
32
|
-
minHeight: 0,
|
|
33
|
-
overflowY: 'auto',
|
|
34
|
-
padding: theme.spacing.md,
|
|
35
|
-
backgroundColor: theme.colors.background,
|
|
36
|
-
}, children: [messages.length === 0 ? (_jsx("p", { style: { textAlign: 'center', color: theme.colors.mutedText, marginTop: 40 }, children: "Send a message to start the conversation." })) : (messages.map((message) => (_jsx(MessageBubble, { message: message }, message.id)))), isLoading ? (_jsx("p", { style: { color: theme.colors.mutedText, fontSize: theme.typography.captionSize }, children: "Thinking\u2026" })) : null, _jsx("div", { ref: endRef })] }));
|
|
37
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentRemoteAudio.d.ts","sourceRoot":"","sources":["../../src/components/AgentRemoteAudio.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAGjD,4EAA4E;AAC5E,wBAAgB,gBAAgB,IAAI,KAAK,CAAC,YAAY,GAAG,IAAI,CA6B5D"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef } from 'react';
|
|
3
|
-
import { useAgentAssistant } from '../context/AgentAssistantContext';
|
|
4
|
-
/** Plays assistant WebRTC remote audio with retry until stream is ready. */
|
|
5
|
-
export function AgentRemoteAudio() {
|
|
6
|
-
const { getRemoteAudioStream, isVoiceActive, isVoiceChannelReady } = useAgentAssistant();
|
|
7
|
-
const audioRef = useRef(null);
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
const audio = audioRef.current;
|
|
10
|
-
if (!audio || !isVoiceActive)
|
|
11
|
-
return;
|
|
12
|
-
let cancelled = false;
|
|
13
|
-
const attach = () => {
|
|
14
|
-
if (cancelled)
|
|
15
|
-
return;
|
|
16
|
-
const stream = getRemoteAudioStream();
|
|
17
|
-
if (!stream)
|
|
18
|
-
return;
|
|
19
|
-
audio.srcObject = stream;
|
|
20
|
-
void audio.play().catch(() => undefined);
|
|
21
|
-
};
|
|
22
|
-
attach();
|
|
23
|
-
const timer = window.setInterval(attach, 120);
|
|
24
|
-
return () => {
|
|
25
|
-
cancelled = true;
|
|
26
|
-
window.clearInterval(timer);
|
|
27
|
-
audio.pause();
|
|
28
|
-
audio.srcObject = null;
|
|
29
|
-
};
|
|
30
|
-
}, [getRemoteAudioStream, isVoiceActive, isVoiceChannelReady]);
|
|
31
|
-
if (!isVoiceActive)
|
|
32
|
-
return null;
|
|
33
|
-
return _jsx("audio", { ref: audioRef, autoPlay: true, playsInline: true, style: { display: 'none' } });
|
|
34
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentVoiceBar.d.ts","sourceRoot":"","sources":["../../src/components/AgentVoiceBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAsC3C,wBAAgB,aAAa,IAAI,KAAK,CAAC,YAAY,GAAG,IAAI,CAsIzD"}
|