@hainiva/agent-sdk 0.0.0-stage → 0.3.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 (119) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +21 -0
  3. package/README.md +278 -2
  4. package/SECURITY.md +33 -0
  5. package/dist/cjs/agent.cjs +320 -0
  6. package/dist/cjs/agent.d.cts +239 -0
  7. package/dist/cjs/calls.cjs +277 -0
  8. package/dist/cjs/calls.d.cts +232 -0
  9. package/dist/cjs/contract.cjs +14 -0
  10. package/dist/cjs/contract.d.cts +225 -0
  11. package/dist/cjs/embed.cjs +253 -0
  12. package/dist/cjs/embed.d.cts +187 -0
  13. package/dist/cjs/emitter.cjs +50 -0
  14. package/dist/cjs/emitter.d.cts +22 -0
  15. package/dist/cjs/errors.cjs +28 -0
  16. package/dist/cjs/errors.d.cts +15 -0
  17. package/dist/cjs/events.cjs +97 -0
  18. package/dist/cjs/events.d.cts +97 -0
  19. package/dist/cjs/index.cjs +72 -0
  20. package/dist/cjs/index.d.cts +28 -0
  21. package/dist/cjs/livekit.cjs +56 -0
  22. package/dist/cjs/livekit.d.cts +35 -0
  23. package/dist/cjs/log.cjs +15 -0
  24. package/dist/cjs/log.d.cts +5 -0
  25. package/dist/cjs/react-native.cjs +32 -0
  26. package/dist/cjs/react-native.d.cts +39 -0
  27. package/dist/cjs/reactNativeDesk.cjs +107 -0
  28. package/dist/cjs/reactNativeDesk.d.cts +53 -0
  29. package/dist/cjs/redact.cjs +71 -0
  30. package/dist/cjs/redact.d.cts +21 -0
  31. package/dist/cjs/rest.cjs +286 -0
  32. package/dist/cjs/rest.d.cts +172 -0
  33. package/dist/cjs/session.cjs +159 -0
  34. package/dist/cjs/session.d.cts +101 -0
  35. package/dist/cjs/singleFlight.cjs +49 -0
  36. package/dist/cjs/singleFlight.d.cts +32 -0
  37. package/dist/cjs/url.cjs +39 -0
  38. package/dist/cjs/url.d.cts +13 -0
  39. package/dist/cjs/web.cjs +28 -0
  40. package/dist/cjs/web.d.cts +23 -0
  41. package/dist/cjs/ws.cjs +246 -0
  42. package/dist/cjs/ws.d.cts +134 -0
  43. package/dist/esm/agent.d.ts +240 -0
  44. package/dist/esm/agent.d.ts.map +1 -0
  45. package/dist/esm/agent.js +317 -0
  46. package/dist/esm/agent.js.map +1 -0
  47. package/dist/esm/calls.d.ts +233 -0
  48. package/dist/esm/calls.d.ts.map +1 -0
  49. package/dist/esm/calls.js +271 -0
  50. package/dist/esm/calls.js.map +1 -0
  51. package/dist/esm/contract.d.ts +226 -0
  52. package/dist/esm/contract.d.ts.map +1 -0
  53. package/dist/esm/contract.js +12 -0
  54. package/dist/esm/contract.js.map +1 -0
  55. package/dist/esm/embed.d.ts +188 -0
  56. package/dist/esm/embed.d.ts.map +1 -0
  57. package/dist/esm/embed.js +247 -0
  58. package/dist/esm/embed.js.map +1 -0
  59. package/dist/esm/emitter.d.ts +23 -0
  60. package/dist/esm/emitter.d.ts.map +1 -0
  61. package/dist/esm/emitter.js +47 -0
  62. package/dist/esm/emitter.js.map +1 -0
  63. package/dist/esm/errors.d.ts +16 -0
  64. package/dist/esm/errors.d.ts.map +1 -0
  65. package/dist/esm/errors.js +25 -0
  66. package/dist/esm/errors.js.map +1 -0
  67. package/dist/esm/events.d.ts +98 -0
  68. package/dist/esm/events.d.ts.map +1 -0
  69. package/dist/esm/events.js +90 -0
  70. package/dist/esm/events.js.map +1 -0
  71. package/dist/esm/index.d.ts +29 -0
  72. package/dist/esm/index.d.ts.map +1 -0
  73. package/dist/esm/index.js +29 -0
  74. package/dist/esm/index.js.map +1 -0
  75. package/dist/esm/livekit.d.ts +36 -0
  76. package/dist/esm/livekit.d.ts.map +1 -0
  77. package/dist/esm/livekit.js +54 -0
  78. package/dist/esm/livekit.js.map +1 -0
  79. package/dist/esm/log.d.ts +6 -0
  80. package/dist/esm/log.d.ts.map +1 -0
  81. package/dist/esm/log.js +13 -0
  82. package/dist/esm/log.js.map +1 -0
  83. package/dist/esm/react-native.d.ts +40 -0
  84. package/dist/esm/react-native.d.ts.map +1 -0
  85. package/dist/esm/react-native.js +26 -0
  86. package/dist/esm/react-native.js.map +1 -0
  87. package/dist/esm/reactNativeDesk.d.ts +54 -0
  88. package/dist/esm/reactNativeDesk.d.ts.map +1 -0
  89. package/dist/esm/reactNativeDesk.js +103 -0
  90. package/dist/esm/reactNativeDesk.js.map +1 -0
  91. package/dist/esm/redact.d.ts +22 -0
  92. package/dist/esm/redact.d.ts.map +1 -0
  93. package/dist/esm/redact.js +66 -0
  94. package/dist/esm/redact.js.map +1 -0
  95. package/dist/esm/rest.d.ts +173 -0
  96. package/dist/esm/rest.d.ts.map +1 -0
  97. package/dist/esm/rest.js +281 -0
  98. package/dist/esm/rest.js.map +1 -0
  99. package/dist/esm/session.d.ts +102 -0
  100. package/dist/esm/session.d.ts.map +1 -0
  101. package/dist/esm/session.js +155 -0
  102. package/dist/esm/session.js.map +1 -0
  103. package/dist/esm/singleFlight.d.ts +33 -0
  104. package/dist/esm/singleFlight.d.ts.map +1 -0
  105. package/dist/esm/singleFlight.js +46 -0
  106. package/dist/esm/singleFlight.js.map +1 -0
  107. package/dist/esm/url.d.ts +14 -0
  108. package/dist/esm/url.d.ts.map +1 -0
  109. package/dist/esm/url.js +37 -0
  110. package/dist/esm/url.js.map +1 -0
  111. package/dist/esm/web.d.ts +24 -0
  112. package/dist/esm/web.d.ts.map +1 -0
  113. package/dist/esm/web.js +23 -0
  114. package/dist/esm/web.js.map +1 -0
  115. package/dist/esm/ws.d.ts +135 -0
  116. package/dist/esm/ws.d.ts.map +1 -0
  117. package/dist/esm/ws.js +242 -0
  118. package/dist/esm/ws.js.map +1 -0
  119. package/package.json +117 -4
