@rqmii_immersive/agent-react-sdk 2.0.0 → 4.0.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.
Files changed (126) hide show
  1. package/README.md +103 -357
  2. package/dist/{RqmiiCloudAvatarPlayer-BnsY8xIR.js → RqmiiCloudAvatarPlayer-CESlcAGy.js} +6095 -6108
  3. package/dist/RqmiiCloudAvatarPlayer-CESlcAGy.js.map +1 -0
  4. package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs +2939 -0
  5. package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs.map +1 -0
  6. package/dist/agent-react-sdk.css +1 -1
  7. package/dist/components/RqmiiAgentRoom.d.ts +3 -0
  8. package/dist/components/RqmiiAgentRoom.d.ts.map +1 -0
  9. package/dist/components/RqmiiCloudAvatarPlayer.d.ts +3 -0
  10. package/dist/components/RqmiiCloudAvatarPlayer.d.ts.map +1 -0
  11. package/dist/components/RqmiiErrorBoundary.d.ts +19 -0
  12. package/dist/components/RqmiiErrorBoundary.d.ts.map +1 -0
  13. package/dist/components/pxs/EpicPixelStreamingPlayer.d.ts +5 -0
  14. package/dist/components/pxs/EpicPixelStreamingPlayer.d.ts.map +1 -0
  15. package/dist/core/constants.d.ts +81 -0
  16. package/dist/core/constants.d.ts.map +1 -0
  17. package/dist/core/events/emitter.d.ts +10 -0
  18. package/dist/core/events/emitter.d.ts.map +1 -0
  19. package/dist/core/managers/audio.d.ts +24 -0
  20. package/dist/core/managers/audio.d.ts.map +1 -0
  21. package/dist/core/managers/heartbeat.d.ts +13 -0
  22. package/dist/core/managers/heartbeat.d.ts.map +1 -0
  23. package/dist/core/managers/reconnect.d.ts +29 -0
  24. package/dist/core/managers/reconnect.d.ts.map +1 -0
  25. package/dist/core/managers/session.d.ts +20 -0
  26. package/dist/core/managers/session.d.ts.map +1 -0
  27. package/dist/core/managers/socket.d.ts +15 -0
  28. package/dist/core/managers/socket.d.ts.map +1 -0
  29. package/dist/core/state/reducer.d.ts +4 -0
  30. package/dist/core/state/reducer.d.ts.map +1 -0
  31. package/dist/core/state/selectors.d.ts +24 -0
  32. package/dist/core/state/selectors.d.ts.map +1 -0
  33. package/dist/core/state/types.d.ts +60 -0
  34. package/dist/core/state/types.d.ts.map +1 -0
  35. package/dist/core/utils/accumulator.d.ts +11 -0
  36. package/dist/core/utils/accumulator.d.ts.map +1 -0
  37. package/dist/core/utils/agent-type.d.ts +2 -0
  38. package/dist/core/utils/agent-type.d.ts.map +1 -0
  39. package/dist/core/utils/bytes.d.ts +2 -0
  40. package/dist/core/utils/bytes.d.ts.map +1 -0
  41. package/dist/core/utils/sleep.d.ts +2 -0
  42. package/dist/core/utils/sleep.d.ts.map +1 -0
  43. package/dist/hooks/index.d.ts +12 -0
  44. package/dist/hooks/index.d.ts.map +1 -0
  45. package/dist/hooks/use-rqmii-agent.d.ts +2 -0
  46. package/dist/hooks/use-rqmii-agent.d.ts.map +1 -0
  47. package/dist/hooks/use-rqmii-audio-element.d.ts +2 -0
  48. package/dist/hooks/use-rqmii-audio-element.d.ts.map +1 -0
  49. package/dist/hooks/use-rqmii-avatar.d.ts +13 -0
  50. package/dist/hooks/use-rqmii-avatar.d.ts.map +1 -0
  51. package/dist/hooks/use-rqmii-connection.d.ts +27 -0
  52. package/dist/hooks/use-rqmii-connection.d.ts.map +1 -0
  53. package/dist/hooks/use-rqmii-events.d.ts +3 -0
  54. package/dist/hooks/use-rqmii-events.d.ts.map +1 -0
  55. package/dist/hooks/use-rqmii-messages.d.ts +6 -0
  56. package/dist/hooks/use-rqmii-messages.d.ts.map +1 -0
  57. package/dist/hooks/use-rqmii-press-to-talk.d.ts +3 -0
  58. package/dist/hooks/use-rqmii-press-to-talk.d.ts.map +1 -0
  59. package/dist/hooks/use-rqmii-sdk.d.ts +81 -0
  60. package/dist/hooks/use-rqmii-sdk.d.ts.map +1 -0
  61. package/dist/hooks/use-rqmii-session.d.ts +9 -0
  62. package/dist/hooks/use-rqmii-session.d.ts.map +1 -0
  63. package/dist/hooks/use-rqmii-vad.d.ts +3 -0
  64. package/dist/hooks/use-rqmii-vad.d.ts.map +1 -0
  65. package/dist/hooks/use-rqmii-voice.d.ts +12 -0
  66. package/dist/hooks/use-rqmii-voice.d.ts.map +1 -0
  67. package/dist/index.cjs +1 -1
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.ts +10 -340
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +270 -20
  72. package/dist/index.js.map +1 -1
  73. package/dist/provider/RqmiiAgentProvider.d.ts +4 -0
  74. package/dist/provider/RqmiiAgentProvider.d.ts.map +1 -0
  75. package/dist/provider/socket-handlers.d.ts +77 -0
  76. package/dist/provider/socket-handlers.d.ts.map +1 -0
  77. package/dist/provider/use-manager-lifecycle.d.ts +76 -0
  78. package/dist/provider/use-manager-lifecycle.d.ts.map +1 -0
  79. package/dist/types/index.d.ts +385 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/ui/Orb.d.ts +19 -0
  82. package/dist/ui/Orb.d.ts.map +1 -0
  83. package/dist/ui/RqmiiAgentChat.d.ts +4 -0
  84. package/dist/ui/RqmiiAgentChat.d.ts.map +1 -0
  85. package/dist/ui/agent-data.d.ts +17 -0
  86. package/dist/ui/agent-data.d.ts.map +1 -0
  87. package/dist/ui/chat/ChatBox.d.ts +22 -0
  88. package/dist/ui/chat/ChatBox.d.ts.map +1 -0
  89. package/dist/ui/chat/CreditsExhaustedPanel.d.ts +6 -0
  90. package/dist/ui/chat/CreditsExhaustedPanel.d.ts.map +1 -0
  91. package/dist/ui/chat/chat-box-avatar.d.ts +3 -0
  92. package/dist/ui/chat/chat-box-avatar.d.ts.map +1 -0
  93. package/dist/ui/chat/chat-box-content.d.ts +26 -0
  94. package/dist/ui/chat/chat-box-content.d.ts.map +1 -0
  95. package/dist/ui/chat/chat-box-shared.d.ts +24 -0
  96. package/dist/ui/chat/chat-box-shared.d.ts.map +1 -0
  97. package/dist/ui/chat/chat-box-text-and-voice.d.ts +3 -0
  98. package/dist/ui/chat/chat-box-text-and-voice.d.ts.map +1 -0
  99. package/dist/ui/chat/chat-box-text.d.ts +3 -0
  100. package/dist/ui/chat/chat-box-text.d.ts.map +1 -0
  101. package/dist/ui/chat/chat-box-types.d.ts +83 -0
  102. package/dist/ui/chat/chat-box-types.d.ts.map +1 -0
  103. package/dist/ui/chat/chat-box-voice.d.ts +3 -0
  104. package/dist/ui/chat/chat-box-voice.d.ts.map +1 -0
  105. package/dist/ui/chat/components.d.ts +4 -0
  106. package/dist/ui/chat/components.d.ts.map +1 -0
  107. package/dist/ui/chat/panels.d.ts +78 -0
  108. package/dist/ui/chat/panels.d.ts.map +1 -0
  109. package/dist/ui/chat/primitives.d.ts +47 -0
  110. package/dist/ui/chat/primitives.d.ts.map +1 -0
  111. package/dist/ui/chat/utils.d.ts +7 -0
  112. package/dist/ui/chat/utils.d.ts.map +1 -0
  113. package/dist/ui/faces.d.ts +3 -0
  114. package/dist/ui/faces.d.ts.map +1 -0
  115. package/dist/ui/languages.d.ts +10 -0
  116. package/dist/ui/languages.d.ts.map +1 -0
  117. package/dist/ui.cjs +122 -1
  118. package/dist/ui.cjs.map +1 -1
  119. package/dist/ui.d.ts +11 -10
  120. package/dist/ui.d.ts.map +1 -0
  121. package/dist/ui.js +1771 -4
  122. package/dist/ui.js.map +1 -1
  123. package/package.json +33 -5
  124. package/dist/RqmiiCloudAvatarPlayer-BnsY8xIR.js.map +0 -1
  125. package/dist/RqmiiCloudAvatarPlayer-lqCz2xlU.cjs +0 -2938
  126. package/dist/RqmiiCloudAvatarPlayer-lqCz2xlU.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,23 +1,273 @@
