@nextpa/chat-core 0.1.0

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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/dist/constants/defaults.d.ts +6 -0
  4. package/dist/constants/defaults.js +69 -0
  5. package/dist/core/chat-manager.d.ts +17 -0
  6. package/dist/core/chat-manager.js +39 -0
  7. package/dist/core/config-manager.d.ts +14 -0
  8. package/dist/core/config-manager.js +75 -0
  9. package/dist/core/connection-manager.d.ts +68 -0
  10. package/dist/core/connection-manager.js +273 -0
  11. package/dist/core/connection-retry-handler.d.ts +11 -0
  12. package/dist/core/connection-retry-handler.js +33 -0
  13. package/dist/core/consent-manager.d.ts +15 -0
  14. package/dist/core/consent-manager.js +40 -0
  15. package/dist/core/conversation-persistence.d.ts +23 -0
  16. package/dist/core/conversation-persistence.js +109 -0
  17. package/dist/core/event-emitter.d.ts +7 -0
  18. package/dist/core/event-emitter.js +27 -0
  19. package/dist/core/greeting-gate.d.ts +16 -0
  20. package/dist/core/greeting-gate.js +53 -0
  21. package/dist/core/index.d.ts +9 -0
  22. package/dist/core/index.js +7 -0
  23. package/dist/core/link-target.d.ts +15 -0
  24. package/dist/core/link-target.js +64 -0
  25. package/dist/core/local-storage-persistence.d.ts +11 -0
  26. package/dist/core/local-storage-persistence.js +111 -0
  27. package/dist/core/navigation-manager.d.ts +24 -0
  28. package/dist/core/navigation-manager.js +132 -0
  29. package/dist/core/popover-manager.d.ts +14 -0
  30. package/dist/core/popover-manager.js +36 -0
  31. package/dist/core/session-beacon.d.ts +11 -0
  32. package/dist/core/session-beacon.js +60 -0
  33. package/dist/core/text-connection-manager.d.ts +58 -0
  34. package/dist/core/text-connection-manager.js +200 -0
  35. package/dist/core/text-mode-manager.d.ts +50 -0
  36. package/dist/core/text-mode-manager.js +154 -0
  37. package/dist/core/text-types.d.ts +20 -0
  38. package/dist/core/text-types.js +1 -0
  39. package/dist/core/text-widget-controller.d.ts +47 -0
  40. package/dist/core/text-widget-controller.js +278 -0
  41. package/dist/core/theme-manager.d.ts +10 -0
  42. package/dist/core/theme-manager.js +25 -0
  43. package/dist/core/types.d.ts +50 -0
  44. package/dist/core/types.js +1 -0
  45. package/dist/core/voice-state-manager.d.ts +85 -0
  46. package/dist/core/voice-state-manager.js +317 -0
  47. package/dist/core/widget-controller.d.ts +58 -0
  48. package/dist/core/widget-controller.js +533 -0
  49. package/dist/core/widget-core.d.ts +51 -0
  50. package/dist/core/widget-core.js +160 -0
  51. package/dist/google.d.ts +1 -0
  52. package/dist/google.js +12 -0
  53. package/dist/index.d.ts +37 -0
  54. package/dist/index.js +40 -0
  55. package/dist/openai.d.ts +1 -0
  56. package/dist/openai.js +7 -0
  57. package/dist/services/api.d.ts +114 -0
  58. package/dist/services/api.js +336 -0
  59. package/dist/services/index.d.ts +3 -0
  60. package/dist/services/index.js +3 -0
  61. package/dist/services/page-interaction/constants.d.ts +1 -0
  62. package/dist/services/page-interaction/constants.js +1 -0
  63. package/dist/services/page-interaction/content-extractor.d.ts +2 -0
  64. package/dist/services/page-interaction/content-extractor.js +104 -0
  65. package/dist/services/page-interaction/deep-query.d.ts +8 -0
  66. package/dist/services/page-interaction/deep-query.js +44 -0
  67. package/dist/services/page-interaction/dom-executor.d.ts +7 -0
  68. package/dist/services/page-interaction/dom-executor.js +172 -0
  69. package/dist/services/page-interaction/dom-extractor.d.ts +8 -0
  70. package/dist/services/page-interaction/dom-extractor.js +252 -0
  71. package/dist/services/page-interaction/extension-bridge.d.ts +10 -0
  72. package/dist/services/page-interaction/extension-bridge.js +86 -0
  73. package/dist/services/page-interaction/iframe-navigation-manager.d.ts +28 -0
  74. package/dist/services/page-interaction/iframe-navigation-manager.js +154 -0
  75. package/dist/services/page-interaction/index.d.ts +5 -0
  76. package/dist/services/page-interaction/index.js +4 -0
  77. package/dist/services/page-interaction/page-interaction-handler.d.ts +21 -0
  78. package/dist/services/page-interaction/page-interaction-handler.js +129 -0
  79. package/dist/services/page-interaction/selector-generator.d.ts +1 -0
  80. package/dist/services/page-interaction/selector-generator.js +48 -0
  81. package/dist/services/page-interaction/types.d.ts +75 -0
  82. package/dist/services/page-interaction/types.js +1 -0
  83. package/dist/services/realtime/google/google-audio.d.ts +44 -0
  84. package/dist/services/realtime/google/google-audio.js +410 -0
  85. package/dist/services/realtime/google/google-provider.d.ts +47 -0
  86. package/dist/services/realtime/google/google-provider.js +465 -0
  87. package/dist/services/realtime/google/google-tool-mapper.d.ts +3 -0
  88. package/dist/services/realtime/google/google-tool-mapper.js +70 -0
  89. package/dist/services/realtime/google/index.d.ts +1 -0
  90. package/dist/services/realtime/google/index.js +1 -0
  91. package/dist/services/realtime/openai/index.d.ts +1 -0
  92. package/dist/services/realtime/openai/index.js +1 -0
  93. package/dist/services/realtime/openai/openai-audio-monitor.d.ts +1 -0
  94. package/dist/services/realtime/openai/openai-audio-monitor.js +55 -0
  95. package/dist/services/realtime/openai/openai-provider.d.ts +50 -0
  96. package/dist/services/realtime/openai/openai-provider.js +579 -0
  97. package/dist/services/realtime/openai/openai-tool-mapper.d.ts +15 -0
  98. package/dist/services/realtime/openai/openai-tool-mapper.js +14 -0
  99. package/dist/services/realtime/provider-factory.d.ts +4 -0
  100. package/dist/services/realtime/provider-factory.js +12 -0
  101. package/dist/services/realtime/types.d.ts +78 -0
  102. package/dist/services/realtime/types.js +1 -0
  103. package/dist/services/realtime/vertexai/index.d.ts +1 -0
  104. package/dist/services/realtime/vertexai/index.js +1 -0
  105. package/dist/services/realtime/vertexai/vertexai-provider.d.ts +53 -0
  106. package/dist/services/realtime/vertexai/vertexai-provider.js +561 -0
  107. package/dist/services/realtime/voice-session-tracker.d.ts +10 -0
  108. package/dist/services/realtime/voice-session-tracker.js +62 -0
  109. package/dist/services/signalr.d.ts +37 -0
  110. package/dist/services/signalr.js +145 -0
  111. package/dist/services/thinking-audio-pulse.d.ts +2 -0
  112. package/dist/services/thinking-audio-pulse.js +72 -0
  113. package/dist/services/thinking-audio.d.ts +2 -0
  114. package/dist/services/thinking-audio.js +105 -0
  115. package/dist/services/voice-health-watchdog.d.ts +42 -0
  116. package/dist/services/voice-health-watchdog.js +90 -0
  117. package/dist/services/webrtc-event-handler.d.ts +4 -0
  118. package/dist/services/webrtc-event-handler.js +42 -0
  119. package/dist/services/webrtc-greeting.d.ts +3 -0
  120. package/dist/services/webrtc-greeting.js +62 -0
  121. package/dist/services/webrtc-microphone.d.ts +15 -0
  122. package/dist/services/webrtc-microphone.js +64 -0
  123. package/dist/services/webrtc.d.ts +44 -0
  124. package/dist/services/webrtc.js +196 -0
  125. package/dist/types/index.d.ts +151 -0
  126. package/dist/types/index.js +1 -0
  127. package/dist/utils/audio-context.d.ts +11 -0
  128. package/dist/utils/audio-context.js +33 -0
  129. package/dist/utils/connect-chime.d.ts +11 -0
  130. package/dist/utils/connect-chime.js +230 -0
  131. package/dist/utils/consent.d.ts +4 -0
  132. package/dist/utils/consent.js +30 -0
  133. package/dist/utils/language-detection.d.ts +1 -0
  134. package/dist/utils/language-detection.js +17 -0
  135. package/dist/utils/logger.d.ts +13 -0
  136. package/dist/utils/logger.js +40 -0
  137. package/dist/utils/mic-level-analyser.d.ts +13 -0
  138. package/dist/utils/mic-level-analyser.js +50 -0
  139. package/dist/utils/proactive-events.d.ts +5 -0
  140. package/dist/utils/proactive-events.js +1 -0
  141. package/dist/utils/styles.d.ts +4 -0
  142. package/dist/utils/styles.js +35 -0
  143. package/dist/utils/theme-detection.d.ts +3 -0
  144. package/dist/utils/theme-detection.js +121 -0
  145. package/dist/utils/tool-status.d.ts +10 -0
  146. package/dist/utils/tool-status.js +61 -0
  147. package/dist/utils/ui-sounds.d.ts +3 -0
  148. package/dist/utils/ui-sounds.js +57 -0
  149. package/package.json +56 -0
