@exotel-npm-dev/exotel-ai-assist 1.2.1 → 1.2.3

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.
@@ -1811,7 +1811,7 @@ class ExotelAIAssistController extends EventEmitter {
1811
1811
  this.emit("streamState", state);
1812
1812
  if (state === "connected" || state === "throttled") {
1813
1813
  this._fireReady();
1814
- } else if (state === "disconnected" && this.readyFired) {
1814
+ } else if ((state === "connection_timeout" || state === "disconnected") && this.readyFired) {
1815
1815
  this.readyFired = false;
1816
1816
  this.emit("onReady", false);
1817
1817
  }
package/dist/index.js CHANGED
@@ -21229,7 +21229,7 @@ class ExotelAIAssistController extends EventEmitter {
21229
21229
  this.emit("streamState", state);
21230
21230
  if (state === "connected" || state === "throttled") {
21231
21231
  this._fireReady();
21232
- } else if (state === "disconnected" && this.readyFired) {
21232
+ } else if ((state === "connection_timeout" || state === "disconnected") && this.readyFired) {
21233
21233
  this.readyFired = false;
21234
21234
  this.emit("onReady", false);
21235
21235
  }
@@ -21890,6 +21890,23 @@ function ExotelAIAssist(_a) {
21890
21890
  (_a = onReadyRef.current) === null || _a === void 0 ? void 0 : _a.call(onReadyRef, isReady);
21891
21891
  }, [isReady]);
21892
21892
  const connected = streamState === "connected";
21893
+ function renderProperEmptyContent() {
21894
+ if (streamState === "throttled") {
21895
+ return jsxRuntimeExports.jsx(EmptyState, {
21896
+ title: "AI Assist Unavailable",
21897
+ subtitle: "Available again on your next call",
21898
+ showWarningBanner: true,
21899
+ warningBannerMessage: "AI Assist couldn't join this call \u2014 capacity is full. It should be ready for your next call."
21900
+ });
21901
+ }
21902
+ if (streamState === "connection_timeout") {
21903
+ return jsxRuntimeExports.jsx(EmptyState, {
21904
+ title: "AI Assist is currently inactive",
21905
+ subtitle: "we were unable to establish a connection."
21906
+ });
21907
+ }
21908
+ return null;
21909
+ }
21893
21910
  return jsxRuntimeExports.jsx(Provider, {
21894
21911
  children: jsxRuntimeExports.jsx("div", {
21895
21912
  className: "oa-theme-root",
@@ -21956,12 +21973,7 @@ function ExotelAIAssist(_a) {
21956
21973
  botConfig: botConfig
21957
21974
  })
21958
21975
  })]
21959
- }) : jsxRuntimeExports.jsx(EmptyState, {
21960
- title: "AI Assist Unavailable",
21961
- subtitle: "Available again on your next call",
21962
- showWarningBanner: true,
21963
- warningBannerMessage: "AI Assist couldn't join this call \u2014 capacity is full. It should be ready for your next call."
21964
- })]
21976
+ }) : renderProperEmptyContent()]
21965
21977
  })
21966
21978
  })
21967
21979
  })
@@ -6515,7 +6515,7 @@ class ExotelAIAssistController extends EventEmitter {
6515
6515
  this.emit("streamState", state);
6516
6516
  if (state === "connected" || state === "throttled") {
6517
6517
  this._fireReady();
6518
- } else if (state === "disconnected" && this.readyFired) {
6518
+ } else if ((state === "connection_timeout" || state === "disconnected") && this.readyFired) {
6519
6519
  this.readyFired = false;
6520
6520
  this.emit("onReady", false);
6521
6521
  }
@@ -7176,6 +7176,23 @@ function ExotelAIAssist(_a) {
7176
7176
  (_a = onReadyRef.current) === null || _a === void 0 ? void 0 : _a.call(onReadyRef, isReady);
7177
7177
  }, [isReady]);
7178
7178
  const connected = streamState === "connected";
7179
+ function renderProperEmptyContent() {
7180
+ if (streamState === "throttled") {
7181
+ return jsxRuntime.jsx(EmptyState, {
7182
+ title: "AI Assist Unavailable",
7183
+ subtitle: "Available again on your next call",
7184
+ showWarningBanner: true,
7185
+ warningBannerMessage: "AI Assist couldn't join this call \u2014 capacity is full. It should be ready for your next call."
7186
+ });
7187
+ }
7188
+ if (streamState === "connection_timeout") {
7189
+ return jsxRuntime.jsx(EmptyState, {
7190
+ title: "AI Assist is currently inactive",
7191
+ subtitle: "we were unable to establish a connection."
7192
+ });
7193
+ }
7194
+ return null;
7195
+ }
7179
7196
  return jsxRuntime.jsx(Provider, {
7180
7197
  children: jsxRuntime.jsx("div", {
7181
7198
  className: "oa-theme-root",
@@ -7242,12 +7259,7 @@ function ExotelAIAssist(_a) {
7242
7259
  botConfig: botConfig
7243
7260
  })
7244
7261
  })]