1
- import { A as e, C as a, a as m, E as R, R as t, b as A, c as E, S, d as T, u as o, e as q, f as u, g as n, h as r, i as C, j as g, k as l, l as N, m as P } from "./RqmiiCloudAvatarPlayer-BnsY8xIR.js";
1
+ import { u as p, j as R } from "./RqmiiCloudAvatarPlayer-CESlcAGy.js";
2
+ import { A as re, C as se, a as ie, D as oe, b as ae, c as ce, R as ue, d as de, e as le, S as pe, f as me, g as ge, h as fe, i as Se, k as Ee, l as he } from "./RqmiiCloudAvatarPlayer-CESlcAGy.js";
3
+ import { useEffect as P, useRef as S, useState as x, useCallback as l, useMemo as H, Component as z } from "react";
4
+ function J() {
5
+ return p();
6
+ }
7
+ function Q() {
8
+ const e = p();
9
+ return {
10
+ sessionState: e.sessionState,
11
+ isSessionTerminated: e.isSessionTerminated,
12
+ isSessionTerminating: e.isSessionTerminating,
13
+ isAgentThinking: e.isAgentThinking,
14
+ isAgentSpeaking: e.isAgentSpeaking,
15
+ isToolExecuting: e.isToolExecuting
16
+ };
17
+ }
18
+ function W(e) {
19
+ const { attachAudioElement: t, resumeAudioPlayback: n } = p();
20
+ P(() => {
21
+ if (!e?.current) return;
22
+ t(e.current);
23
+ const s = () => {
24
+ n();
25
+ }, a = e.current;
26
+ return a.addEventListener("click", s), a.addEventListener("touchstart", s), () => {
27
+ a.removeEventListener("click", s), a.removeEventListener("touchstart", s), t(null);
28
+ };
29
+ }, [t, e, n]);
30
+ }
31
+ const B = {
32
+ echoCancellation: !0,
33
+ noiseSuppression: !0,
34
+ autoGainControl: !0,
35
+ channelCount: 1,
36
+ sampleRate: 16e3
37
+ }, V = [
38
+ "audio/webm;codecs=opus",
39
+ "audio/webm",
40
+ "audio/mp4"
41
+ ], G = () => typeof window > "u" || !window.MediaRecorder?.isTypeSupported ? "" : V.find((e) => window.MediaRecorder.isTypeSupported(e)) || "";
42
+ function X(e = {}) {
43
+ const {
44
+ onAudioChunk: t,
45
+ onAudioEnd: n,
46
+ onError: s,
47
+ holdDelayMs: a = 220,
48
+ timesliceMs: D = 100,
49
+ interruptOnHoldStart: M = !0,
50
+ audioConstraints: w = B
51
+ } = e, { sendAudioChunk: _, endAudioStream: v, interrupt: q } = p(), u = S(null), c = S(null), o = S(null), O = S(!0), E = S(!1), [b, I] = x(!1), [j, m] = x(!1), [U, h] = x(null), N = l(
52
+ async (r) => {
53
+ if (!r || r.size <= 0) return;
54
+ const i = await r.arrayBuffer();
55
+ if (t) {
56
+ t(i);
57
+ return;
58
+ }
59
+ _(i);
60
+ },
61
+ [t, _]
62
+ ), d = l(() => {
63
+ c.current && (c.current.getTracks().forEach((r) => r.stop()), c.current = null);
64
+ }, []), g = l(
65
+ ({ discard: r = !1 } = {}) => {
66
+ const i = u.current;
67
+ if (!i)
68
+ return E.current = !0, !1;
69
+ if (O.current = !r, u.current = null, i.state === "inactive")
70
+ return r || (n ? n() : v()), d(), m(!1), !0;
71
+ try {
72
+ i.requestData();
73
+ } catch {
74
+ }
75
+ i.onstop = () => {
76
+ O.current && (n ? n() : v()), d(), m(!1);
77
+ };
78
+ try {
79
+ i.stop();
80
+ } catch (T) {
81
+ d(), m(!1), s?.(T);
82
+ }
83
+ return !0;
84
+ },
85
+ [d, v, n, s]
86
+ ), y = l(async () => {
87
+ if (u.current) return !0;
88
+ if (E.current = !1, typeof navigator > "u" || !navigator.mediaDevices?.getUserMedia || typeof window > "u" || typeof window.MediaRecorder > "u") {
89
+ const r = new Error("MediaRecorder or microphone APIs are unavailable in this browser");
90
+ return h(r.message), s?.(r), !1;
91
+ }
92
+ try {
93
+ const r = await navigator.mediaDevices.getUserMedia({ audio: w });
94
+ c.current = r;
95
+ const i = G(), T = i ? { mimeType: i } : void 0, A = new window.MediaRecorder(r, T);
96
+ return A.ondataavailable = (C) => {
97
+ N(C.data);
98
+ }, A.onerror = (C) => {
99
+ const L = C?.error || new Error("Microphone recording failed");
100
+ h(L?.message || "recording_failed"), s?.(L);
101
+ }, u.current = A, m(!0), h(null), A.start(D), E.current && (E.current = !1, g()), !0;
102
+ } catch (r) {
103
+ return d(), m(!1), h("permission_denied"), s?.(r), !1;
104
+ }
105
+ }, [w, d, N, s, D, g]), k = l(() => {
106
+ o.current && (clearTimeout(o.current), o.current = null), I(!0), o.current = setTimeout(() => {
107
+ M && q(), y();
108
+ }, a);
109
+ }, [a, q, M, y]), f = l(() => {
110
+ I(!1), o.current && (clearTimeout(o.current), o.current = null), g();
111
+ }, [g]);
112
+ P(() => () => {
113
+ o.current && (clearTimeout(o.current), o.current = null);
114
+ const r = u.current;
115
+ if (r && (u.current = null, r.state !== "inactive"))
116
+ try {
117
+ r.stop();
118
+ } catch {
119
+ }
120
+ c.current && (c.current.getTracks().forEach((i) => i.stop()), c.current = null);
121
+ }, []);
122
+ const F = H(
123
+ () => ({
124
+ onPointerDown: (r) => {
125
+ r.preventDefault(), k();
126
+ },
127
+ onPointerUp: (r) => {
128
+ r.preventDefault(), f();
129
+ },
130
+ onPointerCancel: (r) => {
131
+ r.preventDefault(), f();
132
+ },
133
+ onPointerLeave: (r) => {
134
+ r.preventDefault(), f();
135
+ }
136
+ }),
137
+ [k, f]
138
+ );
139
+ return {
140
+ isPressing: b,
141
+ isRecording: j,
142
+ micError: U,
143
+ startRecording: y,
144
+ stopRecording: g,
145
+ startPress: k,
146
+ stopPress: f,
147
+ eventHandlers: F
148
+ };
149
+ }
150
+ function Z(e, t, n = []) {
151
+ const { events: s } = p();
152
+ P(() => s.on(e, t), [e, t, s, ...n]);
153
+ }
154
+ function $() {
155
+ const e = p(), t = e.events;
156
+ return {
157
+ state: {
158
+ messages: e.messages,
159
+ connectionState: e.connectionState,
160
+ isConnected: e.isConnected,
161
+ isSessionReady: e.isSessionReady,
162
+ isAudioPlaying: e.isAudioPlaying,
163
+ isAgentThinking: e.isAgentThinking,
164
+ isAgentSpeaking: e.isAgentSpeaking,
165
+ isToolExecuting: e.isToolExecuting,
166
+ isSessionTerminated: e.isSessionTerminated,
167
+ isSessionTerminating: e.isSessionTerminating,
168
+ creditExhausted: e.creditExhausted,
169
+ creditError: e.creditError,
170
+ error: e.error,
171
+ transcript: e.transcript,
172
+ partialTranscript: e.partialTranscript,
173
+ session: e.session,
174
+ sessionState: e.sessionState,
175
+ reconnectAttempt: e.reconnectAttempt
176
+ },
177
+ actions: {
178
+ sendTextMessage: e.sendTextMessage,
179
+ sendAudioChunk: e.sendAudioChunk,
180
+ endAudioStream: e.endAudioStream,
181
+ interrupt: e.interrupt,
182
+ clearSessionHistory: e.clearSessionHistory,
183
+ clearMessages: e.clearMessages,
184
+ changeSessionLanguage: e.changeSessionLanguage,
185
+ signalClientReady: e.signalClientReady,
186
+ initializeSession: e.initializeSession,
187
+ joinDesktopSession: e.joinDesktopSession,
188
+ disconnect: e.disconnect,
189
+ terminateSession: e.terminateSession,
190
+ resumeAudioPlayback: e.resumeAudioPlayback,
191
+ pauseAudioPlayback: e.pauseAudioPlayback,
192
+ attachAudioElement: e.attachAudioElement
193
+ },
194
+ events: {
195
+ onSessionReady: (n) => t.on("session:ready", n),
196
+ onSessionJoined: (n) => t.on("session:joined", n),
197
+ onSessionTerminated: (n) => t.on("session:terminated", n),
198
+ onSessionExpired: (n) => t.on("session:expired", n),
199
+ onMessageReceived: (n) => t.on("message:received", n),
200
+ onMessageSent: (n) => t.on("message:sent", n),
201
+ onAudioPlaying: (n) => t.on("audio:playing", n),
202
+ onAudioStopped: (n) => t.on("audio:stopped", n),
203
+ onAvatarSpeaking: (n) => t.on("avatar:speaking", n),
204
+ onAvatarSpeakingDone: (n) => t.on("avatar:speaking_done", n),
205
+ onStateChanged: (n) => t.on("state:changed", n),
206
+ onConnected: (n) => t.on("connection:connected", n),
207
+ onDisconnected: (n) => t.on("connection:disconnected", n),
208
+ onReconnecting: (n) => t.on("connection:reconnecting", n),
209
+ onConnectionFailed: (n) => t.on("connection:failed", n),
210
+ onError: (n) => t.on("error", n),
211
+ onCreditsExhausted: (n) => t.on("credits:exhausted", n),
212
+ onTranscript: (n) => t.on("transcript", n),
213
+ onPartialTranscript: (n) => t.on("partial_transcript", n),
214
+ onInterrupted: (n) => t.on("interrupted", n)
215
+ },
216
+ raw: {
217
+ socket: e.socket,
218
+ audioElement: e.audioElement
219
+ }
220
+ };
221
+ }
222
+ class ee extends z {
223
+ constructor(t) {
224
+ super(t), this.state = { hasError: !1, error: null };
225
+ }
226
+ static getDerivedStateFromError(t) {
227
+ return { hasError: !0, error: t };
228
+ }
229
+ componentDidCatch(t, n) {
230
+ this.props.onError?.(t, n);
231
+ }
232
+ reset = () => {
233
+ this.setState({ hasError: !1, error: null });
234
+ };
235
+ render() {
236
+ if (this.state.hasError) {
237
+ const { fallback: t } = this.props;
238
+ return t ? typeof t == "function" ? this.state.error ? t(this.state.error, this.reset) : null : t : /* @__PURE__ */ R.jsxs("div", { style: { padding: "24px", textAlign: "center", color: "#ef4444" }, children: [
239
+ /* @__PURE__ */ R.jsx("h3", { children: "Something went wrong" }),
240
+ /* @__PURE__ */ R.jsx("p", { children: this.state.error?.message || "An unexpected error occurred" }),
241
+ /* @__PURE__ */ R.jsx("button", { onClick: this.reset, style: { marginTop: "12px", padding: "8px 16px", cursor: "pointer" }, children: "Try again" })
242
+ ] });
243
+ }
244
+ return this.props.children;
245
+ }
246
+ }
2
247
  export {
3
- e as AGENT_TYPES,
4
- a as CLOUD_STREAM_STATE,
5
- m as CONNECTION_STATE,
6
- R as EpicPixelStreamingPlayer,
7
- t as RqmiiAgentProvider,
8
- A as RqmiiAgentRoom,
9
- E as RqmiiCloudAvatarPlayer,
10
- S as SESSION_STATE,
11
- T as SOCKET_EVENTS,
12
- o as useRqmiiAgent,
13
- q as useRqmiiAgentContext,
14
- u as useRqmiiAudioElement,
15
- n as useRqmiiAvatar,
16
- r as useRqmiiConnection,
17
- C as useRqmiiMessages,
18
- g as useRqmiiPressToTalk,
19
- l as useRqmiiSessionState,
20
- N as useRqmiiVAD,
21
- P as useRqmiiVoice
248
+ re as AGENT_TYPES,
249
+ se as CLOUD_STREAM_STATE,
250
+ ie as CONNECTION_STATE,
251
+ oe as DEFAULT_PCM_OPTIONS,
252
+ ae as DEFAULT_RECONNECT_OPTIONS,
253
+ ce as EventEmitter,
254
+ ue as RqmiiAgentProvider,
255
+ de as RqmiiAgentRoom,
256
+ le as RqmiiCloudAvatarPlayer,
257
+ ee as RqmiiErrorBoundary,
258
+ pe as SESSION_STATE,
259
+ me as SOCKET_EVENTS,
260
+ J as useRqmiiAgent,
261
+ p as useRqmiiAgentContext,
262
+ W as useRqmiiAudioElement,
263
+ ge as useRqmiiAvatar,
264
+ fe as useRqmiiConnection,
265
+ Z as useRqmiiEvents,
266
+ Se as useRqmiiMessages,
267
+ X as useRqmiiPressToTalk,
268
+ $ as useRqmiiSDK,
269
+ Q as useRqmiiSession,
270
+ Ee as useRqmiiVAD,
271
+ he as useRqmiiVoice
22
272
  };