@@ -0,0 +1,317 @@
1
+ /**
2
+ * HainivaAgent — one object for a staff member's app: sign-in with your
3
+ * backend's assertion, the REST API, the live event socket and the agent's
4
+ * calls, wired together.
5
+ *
6
+ * const agent = new HainivaAgent({ baseUrl, tenantId, getAssertion, media: joinCallRoom });
7
+ * agent.on("call.ringing", (r) => showRing(r));
8
+ * await agent.connect();
9
+ * await agent.calls.accept(callId); // answers, then joins the room with `media`
10
+ *
11
+ * Transport-agnostic: LiveKit, the DOM and React Native come in through options
12
+ * (`media`, `WebSocket`, `store`), so the core runs in Node too.
13
+ */
14
+ import { CallStore } from "./calls.js";
15
+ import { TypedEmitter } from "./emitter.js";
16
+ import { HainivaAgentError } from "./errors.js";
17
+ import { agentSocketBindings, isEventFrame, isKnownEvent, toCallEvents } from "./events.js";
18
+ import { safeLogger } from "./log.js";
19
+ import { Redactor } from "./redact.js";
20
+ import { AgentRestClient } from "./rest.js";
21
+ import { SessionManager } from "./session.js";
22
+ import { ReconnectingSocket } from "./ws.js";
23
+ /**
24
+ * The staff member's app: session, REST, socket and calls.
25
+ */
26
+ export class HainivaAgent {
27
+ constructor(o) {
28
+ this.o = o;
29
+ this.socket = null;
30
+ this.meDto = null;
31
+ this.media = new Map();
32
+ this.offs = [];
33
+ this.desk = {
34
+ /** A desk token for the embedded desk (`@hainiva/agent-sdk/embed` mountDesk / `<HainivaDesk/>` call this). */
35
+ session: () => this.guard(this.rest.deskSession()),
36
+ };
37
+ this.rings = {
38
+ /** Rings waiting for you now (also fed into the call state). */
39
+ pending: () => this.syncRings(),
40
+ };
41
+ this.calls = {
42
+ /**
43
+ * Answer: the server's answer race decides (409 = someone else was
44
+ * faster). With `media`, joins the room and returns the session.
45
+ */
46
+ accept: async (callId, ring) => {
47
+ const known = this.callStore.state.calls[callId];
48
+ if (!known || known.phase === "ended") {
49
+ // Answered from a push (CallKit / the Android call notification) before
50
+ // the socket told us about the ring: the state machine learns it now.
51
+ this.callStore.dispatch({ type: "ring", call: {
52
+ id: callId, direction: "inbound", path: "queue", from: ring?.from ?? "",
53
+ ...(ring?.conversationId ? { conversationId: ring.conversationId } : {}), expiresAt: Date.now() + this.ringMs,
54
+ } });
55
+ }
56
+ this.callStore.dispatch({ type: "accept", id: callId });
57
+ let accepted;
58
+ try {
59
+ accepted = await this.guard(this.rest.acceptCall(callId));
60
+ }
61
+ catch (e) {
62
+ const err = HainivaAgentError.from(e, "accept_failed", this.redactor);
63
+ const reason = err.status === 409 ? "answered_elsewhere" : err.status === 404 || err.code === "call_ended" ? "gone" : "failed";
64
+ this.callStore.dispatch({ type: "accept_failed", id: callId, reason, error: err.code });
65
+ throw err;
66
+ }
67
+ if (!accepted.media || !this.o.media) {
68
+ this.callStore.dispatch({ type: "connected", id: callId, answered: true });
69
+ return { accepted, media: null };
70
+ }
71
+ const media = await this.joinMedia(callId, accepted.media);
72
+ return { accepted, media };
73
+ },
74
+ decline: async (callId) => {
75
+ this.callStore.dispatch({ type: "decline", id: callId });
76
+ return this.guard(this.rest.declineCall(callId));
77
+ },
78
+ /** Hang up here: media is left at once, then the server ends the call. */
79
+ end: async (callId) => {
80
+ this.callStore.dispatch({ type: "hang_up", id: callId });
81
+ return this.guard(this.rest.endCall(callId));
82
+ },
83
+ hold: async (callId, on) => {
84
+ const r = await this.guard(this.rest.holdCall(callId, on));
85
+ this.callStore.dispatch(on ? { type: "hold", id: callId } : { type: "resume", id: callId });
86
+ return r;
87
+ },
88
+ mute: async (callId, muted) => {
89
+ await this.media.get(callId)?.setMuted(muted);
90
+ this.callStore.dispatch({ type: "mute", id: callId, muted });
91
+ },
92
+ /** Warm or blind to a colleague, to a queue (always blind), or to a phone number. */
93
+ transfer: async (callId, target, mode = "warm") => {
94
+ this.callStore.dispatch({ type: "transfer_start", id: callId, mode, target });
95
+ try {
96
+ return await this.guard(this.rest.transferCall(callId, target.kind === "agent" ? { agentId: target.agentId, mode } : target.kind === "queue" ? { queueId: target.queueId } : { number: target.number, mode }));
97
+ }
98
+ catch (e) {
99
+ this.callStore.dispatch({ type: "transfer_cancelled", id: callId, notice: "transfer_failed" });
100
+ throw e;
101
+ }
102
+ },
103
+ get: (callId) => this.guard(this.rest.getCall(callId)),
104
+ };
105
+ this.conversations = {
106
+ list: (q) => this.guard(this.rest.listConversations(q)),
107
+ get: (id) => this.guard(this.rest.getConversation(id)),
108
+ /** Take it yourself (no agentId) or, a supervisor, give it to a colleague. */
109
+ assign: (id, agentId) => this.guard(this.rest.assignConversation(id, agentId)),
110
+ release: (id, note) => this.guard(this.rest.releaseConversation(id, note)),
111
+ transfer: (id, to) => this.guard(this.rest.transferConversation(id, to)),
112
+ close: (id) => this.guard(this.rest.closeConversation(id)),
113
+ };
114
+ this.messages = {
115
+ list: (conversationId, q) => this.guard(this.rest.listMessages(conversationId, q)),
116
+ send: (conversationId, text) => this.guard(this.rest.sendMessage(conversationId, text)),
117
+ typing: (conversationId) => this.guard(this.rest.typing(conversationId)),
118
+ };
119
+ this.supervisor = {
120
+ liveCalls: () => this.guard(this.rest.liveCalls()),
121
+ agents: () => this.guard(this.rest.teamAgents()),
122
+ /** Listen in (monitor), coach the agent (whisper) or join the call (barge). Join `media` with your adapter. */
123
+ supervise: (callId, mode = "monitor") => this.guard(this.rest.supervise(callId, mode)),
124
+ setMode: (callId, mode, supervisorTrackSid) => this.guard(this.rest.setSuperviseMode(callId, mode, supervisorTrackSid)),
125
+ };
126
+ this.push = {
127
+ /** Register this device's FCM token (Android) or PushKit/APNs token (iPhone) for YOUR app's credentials. */
128
+ register: (sub) => this.guard(this.rest.registerPush(sub)),
129
+ unregister: (token) => this.guard(this.rest.unregisterPush(token)),
130
+ };
131
+ this.redactor = new Redactor();
132
+ this.log = safeLogger(o.log, this.redactor);
133
+ this.events = new TypedEmitter((e) => this.log("listener_error", e));
134
+ this.ringMs = o.ringTimeoutMs ?? 60000;
135
+ this.rest = new AgentRestClient({
136
+ baseUrl: o.baseUrl, tenantId: o.tenantId, redactor: this.redactor,
137
+ ...(o.fetch ? { fetch: o.fetch } : {}), ...(o.timeoutMs ? { timeoutMs: o.timeoutMs } : {}),
138
+ ...(o.device ? { device: o.device } : {}), ...(o.log ? { log: o.log } : {}),
139
+ ...(o.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {}),
140
+ });
141
+ this.session = new SessionManager({
142
+ getAssertion: o.getAssertion, transport: this.rest.sessions, redactor: this.redactor,
143
+ ...(o.store ? { store: o.store } : {}), ...(o.log ? { log: o.log } : {}),
144
+ });
145
+ this.rest.useTokens(this.session);
146
+ this.callStore = new CallStore();
147
+ this.callStore.events.on("change", (s) => this.events.emit("calls", s));
148
+ this.callStore.events.on("effect", (e) => this.onEffect(e));
149
+ }
150
+ /** The signed-in member (after connect()). */
151
+ get me() { return this.meDto; }
152
+ /** The calls now (the state machine): ringing, connecting, active, held, ended. */
153
+ get callsState() { return this.callStore.state; }
154
+ get connection() { return this.socket?.state ?? "idle"; }
155
+ on(event, fn) {
156
+ return this.events.on(event, fn);
157
+ }
158
+ /** Sign in (or restore the stored session), load who you are and the rings waiting, open the event socket. */
159
+ async connect() {
160
+ await this.session.signIn();
161
+ this.meDto = await this.guard(this.rest.me());
162
+ if (!this.socket)
163
+ this.openSocket();
164
+ this.socket.connect();
165
+ await this.syncRings().catch((e) => this.log("pending_rings_failed", e));
166
+ return this.meDto;
167
+ }
168
+ /**
169
+ * Close the socket and leave every call's media. `signOut: true` also ends
170
+ * the session on the server (and removes it from the store) — do that when
171
+ * the staff member signs out; unregister this device's push first.
172
+ */
173
+ async disconnect(opts = {}) {
174
+ this.socket?.disconnect();
175
+ this.socket = null;
176
+ for (const off of this.offs.splice(0))
177
+ off();
178
+ await Promise.all([...this.media.values()].map((m) => m.leave().catch(() => undefined)));
179
+ this.media.clear();
180
+ if (opts.signOut)
181
+ await this.session.signOut();
182
+ }
183
+ setStatus(status, o) { return this.guard(this.rest.setStatus(status, o)); }
184
+ /** Join (or re-join) a call's media room. Without credentials, a fresh LiveKit token is minted. */
185
+ async joinMedia(callId, creds) {
186
+ if (!this.o.media)
187
+ throw new HainivaAgentError(0, "no_media_adapter", { hint: "pass options.media = joinCallRoom from @hainiva/agent-sdk/web or /react-native" });
188
+ const c = creds ?? await this.guard(this.rest.mediaToken(callId));
189
+ this.redactor.add(c.token);
190
+ const previous = this.media.get(callId);
191
+ if (previous)
192
+ await previous.leave().catch(() => undefined);
193
+ let m;
194
+ try {
195
+ m = await this.o.media({ url: c.livekitUrl, token: c.token });
196
+ }
197
+ catch (e) {
198
+ this.callStore.dispatch({ type: "accept_failed", id: callId, reason: "failed", error: "media_connect_failed" });
199
+ throw HainivaAgentError.from(e, "media_connect_failed", this.redactor);
200
+ }
201
+ this.media.set(callId, m);
202
+ m.onDisconnected(() => {
203
+ if (this.media.get(callId) !== m)
204
+ return;
205
+ this.media.delete(callId);
206
+ this.callStore.dispatch({ type: "remote_end", id: callId });
207
+ });
208
+ // Media that comes up after the caller hung up is left at once (the machine's media.leave effect).
209
+ this.callStore.dispatch({ type: "connected", id: callId, answered: true });
210
+ return m;
211
+ }
212
+ /** After a call: a disposition code from dispositions() and notes. */
213
+ wrapUp(callId, w = {}) { return this.guard(this.rest.wrapUp(callId, w)); }
214
+ dispositions(channel) { return this.guard(this.rest.dispositions(channel)); }
215
+ // ── Internals ───────────────────────────────────────────────────────────────
216
+ /** A REST call; a final 401 session_revoked tells the app and forgets the session. */
217
+ async guard(p) {
218
+ try {
219
+ return await p;
220
+ }
221
+ catch (e) {
222
+ if (e instanceof HainivaAgentError && e.status === 401 && e.code === "session_revoked")
223
+ await this.onRevoked("session_revoked");
224
+ throw e;
225
+ }
226
+ }
227
+ async onRevoked(reason) {
228
+ this.socket?.disconnect();
229
+ this.socket = null;
230
+ await this.session.clear();
231
+ this.events.emit("revoked", { reason });
232
+ }
233
+ openSocket() {
234
+ let sock;
235
+ sock = new ReconnectingSocket({
236
+ url: this.rest.wsUrl,
237
+ getToken: () => this.session.accessToken(),
238
+ onTokenRejected: () => this.session.invalidate(),
239
+ redactor: this.redactor,
240
+ ...(this.o.WebSocket ? { WebSocket: this.o.WebSocket } : {}),
241
+ ...(this.o.log ? { log: this.o.log } : {}),
242
+ ...(this.o.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {}),
243
+ ...agentSocketBindings(() => sock.lastSeq),
244
+ });
245
+ this.socket = sock;
246
+ this.offs.push(sock.events.on("state", (s) => this.events.emit("connection", s)), sock.events.on("error", (e) => this.events.emit("error", e)), sock.events.on("revoked", () => { void this.onRevoked("socket_revoked"); }), sock.events.on("ready", (f) => {
247
+ const seq = f.type === "ready" && typeof f.seq === "number" ? f.seq : 0;
248
+ // A first connect starts at the server's newest event: old rings are not replayed.
249
+ if (sock.lastSeq === 0 && seq > 0)
250
+ sock.setLastSeq(seq);
251
+ this.events.emit("ready", { seq });
252
+ }), sock.events.on("frame", (f) => this.onFrame(sock, f)), this.session.events.on("token", (t) => { sock.updateToken(t); }));
253
+ }
254
+ onFrame(sock, f) {
255
+ switch (f.type) {
256
+ case "event": {
257
+ if (!isEventFrame(f))
258
+ return;
259
+ for (const ev of toCallEvents(f, this.callStore.state, Date.now(), this.ringMs))
260
+ this.callStore.dispatch(ev);
261
+ if (isKnownEvent(f.event))
262
+ this.events.emit(f.event, f.data);
263
+ else
264
+ this.events.emit("event.unknown", f);
265
+ return;
266
+ }
267
+ case "resync_required": {
268
+ const from = typeof f.fromSeq === "number" && f.fromSeq >= 0 ? f.fromSeq : 0;
269
+ sock.setLastSeq(from);
270
+ void this.syncRings().catch((e) => this.log("pending_rings_failed", e));
271
+ this.events.emit("resync", { fromSeq: from });
272
+ return;
273
+ }
274
+ case "session.expiring":
275
+ this.events.emit("session.expiring", { expiresAt: String(f.expiresAt ?? "") });
276
+ // The server's clock decides: refresh now even if ours thinks there is time.
277
+ // Refreshing emits "token", which hands the new token to this socket (token.refresh).
278
+ this.session.invalidate(this.session.current?.accessToken);
279
+ void this.session.accessToken().catch((e) => this.log("refresh_failed", e));
280
+ return;
281
+ case "ack":
282
+ if (!f.ok)
283
+ this.log("socket_ack_refused", { error: f.error });
284
+ return;
285
+ default:
286
+ return;
287
+ }
288
+ }
289
+ /** Rings waiting on the server → the call state (a cold start, a missed push, a resync). */
290
+ async syncRings() {
291
+ const rings = await this.guard(this.rest.pendingRings());
292
+ const now = Date.now();
293
+ for (const r of rings) {
294
+ if (!r || typeof r.callId !== "string")
295
+ continue;
296
+ this.callStore.dispatch({
297
+ type: "ring",
298
+ call: {
299
+ id: r.callId, conversationId: r.conversationId, direction: "inbound",
300
+ path: r.path === "direct" ? "direct" : "queue",
301
+ from: r.contactName ?? r.callerNumber ?? "", expiresAt: now + this.ringMs,
302
+ },
303
+ });
304
+ }
305
+ return rings;
306
+ }
307
+ onEffect(e) {
308
+ if (e.type === "media.leave") {
309
+ const m = this.media.get(e.id);
310
+ this.media.delete(e.id);
311
+ if (m)
312
+ void m.leave().catch(() => undefined);
313
+ }
314
+ this.events.emit("callEffect", e);
315
+ }
316
+ }
317
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAyD,MAAM,YAAY,CAAC;AAM9F,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAsE,MAAM,aAAa,CAAC;AAChK,OAAO,EAAE,UAAU,EAAe,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAA4F,MAAM,WAAW,CAAC;AACtI,OAAO,EAAE,cAAc,EAA2D,MAAM,cAAc,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAA4C,MAAM,SAAS,CAAC;AA8DvF;;GAEG;AACH,MAAM,OAAO,YAAY;IAavB,YAA6B,CAAsB;QAAtB,MAAC,GAAD,CAAC,CAAqB;QAR3C,WAAM,GAAkE,IAAI,CAAC;QAC7E,UAAK,GAAsB,IAAI,CAAC;QACvB,UAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;QACxC,SAAI,GAAmB,EAAE,CAAC;QA8DlC,SAAI,GAAG;YACd,8GAA8G;YAC9G,OAAO,EAAE,GAAiC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACjF,CAAC;QAEO,UAAK,GAAG;YACf,gEAAgE;YAChE,OAAO,EAAE,GAA4B,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;SACzD,CAAC;QAEO,UAAK,GAAG;YACf;;;eAGG;YACH,MAAM,EAAE,KAAK,EAAE,MAAc,EAAE,IAAiD,EAAqE,EAAE;gBACrJ,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;oBACtC,wEAAwE;oBACxE,sEAAsE;oBACtE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;4BAC5C,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;4BACvE,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM;yBAC9G,EAAE,CAAC,CAAC;gBACP,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxD,IAAI,QAAwB,CAAC;gBAC7B,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC/H,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBACxF,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACrC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBACnC,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC3D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC7B,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;gBAChC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,0EAA0E;YAC1E,GAAG,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;gBAC5B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,EAAW,EAAE,EAAE;gBAC1C,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5F,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,KAAc,EAAE,EAAE;gBAC7C,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,qFAAqF;YACrF,QAAQ,EAAE,KAAK,EAAE,MAAc,EAAE,MAAsB,EAAE,OAAyB,MAAM,EAAE,EAAE;gBAC1F,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC;oBACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EACnD,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5J,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBAC/F,MAAM,CAAC,CAAC;gBACV,CAAC;YACH,CAAC;YACD,GAAG,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAC/D,CAAC;QA2BO,kBAAa,GAAG;YACvB,IAAI,EAAE,CAAC,CAAyB,EAA4C,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACzH,GAAG,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC9D,8EAA8E;YAC9E,MAAM,EAAE,CAAC,EAAU,EAAE,OAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/F,OAAO,EAAE,CAAC,EAAU,EAAE,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3F,QAAQ,EAAE,CAAC,EAAU,EAAE,EAA4D,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1I,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;SACnE,CAAC;QAEO,aAAQ,GAAG;YAClB,IAAI,EAAE,CAAC,cAAsB,EAAE,CAAsC,EAAuC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YACpK,IAAI,EAAE,CAAC,cAAsB,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACvG,MAAM,EAAE,CAAC,cAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;SACjF,CAAC;QAMO,eAAU,GAAG;YACpB,SAAS,EAAE,GAAqC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpF,MAAM,EAAE,GAAkC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/E,+GAA+G;YAC/G,SAAS,EAAE,CAAC,MAAc,EAAE,OAAwC,SAAS,EAAmC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAChK,OAAO,EAAE,CAAC,MAAc,EAAE,IAAqC,EAAE,kBAA2B,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;SAC1K,CAAC;QAEO,SAAI,GAAG;YACd,4GAA4G;YAC5G,QAAQ,EAAE,CAAC,GAA+B,EAAqC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzH,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;SAC3E,CAAC;QA3LA,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,KAAM,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC;YAC9B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACjE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1F,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC;YAChC,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACpF,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,8CAA8C;IAC9C,IAAI,EAAE,KAAwB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,mFAAmF;IACnF,IAAI,UAAU,KAAiB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,UAAU,KAAsB,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC;IAE1E,EAAE,CAAqC,KAAQ,EAAE,EAA4C;QAC3F,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,8GAA8G;IAC9G,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAA8B,EAAE;QAC/C,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,GAAG,EAAE,CAAC;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,MAAmB,EAAE,CAAkB,IAAsC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IA4E3I,mGAAmG;IACnG,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,KAAwB;QACtD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;YAAE,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,gFAAgF,EAAE,CAAC,CAAC;QAClK,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAe,CAAC;QACpB,IAAI,CAAC;YACH,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAChH,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE;YACpB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO;YACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,mGAAmG;QACnG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IAkBD,sEAAsE;IACtE,MAAM,CAAC,MAAc,EAAE,IAAkD,EAAE,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChI,YAAY,CAAC,OAAgB,IAAoC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAgBtH,+EAA+E;IAE/E,sFAAsF;IAC9E,KAAK,CAAC,KAAK,CAAI,CAAa;QAClC,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,CAAC;QAAC,CAAC;QACvB,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,iBAAiB,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;gBAAE,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAChI,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAAc;QACpC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,UAAU;QAChB,IAAI,IAA4D,CAAC;QACjE,IAAI,GAAG,IAAI,kBAAkB,CAAqC;YAChE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YAC1C,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAChD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;SAC3C,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EACjE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAC5D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,mFAAmF;YACnF,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EACF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjE,CAAC;IACJ,CAAC;IAEO,OAAO,CAAC,IAA4D,EAAE,CAAmB;QAC/F,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;oBAAE,OAAO;gBAC7B,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7G,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAG,IAAI,CAAC,MAAM,CAAC,IAAwC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;;oBAC7F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YACD,KAAK,kBAAkB;gBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/E,6EAA6E;gBAC7E,sFAAsF;gBACtF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAC3D,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5E,OAAO;YACT,KAAK,KAAK;gBACR,IAAI,CAAC,CAAC,CAAC,EAAE;oBAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC9D,OAAO;YACT;gBACE,OAAO;QACX,CAAC;IACH,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,SAAS;QACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACjD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACtB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACJ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS;oBACpE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;oBAC9C,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM;iBAC1E;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,QAAQ,CAAC,CAAa;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC;gBAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,233 @@
1
+ import { TypedEmitter } from "./emitter.js";
2
+ /**
3
+ * The agent's calls as a pure state machine — ported from the HAINIVA Agent app
4
+ * (apps/agent-mobile/src/calls.ts), without React Native, LiveKit or HTTP: the
5
+ * host feeds it events (a ring push, the user's answer, "media connected", the
6
+ * server's cancel…) and acts on the effects it returns (stop the native ring,
7
+ * leave the room). Same rules as the app:
8
+ *
9
+ * - one call at a time: a ring while on a call is turned away ("busy"), and
10
+ * answering one ring turns away the others;
11
+ * - a ring ends at its expiresAt ("missed"), when declined, or when the server
12
+ * cancels it (taken elsewhere, caller gone);
13
+ * - while answering, "taken elsewhere" is ignored (the server's answer race
14
+ * decides, via accept_failed) but the caller hanging up ends it, and media
15
+ * that connects after that is left at once;
16
+ * - hold, mute and warm/blind transfer as on the desk.
17
+ *
18
+ * ringing ──accept──▶ connecting ──connected──▶ active ⇄ held
19
+ * │ │ │ └─transfer_start─▶ transferring
20
+ * ├─decline/expire/ └─accept_failed/ │ │
21
+ * │ ring_cancelled remote_end/hang_up └─remote_end/hang_up ├─transfer_completed
22
+ * ▼ ▼ ▼ ▼
23
+ * ended ◀──────────────────────────────────────────────────────────── ended
24
+ */
25
+ export type CallDirection = "inbound" | "outbound";
26
+ /** direct / queue: a ring; transfer: a colleague's transfer invite; out: placed here. */
27
+ export type CallPath = "direct" | "queue" | "transfer" | "out";
28
+ export interface CallInfo {
29
+ /** The interaction id (or a client id for an outgoing call until the server's arrives). */
30
+ id: string;
31
+ conversationId?: string;
32
+ direction: CallDirection;
33
+ path: CallPath;
34
+ /** Caller (inbound) or callee (outbound) as shown. */
35
+ from: string;
36
+ line?: string;
37
+ /** Epoch ms when an unanswered ring ends. */
38
+ expiresAt?: number;
39
+ /** A transfer invite: how the colleague is handing it over. */
40
+ transfer?: {
41
+ mode: "warm" | "blind";
42
+ };
43
+ }
44
+ export type CallPhase = "ringing" | "connecting" | "active" | "held" | "transferring" | "ended";
45
+ export type EndReason = "declined" | "missed" | "answered_elsewhere" | "remote_ended" | "hung_up" | "transferred" | "busy" | "failed" | "cancelled";
46
+ export type TransferTarget = {
47
+ kind: "agent";
48
+ agentId: string;
49
+ name: string;
50
+ } | {
51
+ kind: "queue";
52
+ queueId: string;
53
+ name: string;
54
+ } | {
55
+ kind: "external";
56
+ number: string;
57
+ };
58
+ export interface TransferState {
59
+ mode: "warm" | "blind";
60
+ target: TransferTarget;
61
+ /** Warm: the colleague / number is in the call. */
62
+ joined: boolean;
63
+ startedAt: number;
64
+ /** Where a cancelled transfer returns to. */
65
+ resumeTo: "active" | "held";
66
+ }
67
+ export interface Call {
68
+ readonly info: CallInfo;
69
+ readonly phase: CallPhase;
70
+ readonly muted: boolean;
71
+ /** When talking started; null while an outgoing call still rings at the far end. */
72
+ readonly since: number | null;
73
+ readonly ringingSince: number | null;
74
+ readonly transfer: TransferState | null;
75
+ /** A short note for the UI (e.g. "colleague left"). */
76
+ readonly notice: string | null;
77
+ readonly endReason: EndReason | null;
78
+ readonly endedAt: number | null;
79
+ readonly error: string | null;
80
+ }
81
+ export interface CallsState {
82
+ readonly calls: Readonly<Record<string, Call>>;
83
+ /** The call that holds the line (connecting, active, held, transferring), if any. */
84
+ readonly activeId: string | null;
85
+ }
86
+ export declare const initialCallsState: CallsState;
87
+ export type CallEvent = {
88
+ type: "ring";
89
+ call: CallInfo;
90
+ at: number;
91
+ } | {
92
+ type: "dial";
93
+ call: CallInfo;
94
+ at: number;
95
+ } | {
96
+ type: "accept";
97
+ id: string;
98
+ at: number;
99
+ } | {
100
+ type: "decline";
101
+ id: string;
102
+ at: number;
103
+ } | {
104
+ type: "expire";
105
+ id: string;
106
+ at: number;
107
+ } | {
108
+ type: "ring_cancelled";
109
+ id: string;
110
+ reason: "answered_elsewhere" | "remote_ended" | "cancelled";
111
+ at: number;
112
+ } | {
113
+ type: "accept_failed";
114
+ id: string;
115
+ reason: "answered_elsewhere" | "gone" | "failed";
116
+ error?: string;
117
+ at: number;
118
+ } | {
119
+ type: "connected";
120
+ id: string;
121
+ answered: boolean;
122
+ at: number;
123
+ } | {
124
+ type: "answered";
125
+ id: string;
126
+ at: number;
127
+ } | {
128
+ type: "mute";
129
+ id: string;
130
+ muted: boolean;
131
+ } | {
132
+ type: "hold";
133
+ id: string;
134
+ } | {
135
+ type: "resume";
136
+ id: string;
137
+ } | {
138
+ type: "transfer_start";
139
+ id: string;
140
+ mode: "warm" | "blind";
141
+ target: TransferTarget;
142
+ at: number;
143
+ } | {
144
+ type: "transfer_joined";
145
+ id: string;
146
+ } | {
147
+ type: "transfer_cancelled";
148
+ id: string;
149
+ notice?: string;
150
+ } | {
151
+ type: "transfer_completed";
152
+ id: string;
153
+ at: number;
154
+ } | {
155
+ type: "remote_end";
156
+ id: string;
157
+ at: number;
158
+ } | {
159
+ type: "hang_up";
160
+ id: string;
161
+ at: number;
162
+ } | {
163
+ type: "rekey";
164
+ id: string;
165
+ newId: string;
166
+ conversationId?: string;
167
+ } | {
168
+ type: "dismiss";
169
+ id: string;
170
+ };
171
+ /** What the host must do after a transition. */
172
+ export type CallEffect = {
173
+ type: "ring.show";
174
+ call: CallInfo;
175
+ }
176
+ /** Stop this device ringing for the call (native ring / CallKit). */
177
+ | {
178
+ type: "ring.cancel";
179
+ id: string;
180
+ }
181
+ /** Leave the call's media room (or never join it). */
182
+ | {
183
+ type: "media.leave";
184
+ id: string;
185
+ } | {
186
+ type: "ended";
187
+ id: string;
188
+ reason: EndReason;
189
+ };
190
+ export interface Transition {
191
+ state: CallsState;
192
+ effects: CallEffect[];
193
+ /** False when the event did not apply (state is the same object). */
194
+ changed: boolean;
195
+ }
196
+ /** Apply one event. Pure: never mutates `state`. */
197
+ export declare function transition(state: CallsState, ev: CallEvent): Transition;
198
+ /** The call holding the line, if any. */
199
+ export declare function activeCall(state: CallsState): Call | null;
200
+ /** Calls ringing now, oldest first. */
201
+ export declare function ringingCalls(state: CallsState): Call[];
202
+ export interface CallStoreEvents {
203
+ change: CallsState;
204
+ effect: CallEffect;
205
+ }
206
+ export interface CallStoreOptions {
207
+ now?: () => number;
208
+ /** Remove ended calls this long after they end (0 = keep until dismissed). Default 0. */
209
+ forgetEndedAfterMs?: number;
210
+ }
211
+ /**
212
+ * The state machine with a clock: rings expire on their own, and listeners hear
213
+ * every change and effect. Still free of React Native, LiveKit and HTTP.
214
+ */
215
+ export declare class CallStore {
216
+ private readonly o;
217
+ readonly events: TypedEmitter<CallStoreEvents>;
218
+ private st;
219
+ private readonly timers;
220
+ private readonly now;
221
+ constructor(o?: CallStoreOptions);
222
+ get state(): CallsState;
223
+ /** Apply an event. `at` is filled from the clock when omitted. */
224
+ dispatch(ev: DistributiveOmit<CallEvent, "at"> & {
225
+ at?: number;
226
+ }): Transition;
227
+ /** Stop every timer (e.g. on sign-out). */
228
+ dispose(): void;
229
+ private syncTimers;
230
+ }
231
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
232
+ export {};
233
+ //# sourceMappingURL=calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../src/calls.ts"],"names":[],"mappings":"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"}