@@ -0,0 +1,160 @@
1
+ import { WidgetApiClient } from '../services/api';
2
+ import { logger } from '../utils/logger';
3
+ import { ConfigManager } from './config-manager';
4
+ import { ChatManager } from './chat-manager';
5
+ import { ThemeManager } from './theme-manager';
6
+ import { ConsentManager } from './consent-manager';
7
+ import { PopoverManager } from './popover-manager';
8
+ import { NavigationManager } from './navigation-manager';
9
+ import { ConversationPersistence } from './conversation-persistence';
10
+ const DEMO_RESPONSE_DELAY_MS = 300;
11
+ export class WidgetCore {
12
+ apiClient;
13
+ configManager;
14
+ chatManager;
15
+ themeManager;
16
+ consentManager;
17
+ popoverManager;
18
+ navigationManager;
19
+ persistence;
20
+ isMinimized = true;
21
+ isConnecting = false;
22
+ hasError = false;
23
+ isLoading = true;
24
+ initFailed = false;
25
+ pageUrl;
26
+ pageTitle;
27
+ onStateChanged;
28
+ onConnect;
29
+ logPrefix;
30
+ source;
31
+ constructor(options, onStateChanged, onDocumentProviders, onConnect, logPrefix) {
32
+ this.onStateChanged = onStateChanged;
33
+ this.onConnect = onConnect;
34
+ this.logPrefix = logPrefix;
35
+ this.source = options.source;
36
+ this.apiClient = options.apiClient ?? new WidgetApiClient({
37
+ apiKey: options.apiKey,
38
+ baseUrl: options.baseUrl,
39
+ source: options.source,
40
+ tokenProvider: options.tokenProvider,
41
+ });
42
+ this.configManager = new ConfigManager(this.apiClient);
43
+ this.chatManager = new ChatManager();
44
+ this.themeManager = new ThemeManager();
45
+ this.consentManager = new ConsentManager(onStateChanged);
46
+ this.popoverManager = new PopoverManager(onStateChanged);
47
+ this.navigationManager = new NavigationManager(onStateChanged, onDocumentProviders, () => this.resolvePageHost());
48
+ this.persistence = new ConversationPersistence(this.apiClient, logPrefix);
49
+ this.chatManager.on('messageAdded', () => {
50
+ onStateChanged();
51
+ this.persistence.saveToLocalStorage(this.chatManager);
52
+ });
53
+ this.chatManager.on('messagesCleared', onStateChanged);
54
+ }
55
+ async initialize() {
56
+ try {
57
+ const config = await this.configManager.loadConfig();
58
+ this.themeManager.initialize(config.theme, this.onStateChanged);
59
+ // The chat-app is an authenticated tenant-owner surface — the
60
+ // operator is previewing their own assistants, so the visitor-facing
61
+ // terms gate is irrelevant (and has no UI here). Skip it.
62
+ const autoAcceptConsent = this.source === 'chat-app';
63
+ this.consentManager.check(config.assistantId, config.showTermsAndConditions ?? false, autoAcceptConsent);
64
+ this.popoverManager.initialize(config);
65
+ this.detectPageContext();
66
+ // Hydrate the conversation panel up front so the user sees their
67
+ // previous messages on first paint, before the lazy SignalR /
68
+ // WebRTC connect inside connectText/connectVoice gets around to
69
+ // calling loadHistory itself. Without this the panel stays empty
70
+ // for the duration of the connect step, which on assistant switch
71
+ // looks like 'the chat is gone'.
72
+ this.persistence.setAssistantId(config.assistantId);
73
+ await this.persistence.loadHistory(this.chatManager);
74
+ this.isLoading = false;
75
+ this.onStateChanged();
76
+ this.checkForReconnect();
77
+ }
78
+ catch (err) {
79
+ logger.error(`${this.logPrefix} Initialization failed:`, err);
80
+ this.initFailed = true;
81
+ this.isLoading = false;
82
+ this.onStateChanged();
83
+ }
84
+ }
85
+ toggleMinimized() {
86
+ this.popoverManager.dismiss();
87
+ this.isMinimized = !this.isMinimized;
88
+ this.onStateChanged();
89
+ }
90
+ setMinimized(minimized) {
91
+ if (this.isMinimized === minimized)
92
+ return;
93
+ this.isMinimized = minimized;
94
+ this.onStateChanged();
95
+ }
96
+ dismissPopover() {
97
+ this.popoverManager.dismiss();
98
+ }
99
+ acceptTerms(onAccepted) {
100
+ const config = this.configManager.getConfig();
101
+ if (!config)
102
+ return;
103
+ this.consentManager.accept(config.assistantId);
104
+ onAccepted();
105
+ }
106
+ declineTerms() {
107
+ this.consentManager.decline();
108
+ this.isMinimized = true;
109
+ this.onStateChanged();
110
+ }
111
+ dismissBlockedUrl() {
112
+ this.navigationManager.dismissBlockedUrl();
113
+ }
114
+ openBlockedUrl() {
115
+ this.navigationManager.openBlockedUrl();
116
+ }
117
+ requireConsentOrConnect(config) {
118
+ this.popoverManager.dismiss();
119
+ return this.consentManager.requireConsentOrProceed(config);
120
+ }
121
+ showDemoWelcome(config) {
122
+ setTimeout(() => {
123
+ this.chatManager.addAssistantMessage(config.welcomeMessage);
124
+ }, DEMO_RESPONSE_DELAY_MS);
125
+ }
126
+ dispose() {
127
+ this.themeManager.dispose();
128
+ this.popoverManager.dispose();
129
+ this.navigationManager.dispose();
130
+ this.chatManager.removeAllListeners();
131
+ }
132
+ detectPageContext() {
133
+ try {
134
+ const loc = globalThis.parent?.location;
135
+ if (loc?.href && loc.href !== 'about:blank') {
136
+ this.pageUrl = loc.href;
137
+ this.pageTitle = globalThis.parent?.document?.title ?? undefined;
138
+ }
139
+ }
140
+ catch { /* cross-origin iframe — expected when embedded on external sites */ }
141
+ }
142
+ resolvePageHost() {
143
+ if (!this.pageUrl)
144
+ return null;
145
+ try {
146
+ return new URL(this.pageUrl).host;
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ checkForReconnect() {
153
+ if (!this.navigationManager.checkForReconnect())
154
+ return;
155
+ logger.debug(`${this.logPrefix} Fast reconnect: auto-expanding and connecting after navigation fallback`);
156
+ this.isMinimized = false;
157
+ this.onStateChanged();
158
+ this.onConnect();
159
+ }
160
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/google.js ADDED
@@ -0,0 +1,12 @@
1
+ import { registerRealtimeProvider } from './services/realtime/provider-factory';
2
+ // Subpath entry (@nextpa/chat-core/google): importing it registers both Google
3
+ // Live API providers as lazy loaders — VertexAI shares ~90% of the Google Dev
4
+ // implementation, so one subpath covers both. The SDKs stay in async chunks.
5
+ registerRealtimeProvider('google', async () => {
6
+ const { GoogleRealtimeProvider } = await import('./services/realtime/google');
7
+ return new GoogleRealtimeProvider();
8
+ });
9
+ registerRealtimeProvider('vertexai', async () => {
10
+ const { VertexAiRealtimeProvider } = await import('./services/realtime/vertexai');
11
+ return new VertexAiRealtimeProvider();
12
+ });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @nextpa/chat-core — framework-neutral voice & text chat engine.
3
+ *
4
+ * PII-free, no Preact/UI coupling: realtime voice providers
5
+ * (OpenAI / Google / VertexAI), text + voice conversation orchestration,
6
+ * backend API/auth client, SignalR, audio and WebRTC handling. Consumed by
7
+ * both the Preact widget and the Angular chat app.
8
+ *
9
+ * The "." entry is provider-SDK-free: realtime providers register themselves
10
+ * via the subpath entries ("@nextpa/chat-core/openai", "@nextpa/chat-core/google")
11
+ * which the consuming app imports for the providers it uses.
12
+ */
13
+ export { WidgetController, TextWidgetController, ConfigManager, ChatManager, ConnectionManager, TextConnectionManager, EventEmitter, type WidgetState, type WidgetControllerOptions, type WidgetEvents, type TextWidgetState, } from './core';
14
+ export { resolveSameOriginTarget } from './core/link-target';
15
+ export { WidgetApiClient, type WidgetApiClientOptions, type WidgetTokenProvider, type WidgetTokenRequestContext, type WidgetTokenResult, } from './services/api';
16
+ export { WebRtcService } from './services/webrtc';
17
+ export type { SignalRService, SignalREvents } from './services/signalr';
18
+ export { VoiceSessionTracker } from './services/realtime/voice-session-tracker';
19
+ export { startThinkingAudio, stopThinkingAudio } from './services/thinking-audio-pulse';
20
+ export { PageInteractionHandler, type DocumentProvider, type ExternalExecutor, type WindowProvider, } from './services/page-interaction/page-interaction-handler';
21
+ export { initExtensionBridge, refreshExtensionContext, } from './services/page-interaction/extension-bridge';
22
+ export { IframeNavigationManager } from './services/page-interaction/iframe-navigation-manager';
23
+ export { generateSelector } from './services/page-interaction/selector-generator';
24
+ export { NEXTPA_IFRAME_NAME } from './services/page-interaction/constants';
25
+ export { createRealtimeProvider, registerRealtimeProvider, type RealtimeProviderLoader, } from './services/realtime/provider-factory';
26
+ export type * from './services/realtime/types';
27
+ export type * from './types';
28
+ export { getDemoConfig, isDemoMode, setDemoMode, DEFAULT_LOGO_DATA_URL, DEFAULT_DESIGN_TOKENS, } from './constants/defaults';
29
+ export { MicLevelAnalyser } from './utils/mic-level-analyser';
30
+ export { logger, type LogLevel } from './utils/logger';
31
+ export { primeAudioOnGesture } from './utils/audio-context';
32
+ export { detectHostLanguage } from './utils/language-detection';
33
+ export { isGerman } from './utils/tool-status';
34
+ export { getMessageBubbleClasses, getMinimizedWidthClasses, getPlacementClasses, } from './utils/styles';
35
+ export { PROACTIVE_OPEN_WIDGET_EVENT, type ProactiveOpenWidgetEvent, type ProactiveOpenWidgetEventDetail, } from './utils/proactive-events';
36
+ export { CONNECT_CHIME_VARIANTS, getActiveConnectChimeVariant, setActiveConnectChimeVariant, playConnectChimeVariant, type ConnectChimeVariantId, type ConnectChimeVariant, } from './utils/connect-chime';
37
+ export { playMuteSound, playUnmuteSound, playEndCallSound } from './utils/ui-sounds';
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @nextpa/chat-core — framework-neutral voice & text chat engine.
3
+ *
4
+ * PII-free, no Preact/UI coupling: realtime voice providers
5
+ * (OpenAI / Google / VertexAI), text + voice conversation orchestration,
6
+ * backend API/auth client, SignalR, audio and WebRTC handling. Consumed by
7
+ * both the Preact widget and the Angular chat app.
8
+ *
9
+ * The "." entry is provider-SDK-free: realtime providers register themselves
10
+ * via the subpath entries ("@nextpa/chat-core/openai", "@nextpa/chat-core/google")
11
+ * which the consuming app imports for the providers it uses.
12
+ */
13
+ // Controllers & core managers (voice + text orchestration)
14
+ export { WidgetController, TextWidgetController, ConfigManager, ChatManager, ConnectionManager, TextConnectionManager, EventEmitter, } from './core';
15
+ export { resolveSameOriginTarget } from './core/link-target';
16
+ // Backend API, SignalR, WebRTC services
17
+ export { WidgetApiClient, } from './services/api';
18
+ export { WebRtcService } from './services/webrtc';
19
+ export { VoiceSessionTracker } from './services/realtime/voice-session-tracker';
20
+ export { startThinkingAudio, stopThinkingAudio } from './services/thinking-audio-pulse';
21
+ // Page interaction (widget DOM bridge)
22
+ export { PageInteractionHandler, } from './services/page-interaction/page-interaction-handler';
23
+ export { initExtensionBridge, refreshExtensionContext, } from './services/page-interaction/extension-bridge';
24
+ export { IframeNavigationManager } from './services/page-interaction/iframe-navigation-manager';
25
+ export { generateSelector } from './services/page-interaction/selector-generator';
26
+ export { NEXTPA_IFRAME_NAME } from './services/page-interaction/constants';
27
+ // Realtime provider abstraction
28
+ export { createRealtimeProvider, registerRealtimeProvider, } from './services/realtime/provider-factory';
29
+ // Defaults / demo config
30
+ export { getDemoConfig, isDemoMode, setDemoMode, DEFAULT_LOGO_DATA_URL, DEFAULT_DESIGN_TOKENS, } from './constants/defaults';
31
+ // Framework-neutral utilities
32
+ export { MicLevelAnalyser } from './utils/mic-level-analyser';
33
+ export { logger } from './utils/logger';
34
+ export { primeAudioOnGesture } from './utils/audio-context';
35
+ export { detectHostLanguage } from './utils/language-detection';
36
+ export { isGerman } from './utils/tool-status';
37
+ export { getMessageBubbleClasses, getMinimizedWidthClasses, getPlacementClasses, } from './utils/styles';
38
+ export { PROACTIVE_OPEN_WIDGET_EVENT, } from './utils/proactive-events';
39
+ export { CONNECT_CHIME_VARIANTS, getActiveConnectChimeVariant, setActiveConnectChimeVariant, playConnectChimeVariant, } from './utils/connect-chime';
40
+ export { playMuteSound, playUnmuteSound, playEndCallSound } from './utils/ui-sounds';
@@ -0,0 +1 @@
1
+ export {};
package/dist/openai.js ADDED
@@ -0,0 +1,7 @@
1
+ import { registerRealtimeProvider } from './services/realtime/provider-factory';
2
+ // Subpath entry (@nextpa/chat-core/openai): importing it registers the OpenAI
3
+ // provider as a lazy loader — the SDK stays in its own async chunk.
4
+ registerRealtimeProvider('openai', async () => {
5
+ const { OpenAiRealtimeProvider } = await import('./services/realtime/openai');
6
+ return new OpenAiRealtimeProvider();
7
+ });
@@ -0,0 +1,114 @@
1
+ import type { ToolDefinition, VoiceUsage, WidgetConfig } from '../types';
2
+ export interface WidgetTokenRequestContext {
3
+ readonly baseUrl: string;
4
+ readonly clientId: string;
5
+ }
6
+ export interface WidgetTokenResult {
7
+ token: string;
8
+ expiresAt: string;
9
+ assistantId?: string;
10
+ assistantName?: string;
11
+ }
12
+ export type WidgetTokenProvider = (context: WidgetTokenRequestContext) => Promise<WidgetTokenResult>;
13
+ export interface WidgetApiClientOptions {
14
+ apiKey?: string;
15
+ baseUrl?: string;
16
+ source?: string;
17
+ tokenProvider?: WidgetTokenProvider;
18
+ }
19
+ type ProactiveModeOptionsResponse = {
20
+ maxOffersPerSession: number;
21
+ cooldownSeconds: number;
22
+ longCooldownSeconds: number;
23
+ hardStopAfterConsecutiveDismissals: number;
24
+ allowedAnchorScopes: ReadonlyArray<'Element' | 'Section' | 'Page'>;
25
+ blockedUrlPatterns: ReadonlyArray<string>;
26
+ mobileBehavior: 'StandardWidget' | 'ReducedWidget' | 'ProactiveOnly';
27
+ };
28
+ type ProactiveModeResponse = {
29
+ enabled: boolean;
30
+ options: ProactiveModeOptionsResponse;
31
+ };
32
+ type TokenResponse = {
33
+ token: string;
34
+ expiresAt: string;
35
+ model: string;
36
+ provider?: string;
37
+ proxyUrl?: string;
38
+ proactiveMode?: ProactiveModeResponse;
39
+ };
40
+ type ConversationEntryDto = {
41
+ id: string;
42
+ role: string;
43
+ content: string;
44
+ timestamp: string;
45
+ feedback?: {
46
+ rating: number;
47
+ } | null;
48
+ };
49
+ type TokenClaims = {
50
+ assistantId?: string;
51
+ tenantId?: string;
52
+ userId?: string;
53
+ };
54
+ export declare class WidgetApiClient {
55
+ private static readonly CLIENT_ID_STORAGE_KEY;
56
+ private readonly baseUrl;
57
+ private readonly apiKey;
58
+ private readonly tokenProvider;
59
+ private clientId;
60
+ private readonly hostLanguage;
61
+ private bearerToken;
62
+ private tokenExpiresAt;
63
+ private tokenClaims;
64
+ private readonly source;
65
+ constructor(options: WidgetApiClientOptions);
66
+ private getOrCreateClientId;
67
+ getClientId(): string;
68
+ rotateClientId(): string;
69
+ getTokenClaims(): TokenClaims;
70
+ authenticate(): Promise<WidgetTokenResult>;
71
+ private exchangeApiKey;
72
+ private validateClientId;
73
+ private parseTokenClaims;
74
+ isAuthenticated(): boolean;
75
+ getBearerToken(): string | null;
76
+ getBaseUrl(): string;
77
+ getWidgetConfig(): Promise<WidgetConfig>;
78
+ generatePrompt(pageUrl?: string, pageTitle?: string): Promise<string>;
79
+ getEphemeralToken(): Promise<TokenResponse>;
80
+ getTools(): Promise<ToolDefinition[]>;
81
+ executeTool(name: string, jsonArguments: string, signal?: AbortSignal): Promise<string>;
82
+ transcribeAudio(audio: Blob, signal?: AbortSignal): Promise<string>;
83
+ addConversationMessage(params: {
84
+ role: string;
85
+ content: string;
86
+ pageUrl?: string;
87
+ pageTitle?: string;
88
+ language?: string;
89
+ usage?: VoiceUsage;
90
+ toolCalls?: Array<{
91
+ name: string;
92
+ durationMs: number;
93
+ succeeded: boolean;
94
+ }>;
95
+ responseLatencyMs?: number;
96
+ inputSource?: 'Spoken' | 'Typed';
97
+ }): Promise<void>;
98
+ startSession(): Promise<void>;
99
+ getConversationHistory(): Promise<ConversationEntryDto[]>;
100
+ submitFeedback(messageId: string, rating: number): Promise<void>;
101
+ submitSessionFeedback(rating: number): Promise<void>;
102
+ endConversationSession(userFeedback?: string, trimFarewell?: boolean): Promise<void>;
103
+ resetConversation(): Promise<void>;
104
+ startVoiceSession(sessionId: string): Promise<void>;
105
+ sendVoiceHeartbeat(sessionId: string): Promise<void>;
106
+ endVoiceSession(sessionId: string): Promise<void>;
107
+ sendVoiceSessionBeacon(sessionId: string): void;
108
+ sendChatMessage(message: string, pageUrl?: string, pageTitle?: string, isGreeting?: boolean): Promise<void>;
109
+ private ensureAuthenticated;
110
+ private requestWithApiKey;
111
+ private requestWithBearer;
112
+ private request;
113
+ }
114
+ export {};