23
273
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/use-rqmii-agent.ts","../src/hooks/use-rqmii-session.ts","../src/hooks/use-rqmii-audio-element.ts","../src/hooks/use-rqmii-press-to-talk.ts","../src/hooks/use-rqmii-events.ts","../src/hooks/use-rqmii-sdk.ts","../src/components/RqmiiErrorBoundary.tsx"],"sourcesContent":["import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAgent() {\n return useRqmiiAgentContext();\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiSession() {\n const ctx = useRqmiiAgentContext();\n return {\n sessionState: ctx.sessionState,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n };\n}\n","import { useEffect } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAudioElement(audioRef: React.RefObject<HTMLAudioElement | null>) {\n const { attachAudioElement, resumeAudioPlayback } = useRqmiiAgentContext();\n\n useEffect(() => {\n if (!audioRef?.current) return undefined;\n\n attachAudioElement(audioRef.current);\n const unlock = () => {\n void resumeAudioPlayback();\n };\n\n const node = audioRef.current;\n node.addEventListener('click', unlock);\n node.addEventListener('touchstart', unlock);\n\n return () => {\n node.removeEventListener('click', unlock);\n node.removeEventListener('touchstart', unlock);\n attachAudioElement(null);\n };\n }, [attachAudioElement, audioRef, resumeAudioPlayback]);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { UseRqmiiPressToTalkOptions, UseRqmiiPressToTalkReturn } from '../types';\n\nconst DEFAULT_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 16000,\n};\n\nconst MEDIA_RECORDER_MIME_TYPES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n];\n\nconst getRecorderMimeType = (): string => {\n if (typeof window === 'undefined' || !window.MediaRecorder?.isTypeSupported) return '';\n return MEDIA_RECORDER_MIME_TYPES.find((type) => window.MediaRecorder.isTypeSupported(type)) || '';\n};\n\nexport function useRqmiiPressToTalk(options: UseRqmiiPressToTalkOptions = {}): UseRqmiiPressToTalkReturn {\n const {\n onAudioChunk,\n onAudioEnd,\n onError,\n holdDelayMs = 220,\n timesliceMs = 100,\n interruptOnHoldStart = true,\n audioConstraints = DEFAULT_AUDIO_CONSTRAINTS,\n } = options;\n\n const { sendAudioChunk, endAudioStream, interrupt } = useRqmiiAgentContext();\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const holdTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const shouldSendAudioEndRef = useRef(true);\n const stopRequestedRef = useRef(false);\n\n const [isPressing, setIsPressing] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [micError, setMicError] = useState<string | null>(null);\n\n const handleChunk = useCallback(\n async (blob: Blob) => {\n if (!blob || blob.size <= 0) return;\n const chunkBuffer = await blob.arrayBuffer();\n if (onAudioChunk) {\n onAudioChunk(chunkBuffer);\n return;\n }\n sendAudioChunk(chunkBuffer);\n },\n [onAudioChunk, sendAudioChunk],\n );\n\n const cleanupStream = useCallback(() => {\n if (!streamRef.current) return;\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }, []);\n\n const stopRecording = useCallback(\n ({ discard = false }: { discard?: boolean } = {}): boolean => {\n const mediaRecorder = mediaRecorderRef.current;\n if (!mediaRecorder) {\n stopRequestedRef.current = true;\n return false;\n }\n\n shouldSendAudioEndRef.current = !discard;\n mediaRecorderRef.current = null;\n\n if (mediaRecorder.state === 'inactive') {\n if (!discard) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n cleanupStream();\n setIsRecording(false);\n return true;\n }\n\n try {\n mediaRecorder.requestData();\n } catch {\n // some browsers throw if requestData is called after stopping\n }\n\n mediaRecorder.onstop = () => {\n const shouldSendEnd = shouldSendAudioEndRef.current;\n if (shouldSendEnd) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n cleanupStream();\n setIsRecording(false);\n };\n\n try {\n mediaRecorder.stop();\n } catch (error) {\n cleanupStream();\n setIsRecording(false);\n onError?.(error);\n }\n\n return true;\n },\n [cleanupStream, endAudioStream, onAudioEnd, onError],\n );\n\n const startRecording = useCallback(async (): Promise<boolean> => {\n if (mediaRecorderRef.current) return true;\n stopRequestedRef.current = false;\n if (\n typeof navigator === 'undefined' ||\n !navigator.mediaDevices?.getUserMedia ||\n typeof window === 'undefined' ||\n typeof window.MediaRecorder === 'undefined'\n ) {\n const error = new Error('MediaRecorder or microphone APIs are unavailable in this browser');\n setMicError(error.message);\n onError?.(error);\n return false;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: audioConstraints });\n streamRef.current = stream;\n\n const mimeType = getRecorderMimeType();\n const recorderOptions = mimeType ? { mimeType } : undefined;\n const mediaRecorder = new window.MediaRecorder(stream, recorderOptions);\n\n mediaRecorder.ondataavailable = (event) => {\n void handleChunk(event.data);\n };\n\n mediaRecorder.onerror = (event) => {\n const error = (event as ErrorEvent)?.error || new Error('Microphone recording failed');\n setMicError((error as Error)?.message || 'recording_failed');\n onError?.(error);\n };\n\n mediaRecorderRef.current = mediaRecorder;\n setIsRecording(true);\n setMicError(null);\n mediaRecorder.start(timesliceMs);\n\n if (stopRequestedRef.current) {\n stopRequestedRef.current = false;\n stopRecording();\n }\n\n return true;\n } catch (error) {\n cleanupStream();\n setIsRecording(false);\n setMicError('permission_denied');\n onError?.(error);\n return false;\n }\n }, [audioConstraints, cleanupStream, handleChunk, onError, timesliceMs, stopRecording]);\n\n const startPress = useCallback(() => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n setIsPressing(true);\n\n holdTimerRef.current = setTimeout(() => {\n if (interruptOnHoldStart) {\n interrupt();\n }\n void startRecording();\n }, holdDelayMs);\n }, [holdDelayMs, interrupt, interruptOnHoldStart, startRecording]);\n\n const stopPress = useCallback(() => {\n setIsPressing(false);\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n stopRecording();\n }, [stopRecording]);\n\n useEffect(() => {\n return () => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n const mr = mediaRecorderRef.current;\n if (mr) {\n mediaRecorderRef.current = null;\n if (mr.state !== 'inactive') {\n try { mr.stop(); } catch { /* ignore */ }\n }\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n };\n }, []);\n\n const eventHandlers = useMemo(\n () => ({\n onPointerDown: (e: React.PointerEvent) => {\n e.preventDefault();\n startPress();\n },\n onPointerUp: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerCancel: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerLeave: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n }),\n [startPress, stopPress],\n );\n\n return {\n isPressing,\n isRecording,\n micError,\n startRecording,\n stopRecording,\n startPress,\n stopPress,\n eventHandlers,\n };\n}\n","import { useEffect } from 'react';\nimport type { EventType, EventHandlerMap } from '../types';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiEvents<T extends EventType>(event: T, handler: EventHandlerMap[T], deps: unknown[] = []) {\n const { events } = useRqmiiAgentContext();\n\n useEffect(() => {\n return events.on(event, handler);\n }, [event, handler, events, ...deps]);\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { EventHandlerMap, RqmiiMessage, RqmiiState, TranscriptPayload, PartialTranscriptPayload, SessionData } from '../types';\n\ntype Listener<T> = (handler: T) => () => void;\n\nexport interface RqmiiEventListeners {\n onSessionReady: Listener<EventHandlerMap['session:ready']>;\n onSessionJoined: Listener<EventHandlerMap['session:joined']>;\n onSessionTerminated: Listener<EventHandlerMap['session:terminated']>;\n onSessionExpired: Listener<EventHandlerMap['session:expired']>;\n onMessageReceived: Listener<EventHandlerMap['message:received']>;\n onMessageSent: Listener<EventHandlerMap['message:sent']>;\n onAudioPlaying: Listener<EventHandlerMap['audio:playing']>;\n onAudioStopped: Listener<EventHandlerMap['audio:stopped']>;\n onAvatarSpeaking: Listener<EventHandlerMap['avatar:speaking']>;\n onAvatarSpeakingDone: Listener<EventHandlerMap['avatar:speaking_done']>;\n onStateChanged: Listener<EventHandlerMap['state:changed']>;\n onConnected: Listener<EventHandlerMap['connection:connected']>;\n onDisconnected: Listener<EventHandlerMap['connection:disconnected']>;\n onReconnecting: Listener<EventHandlerMap['connection:reconnecting']>;\n onConnectionFailed: Listener<EventHandlerMap['connection:failed']>;\n onError: Listener<EventHandlerMap['error']>;\n onCreditsExhausted: Listener<EventHandlerMap['credits:exhausted']>;\n onTranscript: Listener<EventHandlerMap['transcript']>;\n onPartialTranscript: Listener<EventHandlerMap['partial_transcript']>;\n onInterrupted: Listener<EventHandlerMap['interrupted']>;\n}\n\nexport interface RqmiiSDKHandle {\n state: {\n messages: RqmiiMessage[];\n connectionState: RqmiiState['connectionState'];\n isConnected: boolean;\n isSessionReady: boolean;\n isAudioPlaying: boolean;\n isAgentThinking: boolean;\n isAgentSpeaking: boolean;\n isToolExecuting: boolean;\n isSessionTerminated: boolean;\n isSessionTerminating: boolean;\n creditExhausted: boolean;\n creditError: string | null;\n error: string | null;\n transcript: TranscriptPayload | null;\n partialTranscript: PartialTranscriptPayload | null;\n session: RqmiiState['session'];\n sessionState: RqmiiState['sessionState'];\n reconnectAttempt: number;\n };\n actions: {\n sendTextMessage: (text: string) => boolean;\n sendAudioChunk: (audio: unknown) => boolean;\n endAudioStream: () => boolean;\n interrupt: () => boolean;\n clearSessionHistory: () => boolean;\n clearMessages: () => void;\n changeSessionLanguage: (language: string) => boolean;\n signalClientReady: (payload?: Record<string, unknown>) => boolean;\n initializeSession: (opts?: { apiKey?: string; publicChatId?: string; agentId?: string; language?: string }) => Promise<SessionData>;\n joinDesktopSession: (opts: { uniqueId: string; language?: string }) => Promise<SessionData>;\n disconnect: () => void;\n terminateSession: () => Promise<{ success: boolean }>;\n resumeAudioPlayback: () => void;\n pauseAudioPlayback: () => void;\n attachAudioElement: (el: HTMLAudioElement | null) => void;\n };\n events: RqmiiEventListeners;\n raw: {\n socket: ReturnType<typeof import('socket.io-client').io> | null;\n audioElement: HTMLAudioElement | null;\n };\n}\n\nexport function useRqmiiSDK(): RqmiiSDKHandle {\n const ctx = useRqmiiAgentContext();\n const ev = ctx.events;\n\n return {\n state: {\n messages: ctx.messages,\n connectionState: ctx.connectionState,\n isConnected: ctx.isConnected,\n isSessionReady: ctx.isSessionReady,\n isAudioPlaying: ctx.isAudioPlaying,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n creditExhausted: ctx.creditExhausted,\n creditError: ctx.creditError,\n error: ctx.error,\n transcript: ctx.transcript,\n partialTranscript: ctx.partialTranscript,\n session: ctx.session,\n sessionState: ctx.sessionState,\n reconnectAttempt: ctx.reconnectAttempt,\n },\n actions: {\n sendTextMessage: ctx.sendTextMessage,\n sendAudioChunk: ctx.sendAudioChunk,\n endAudioStream: ctx.endAudioStream,\n interrupt: ctx.interrupt,\n clearSessionHistory: ctx.clearSessionHistory,\n clearMessages: ctx.clearMessages,\n changeSessionLanguage: ctx.changeSessionLanguage,\n signalClientReady: ctx.signalClientReady,\n initializeSession: ctx.initializeSession,\n joinDesktopSession: ctx.joinDesktopSession,\n disconnect: ctx.disconnect,\n terminateSession: ctx.terminateSession,\n resumeAudioPlayback: ctx.resumeAudioPlayback,\n pauseAudioPlayback: ctx.pauseAudioPlayback,\n attachAudioElement: ctx.attachAudioElement,\n },\n events: {\n onSessionReady: (h) => ev.on('session:ready', h),\n onSessionJoined: (h) => ev.on('session:joined', h),\n onSessionTerminated: (h) => ev.on('session:terminated', h),\n onSessionExpired: (h) => ev.on('session:expired', h),\n onMessageReceived: (h) => ev.on('message:received', h),\n onMessageSent: (h) => ev.on('message:sent', h),\n onAudioPlaying: (h) => ev.on('audio:playing', h),\n onAudioStopped: (h) => ev.on('audio:stopped', h),\n onAvatarSpeaking: (h) => ev.on('avatar:speaking', h),\n onAvatarSpeakingDone: (h) => ev.on('avatar:speaking_done', h),\n onStateChanged: (h) => ev.on('state:changed', h),\n onConnected: (h) => ev.on('connection:connected', h),\n onDisconnected: (h) => ev.on('connection:disconnected', h),\n onReconnecting: (h) => ev.on('connection:reconnecting', h),\n onConnectionFailed: (h) => ev.on('connection:failed', h),\n onError: (h) => ev.on('error', h),\n onCreditsExhausted: (h) => ev.on('credits:exhausted', h),\n onTranscript: (h) => ev.on('transcript', h),\n onPartialTranscript: (h) => ev.on('partial_transcript', h),\n onInterrupted: (h) => ev.on('interrupted', h),\n },\n raw: {\n socket: ctx.socket,\n audioElement: ctx.audioElement,\n },\n };\n}\n","import React, { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface RqmiiErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface RqmiiErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class RqmiiErrorBoundary extends Component<RqmiiErrorBoundaryProps, RqmiiErrorBoundaryState> {\n constructor(props: RqmiiErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): RqmiiErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback } = this.props;\n if (fallback) {\n if (typeof fallback === 'function') {\n return this.state.error ? fallback(this.state.error, this.reset) : null;\n }\n return fallback;\n }\n return (\n <div style={{ padding: '24px', textAlign: 'center', color: '#ef4444' }}>\n <h3>Something went wrong</h3>\n <p>{this.state.error?.message || 'An unexpected error occurred'}</p>\n <button onClick={this.reset} style={{ marginTop: '12px', padding: '8px 16px', cursor: 'pointer' }}>\n Try again\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n"],"names":["useRqmiiAgent","useRqmiiAgentContext","useRqmiiSession","ctx","useRqmiiAudioElement","audioRef","attachAudioElement","resumeAudioPlayback","useEffect","unlock","node","DEFAULT_AUDIO_CONSTRAINTS","MEDIA_RECORDER_MIME_TYPES","getRecorderMimeType","type","useRqmiiPressToTalk","options","onAudioChunk","onAudioEnd","onError","holdDelayMs","timesliceMs","interruptOnHoldStart","audioConstraints","sendAudioChunk","endAudioStream","interrupt","mediaRecorderRef","useRef","streamRef","holdTimerRef","shouldSendAudioEndRef","stopRequestedRef","isPressing","setIsPressing","useState","isRecording","setIsRecording","micError","setMicError","handleChunk","useCallback","blob","chunkBuffer","cleanupStream","track","stopRecording","discard","mediaRecorder","error","startRecording","stream","mimeType","recorderOptions","event","startPress","stopPress","mr","eventHandlers","useMemo","e","useRqmiiEvents","handler","deps","events","useRqmiiSDK","ev","h","RqmiiErrorBoundary","Component","props","info","fallback","jsxs","jsx"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RqmiiAgentProviderProps, RqmiiAgentContextValue } from '../types';
2
+ export declare function RqmiiAgentProvider({ children, wsUrl, restUrl, reconnectOptions, enableAudio, pcmOptions, debug, heartbeatIntervalSeconds, withCredentials, onSessionExpired, onSessionTerminated, onError, onDisconnect, onReconnectSuccess, onReconnectFailed, }: RqmiiAgentProviderProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare function useRqmiiAgentContext(): RqmiiAgentContextValue;
4
+ //# sourceMappingURL=RqmiiAgentProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RqmiiAgentProvider.d.ts","sourceRoot":"","sources":["../../src/provider/RqmiiAgentProvider.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EAMvB,MAAM,UAAU,CAAC;AAIlB,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,WAAkB,EAClB,UAAU,EACV,KAAa,EACb,wBAA6B,EAC7B,eAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GAClB,EAAE,uBAAuB,2CAiSzB;AAED,wBAAgB,oBAAoB,IAAI,sBAAsB,CAI7D"}
@@ -0,0 +1,77 @@
1
+ import type { Socket } from 'socket.io-client';
2
+ import type { Dispatch } from 'react';
3
+ import type { createResponseChunkAccumulator } from '../core/utils/accumulator';
4
+ import type { RqmiiState, RqmiiReconnectOptions, AgentType } from '../types';
5
+ import type { StateAction } from '../core/state/types';
6
+ interface SocketHandlerDeps {
7
+ socket: Socket;
8
+ dispatch: Dispatch<StateAction>;
9
+ stateRef: {
10
+ current: RqmiiState;
11
+ };
12
+ sessionIdRef: {
13
+ current: string | null;
14
+ };
15
+ sessionAgentTypeRef: {
16
+ current: AgentType | null;
17
+ };
18
+ interruptedRef: {
19
+ current: boolean;
20
+ };
21
+ manualDisconnectRef: {
22
+ current: boolean;
23
+ };
24
+ chunkAccumulatorRef: {
25
+ current: ReturnType<typeof createResponseChunkAccumulator>;
26
+ };
27
+ reconnectMgrRef: {
28
+ current: {
29
+ storeCredential: (p: unknown) => void;
30
+ };
31
+ };
32
+ heartbeatMgrRef: {
33
+ current: {
34
+ start: (s: Socket) => void;
35
+ stop: () => void;
36
+ };
37
+ };
38
+ audioMgrRef: {
39
+ current: {
40
+ feedAudio: (d: Uint8Array) => void;
41
+ requestStop: () => void;
42
+ interruptPlayback: () => void;
43
+ isDestroyed: () => boolean;
44
+ };
45
+ };
46
+ enableAudio: boolean;
47
+ reconnectOptions?: RqmiiReconnectOptions;
48
+ cbRefs: {
49
+ current: {
50
+ onSessionExpired?: (payload?: {
51
+ sessionId?: string;
52
+ message?: string;
53
+ timestamp?: string;
54
+ }) => void;
55
+ onSessionTerminated?: () => void;
56
+ onError?: (payload?: {
57
+ code?: string;
58
+ message?: string;
59
+ detail?: string;
60
+ }) => void;
61
+ onDisconnect?: (reason?: string) => void;
62
+ onReconnectSuccess?: (payload?: {
63
+ sessionId?: string;
64
+ reconnectToken?: string;
65
+ role?: string;
66
+ }) => void;
67
+ onReconnectFailed?: (payload?: {
68
+ code?: string;
69
+ reason?: string;
70
+ }) => void;
71
+ };
72
+ };
73
+ log: (...args: unknown[]) => void;
74
+ }
75
+ export declare function registerSocketHandlers(deps: SocketHandlerDeps): void;
76
+ export {};
77
+ //# sourceMappingURL=socket-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-handlers.d.ts","sourceRoot":"","sources":["../../src/provider/socket-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { Socket } from 'socket.io-client';
2
+ import type { RqmiiReconnectOptions, RqmiiPCMOptions } from '../types';
3
+ interface ManagerLifecycleOptions {
4
+ wsUrl: string;
5
+ restUrl: string;
6
+ reconnectOptions?: RqmiiReconnectOptions;
7
+ enableAudio: boolean;
8
+ pcmOptions?: RqmiiPCMOptions;
9
+ debug: boolean;
10
+ withCredentials: boolean;
11
+ heartbeatIntervalSeconds: number;
12
+ onPlaybackComplete: () => void;
13
+ }
14
+ export declare function useManagerLifecycle(options: ManagerLifecycleOptions): {
15
+ socketMgrRef: import("react").MutableRefObject<{
16
+ connectSocketRaw: ({ authPayload, queryToken }: {
17
+ authPayload: Record<string, unknown>;
18
+ queryToken?: string | null;
19
+ }) => Socket;
20
+ cleanupSocket: () => void;
21
+ getSocket: () => Socket | null;
22
+ } | null>;
23
+ audioMgrRef: import("react").MutableRefObject<{
24
+ ensurePcmPlayer: () => (import("pcm-stream-player").FUPCMPlayer & {
25
+ _isDestroyed: () => boolean;
26
+ }) | null;
27
+ destroyPcmPlayer: () => void;
28
+ feedAudio: (audioData: Uint8Array) => void;
29
+ requestStop: () => void;
30
+ interruptPlayback: () => void;
31
+ pauseAudioPlayback: () => void;
32
+ resumeAudioPlayback: () => Promise<void>;
33
+ attachAudioElement: (element: HTMLAudioElement | null) => void;
34
+ getAudioElement: () => HTMLAudioElement | null;
35
+ isDestroyed: () => boolean;
36
+ } | null>;
37
+ reconnectMgrRef: import("react").MutableRefObject<{
38
+ storeCredential: (payload: unknown) => void;
39
+ getCredential: () => import("../core/managers/reconnect").ReconnectCredential | null;
40
+ clearCredential: () => void;
41
+ tryReconnect: ({ connectSocket, onAttempt, onSuccess, onFailure, isAborted, }: {
42
+ connectSocket: (args: {
43
+ authPayload: Record<string, unknown>;
44
+ expectReconnectSuccess: boolean;
45
+ }) => Promise<unknown>;
46
+ onAttempt?: (attempt: number) => void;
47
+ onSuccess?: () => void;
48
+ onFailure?: (msg: string) => void;
49
+ isAborted?: () => boolean;
50
+ }) => Promise<void>;
51
+ abortReconnect: () => void;
52
+ isReconnecting: () => boolean;
53
+ } | null>;
54
+ sessionMgrRef: import("react").MutableRefObject<{
55
+ initializeSession: ({ apiKey, publicChatId, agentId, userId, language, }?: {
56
+ apiKey?: string;
57
+ publicChatId?: string;
58
+ agentId?: string;
59
+ userId?: string;
60
+ language?: string;
61
+ }) => Promise<Record<string, unknown>>;
62
+ joinDesktopSession: ({ uniqueId, }: {
63
+ uniqueId: string;
64
+ }) => Promise<Record<string, unknown>>;
65
+ } | null>;
66
+ heartbeatMgrRef: import("react").MutableRefObject<{
67
+ start: (socket: {
68
+ emit: (event: string, payload: unknown) => void;
69
+ }) => void;
70
+ stop: () => void;
71
+ isRunning: () => boolean;
72
+ } | null>;
73
+ log: (...args: unknown[]) => void;
74
+ };
75
+ export {};
76
+ //# sourceMappingURL=use-manager-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-manager-lifecycle.d.ts","sourceRoot":"","sources":["../../src/provider/use-manager-lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEvE,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB;;;;sBAhBP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAyBnC,CAAC;qBAA0C,CAAC;qBAClE,CAAC;qBAAsC,CAAC;;;;;;;kBAF7B,CAAC;wBAA0B,CAAC;mBAAqB,CAAC;kBAC9D,CAAC;oBAAsB,CAAC;;;;;;;;;;;;;mBANQ,OAAO,EAAE;EA0C5C"}