7245
- }) : jsxRuntime.jsx(EmptyState, {
7246
- title: "AI Assist Unavailable",
7247
- subtitle: "Available again on your next call",
7248
- showWarningBanner: true,
7249
- warningBannerMessage: "AI Assist couldn't join this call \u2014 capacity is full. It should be ready for your next call."
7250
- })]
7262
+ }) : renderProperEmptyContent()]
7251
7263
  })
7252
7264
  })
7253
7265
  })
@@ -38,7 +38,7 @@ export type ConnectionStatus = "idle" | "connecting" | "connected" | "disconnect
38
38
  * - `throttled` – capacity full; the bot cannot join this call
39
39
  * - `pending` – stream is pending
40
40
  */
41
- export type StreamState = "connected" | "throttled" | "pending" | "disconnected";
41
+ export type StreamState = "connected" | "throttled" | "pending" | "disconnected" | 'connection_timeout';
42
42
  /** Feature-flag config received from the AI Assist backend. */
43
43
  export interface BotConfig {
44
44
  sentiment: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exotel-npm-dev/exotel-ai-assist",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "AI-powered real-time suggestions, transcript, and sentiment for agent calls",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/index.js",
@@ -30,6 +30,23 @@ export function ExotelAIAssist({ className, onReady, ...params }: ExotelAIAssist
30
30
 
31
31
  const connected = streamState === "connected";
32
32
 
33
+ function renderProperEmptyContent(): JSX.Element | null {
34
+ if (streamState === "throttled") {
35
+ return (
36
+ <EmptyState
37
+ title="AI Assist Unavailable"
38
+ subtitle="Available again on your next call"
39
+ showWarningBanner={true}
40
+ warningBannerMessage="AI Assist couldn't join this call — capacity is full. It should be ready for your next call."
41
+ />
42
+ );
43
+ }
44
+ if (streamState === "connection_timeout") {
45
+ return <EmptyState title="AI Assist is currently inactive" subtitle="we were unable to establish a connection." />;
46
+ }
47
+ return null;
48
+ }
49
+
33
50
  return (
34
51
  <Tooltip.Provider>
35
52
  <div className="oa-theme-root">
@@ -60,12 +77,7 @@ export function ExotelAIAssist({ className, onReady, ...params }: ExotelAIAssist
60
77
  </Tabs.Content>
61
78
  </Tabs.Root>
62
79
  ) : (
63
- <EmptyState
64
- title="AI Assist Unavailable"
65
- subtitle="Available again on your next call"
66
- showWarningBanner={true}
67
- warningBannerMessage="AI Assist couldn't join this call — capacity is full. It should be ready for your next call."
68
- />
80
+ renderProperEmptyContent()
69
81
  )}
70
82
  </div>
71
83
  </div>
@@ -225,7 +225,7 @@ export class ExotelAIAssistController extends EventEmitter<ControllerEvents> {
225
225
  if (!event) continue;
226
226
 
227
227
  if (event.event_type === "transcript" && event.value) {
228
- const transcripts = Array.isArray(event?.value) ? event.value : event?.transcript ?? []
228
+ const transcripts = Array.isArray(event?.value) ? event.value : (event?.transcript ?? []);
229
229
  const lines: TranscriptLine[] = transcripts.map((msg) => {
230
230
  const first = msg.transcript_segments?.[0];
231
231
  const last = msg.transcript_segments?.[msg.transcript_segments.length - 1];
@@ -264,7 +264,7 @@ export class ExotelAIAssistController extends EventEmitter<ControllerEvents> {
264
264
  this.emit("streamState", state);
265
265
  if (state === "connected" || state === "throttled") {
266
266
  this._fireReady();
267
- } else if (state === "disconnected" && this.readyFired) {
267
+ } else if ((state === "connection_timeout" || state === "disconnected") && this.readyFired) {
268
268
  this.readyFired = false;
269
269
  this.emit("onReady", false);
270
270
  }
@@ -43,7 +43,7 @@ export type ConnectionStatus = "idle" | "connecting" | "connected" | "disconnect
43
43
  * - `throttled` – capacity full; the bot cannot join this call
44
44
  * - `pending` – stream is pending
45
45
  */
46
- export type StreamState = "connected" | "throttled" | "pending" | "disconnected";
46
+ export type StreamState = "connected" | "throttled" | "pending" | "disconnected" | 'connection_timeout';
47
47
 
48
48
  // ---------------------------------------------------------------------------
49
49
  // Internal-only backend response types