@hainiva/agent-sdk 0.0.0-stage → 0.2.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 (113) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +201 -2
  4. package/SECURITY.md +33 -0
  5. package/dist/cjs/agent.cjs +316 -0
  6. package/dist/cjs/agent.d.cts +235 -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 +215 -0
  11. package/dist/cjs/embed.cjs +11 -0
  12. package/dist/cjs/embed.d.cts +13 -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 +27 -0
  26. package/dist/cjs/react-native.d.cts +38 -0
  27. package/dist/cjs/redact.cjs +71 -0
  28. package/dist/cjs/redact.d.cts +21 -0
  29. package/dist/cjs/rest.cjs +280 -0
  30. package/dist/cjs/rest.d.cts +166 -0
  31. package/dist/cjs/session.cjs +159 -0
  32. package/dist/cjs/session.d.cts +101 -0
  33. package/dist/cjs/singleFlight.cjs +49 -0
  34. package/dist/cjs/singleFlight.d.cts +32 -0
  35. package/dist/cjs/url.cjs +39 -0
  36. package/dist/cjs/url.d.cts +13 -0
  37. package/dist/cjs/web.cjs +28 -0
  38. package/dist/cjs/web.d.cts +23 -0
  39. package/dist/cjs/ws.cjs +246 -0
  40. package/dist/cjs/ws.d.cts +134 -0
  41. package/dist/esm/agent.d.ts +236 -0
  42. package/dist/esm/agent.d.ts.map +1 -0
  43. package/dist/esm/agent.js +313 -0
  44. package/dist/esm/agent.js.map +1 -0
  45. package/dist/esm/calls.d.ts +233 -0
  46. package/dist/esm/calls.d.ts.map +1 -0
  47. package/dist/esm/calls.js +271 -0
  48. package/dist/esm/calls.js.map +1 -0
  49. package/dist/esm/contract.d.ts +216 -0
  50. package/dist/esm/contract.d.ts.map +1 -0
  51. package/dist/esm/contract.js +12 -0
  52. package/dist/esm/contract.js.map +1 -0
  53. package/dist/esm/embed.d.ts +14 -0
  54. package/dist/esm/embed.d.ts.map +1 -0
  55. package/dist/esm/embed.js +9 -0
  56. package/dist/esm/embed.js.map +1 -0
  57. package/dist/esm/emitter.d.ts +23 -0
  58. package/dist/esm/emitter.d.ts.map +1 -0
  59. package/dist/esm/emitter.js +47 -0
  60. package/dist/esm/emitter.js.map +1 -0
  61. package/dist/esm/errors.d.ts +16 -0
  62. package/dist/esm/errors.d.ts.map +1 -0
  63. package/dist/esm/errors.js +25 -0
  64. package/dist/esm/errors.js.map +1 -0
  65. package/dist/esm/events.d.ts +98 -0
  66. package/dist/esm/events.d.ts.map +1 -0
  67. package/dist/esm/events.js +90 -0
  68. package/dist/esm/events.js.map +1 -0
  69. package/dist/esm/index.d.ts +29 -0
  70. package/dist/esm/index.d.ts.map +1 -0
  71. package/dist/esm/index.js +29 -0
  72. package/dist/esm/index.js.map +1 -0
  73. package/dist/esm/livekit.d.ts +36 -0
  74. package/dist/esm/livekit.d.ts.map +1 -0
  75. package/dist/esm/livekit.js +54 -0
  76. package/dist/esm/livekit.js.map +1 -0
  77. package/dist/esm/log.d.ts +6 -0
  78. package/dist/esm/log.d.ts.map +1 -0
  79. package/dist/esm/log.js +13 -0
  80. package/dist/esm/log.js.map +1 -0
  81. package/dist/esm/react-native.d.ts +39 -0
  82. package/dist/esm/react-native.d.ts.map +1 -0
  83. package/dist/esm/react-native.js +23 -0
  84. package/dist/esm/react-native.js.map +1 -0
  85. package/dist/esm/redact.d.ts +22 -0
  86. package/dist/esm/redact.d.ts.map +1 -0
  87. package/dist/esm/redact.js +66 -0
  88. package/dist/esm/redact.js.map +1 -0
  89. package/dist/esm/rest.d.ts +167 -0
  90. package/dist/esm/rest.d.ts.map +1 -0
  91. package/dist/esm/rest.js +275 -0
  92. package/dist/esm/rest.js.map +1 -0
  93. package/dist/esm/session.d.ts +102 -0
  94. package/dist/esm/session.d.ts.map +1 -0
  95. package/dist/esm/session.js +155 -0
  96. package/dist/esm/session.js.map +1 -0
  97. package/dist/esm/singleFlight.d.ts +33 -0
  98. package/dist/esm/singleFlight.d.ts.map +1 -0
  99. package/dist/esm/singleFlight.js +46 -0
  100. package/dist/esm/singleFlight.js.map +1 -0
  101. package/dist/esm/url.d.ts +14 -0
  102. package/dist/esm/url.d.ts.map +1 -0
  103. package/dist/esm/url.js +37 -0
  104. package/dist/esm/url.js.map +1 -0
  105. package/dist/esm/web.d.ts +24 -0
  106. package/dist/esm/web.d.ts.map +1 -0
  107. package/dist/esm/web.js +23 -0
  108. package/dist/esm/web.js.map +1 -0
  109. package/dist/esm/ws.d.ts +135 -0
  110. package/dist/esm/ws.d.ts.map +1 -0
  111. package/dist/esm/ws.js +242 -0
  112. package/dist/esm/ws.js.map +1 -0
  113. package/package.json +80 -4
@@ -0,0 +1,236 @@
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, type CallEffect, type CallsState, type TransferTarget } from "./calls.js";
15
+ import type { AgentAcceptDto, AgentCallEndedData, AgentCallRingingData, AgentConversationDto, AgentDispositionDto, AgentMeDto, AgentMessageDto, AgentPage, AgentPushSubscriptionDto, AgentPushSubscriptionInput, AgentRingDto, AgentSessionDto, SupervisorAgentDto, SupervisorLiveCallDto, SupervisorSuperviseDto } from "./contract.js";
16
+ import { TypedEmitter } from "./emitter.js";
17
+ import { HainivaAgentError } from "./errors.js";
18
+ import { type AgentEventFrame } from "./events.js";
19
+ import { type Logger } from "./log.js";
20
+ import { AgentRestClient, type AgentStatus, type ConversationListQuery, type MediaCredentials, type RequestOptions } from "./rest.js";
21
+ import { SessionManager, type AgentSession, type GetAssertion, type SessionStore } from "./session.js";
22
+ import { type ConnectionState, type WebSocketCtor } from "./ws.js";
23
+ /** A joined media room — what `joinCallRoom` from `/web` or `/react-native` returns. */
24
+ export interface MediaSession {
25
+ leave(): Promise<void>;
26
+ setMuted(muted: boolean): Promise<void>;
27
+ onDisconnected(fn: () => void): () => void;
28
+ }
29
+ /** Join a room: pass `joinCallRoom` from `@hainiva/agent-sdk/web` or `/react-native`. */
30
+ export type JoinMedia = (join: {
31
+ url: string;
32
+ token: string;
33
+ }) => Promise<MediaSession>;
34
+ export interface HainivaAgentOptions {
35
+ /** https://api.hainiva.com (or your organisation's API host). */
36
+ baseUrl: string;
37
+ tenantId: string;
38
+ /** Ask YOUR backend for a fresh assertion — every time; never cache one. */
39
+ getAssertion: GetAssertion;
40
+ /** Where the session is kept. Default in memory (a restart signs in again). */
41
+ store?: SessionStore;
42
+ /** Joins call media. Without it, `calls.accept` answers and returns the credentials only. */
43
+ media?: JoinMedia;
44
+ /** WebSocket implementation (browsers and React Native have one; Node 22 too). */
45
+ WebSocket?: WebSocketCtor;
46
+ fetch?: typeof fetch;
47
+ device?: {
48
+ label?: string;
49
+ platform?: "ios" | "android" | "web" | "other";
50
+ };
51
+ /** Per REST request. Default 15 s. */
52
+ timeoutMs?: number;
53
+ /** How long a ring with no server-known end may ring here. Default 60 s. */
54
+ ringTimeoutMs?: number;
55
+ /** A redacted log of what the SDK does. Nothing is logged without it. */
56
+ log?: Logger;
57
+ /** Local development only (http://localhost, ws://localhost). */
58
+ allowInsecureLocalhost?: boolean;
59
+ }
60
+ export interface HainivaAgentEvents {
61
+ /** Socket state. */
62
+ connection: ConnectionState;
63
+ /** The socket is authenticated (after every reconnect). */
64
+ ready: {
65
+ seq: number;
66
+ };
67
+ "call.ringing": AgentCallRingingData;
68
+ "call.ended": AgentCallEndedData;
69
+ "conversation.assigned": Record<string, unknown>;
70
+ "message.created": Record<string, unknown>;
71
+ "wrapup.required": {
72
+ callId: string;
73
+ conversationId: string;
74
+ deadlineAt: string | null;
75
+ };
76
+ "presence.changed": Record<string, unknown>;
77
+ "supervisor.alert": Record<string, unknown>;
78
+ /** An event name this SDK version does not know yet (the server added one). */
79
+ "event.unknown": AgentEventFrame;
80
+ /** The calls changed (state machine). */
81
+ calls: CallsState;
82
+ /** Something the host must do for a call (stop the native ring, leave media). Handled for media already. */
83
+ callEffect: CallEffect;
84
+ /** Events were missed beyond what the server keeps: state was refetched (rings); refetch your own lists. */
85
+ resync: {
86
+ fromSeq: number;
87
+ };
88
+ /** The session expires within a minute: the SDK is refreshing it. */
89
+ "session.expiring": {
90
+ expiresAt: string;
91
+ };
92
+ /** The session was ended by HAINIVA (sign-out elsewhere, suspended, app paused, key rotated). Call connect() to sign in again. */
93
+ revoked: {
94
+ reason: string;
95
+ };
96
+ error: HainivaAgentError;
97
+ }
98
+ /**
99
+ * The staff member's app: session, REST, socket and calls.
100
+ */
101
+ export declare class HainivaAgent {
102
+ private readonly o;
103
+ readonly events: TypedEmitter<HainivaAgentEvents>;
104
+ readonly session: SessionManager<AgentSession & AgentSessionDto>;
105
+ readonly rest: AgentRestClient;
106
+ readonly callStore: CallStore;
107
+ private socket;
108
+ private meDto;
109
+ private readonly media;
110
+ private readonly offs;
111
+ private readonly redactor;
112
+ private readonly log;
113
+ private readonly ringMs;
114
+ constructor(o: HainivaAgentOptions);
115
+ /** The signed-in member (after connect()). */
116
+ get me(): AgentMeDto | null;
117
+ /** The calls now (the state machine): ringing, connecting, active, held, ended. */
118
+ get callsState(): CallsState;
119
+ get connection(): ConnectionState;
120
+ on<K extends keyof HainivaAgentEvents>(event: K, fn: (payload: HainivaAgentEvents[K]) => void): () => void;
121
+ /** Sign in (or restore the stored session), load who you are and the rings waiting, open the event socket. */
122
+ connect(): Promise<AgentMeDto>;
123
+ /**
124
+ * Close the socket and leave every call's media. `signOut: true` also ends
125
+ * the session on the server (and removes it from the store) — do that when
126
+ * the staff member signs out; unregister this device's push first.
127
+ */
128
+ disconnect(opts?: {
129
+ signOut?: boolean;
130
+ }): Promise<void>;
131
+ setStatus(status: AgentStatus, o?: RequestOptions): Promise<{
132
+ status: AgentStatus;
133
+ }>;
134
+ readonly rings: {
135
+ /** Rings waiting for you now (also fed into the call state). */
136
+ pending: () => Promise<AgentRingDto[]>;
137
+ };
138
+ readonly calls: {
139
+ /**
140
+ * Answer: the server's answer race decides (409 = someone else was
141
+ * faster). With `media`, joins the room and returns the session.
142
+ */
143
+ accept: (callId: string, ring?: {
144
+ from?: string;
145
+ conversationId?: string;
146
+ }) => Promise<{
147
+ accepted: AgentAcceptDto;
148
+ media: MediaSession | null;
149
+ }>;
150
+ decline: (callId: string) => Promise<{
151
+ callId: string;
152
+ declined: true;
153
+ }>;
154
+ /** Hang up here: media is left at once, then the server ends the call. */
155
+ end: (callId: string) => Promise<{
156
+ callId: string;
157
+ ended: true;
158
+ }>;
159
+ hold: (callId: string, on: boolean) => Promise<{
160
+ callId: string;
161
+ onHold: boolean;
162
+ }>;
163
+ mute: (callId: string, muted: boolean) => Promise<void>;
164
+ /** Warm or blind to a colleague, to a queue (always blind), or to a phone number. */
165
+ transfer: (callId: string, target: TransferTarget, mode?: "warm" | "blind") => Promise<{
166
+ callId: string;
167
+ transferred: true;
168
+ }>;
169
+ get: (callId: string) => Promise<import("./contract.js").AgentCallDto>;
170
+ };
171
+ /** Join (or re-join) a call's media room. Without credentials, a fresh LiveKit token is minted. */
172
+ joinMedia(callId: string, creds?: MediaCredentials): Promise<MediaSession>;
173
+ readonly conversations: {
174
+ list: (q?: ConversationListQuery) => Promise<AgentPage<AgentConversationDto>>;
175
+ get: (id: string) => Promise<AgentConversationDto>;
176
+ /** Take it yourself (no agentId) or, a supervisor, give it to a colleague. */
177
+ assign: (id: string, agentId?: string) => Promise<unknown>;
178
+ release: (id: string, note?: string) => Promise<{
179
+ conversationId: string;
180
+ released: true;
181
+ }>;
182
+ transfer: (id: string, to: {
183
+ agentId: string;
184
+ } | {
185
+ queueId: string;
186
+ note?: string;
187
+ }) => Promise<unknown>;
188
+ close: (id: string) => Promise<{
189
+ conversationId: string;
190
+ closed: true;
191
+ }>;
192
+ };
193
+ readonly messages: {
194
+ list: (conversationId: string, q?: {
195
+ after?: string;
196
+ limit?: number;
197
+ }) => Promise<AgentPage<AgentMessageDto>>;
198
+ send: (conversationId: string, text: string) => Promise<Pick<AgentMessageDto, "id" | "conversationId" | "interactionId" | "createdAt">>;
199
+ typing: (conversationId: string) => Promise<{
200
+ ok: true;
201
+ }>;
202
+ };
203
+ /** After a call: a disposition code from dispositions() and notes. */
204
+ wrapUp(callId: string, w?: {
205
+ dispositionCode?: string;
206
+ notes?: string;
207
+ }): Promise<{
208
+ callId: string;
209
+ wrappedUp: true;
210
+ }>;
211
+ dispositions(channel?: string): Promise<AgentDispositionDto[]>;
212
+ readonly supervisor: {
213
+ liveCalls: () => Promise<SupervisorLiveCallDto[]>;
214
+ agents: () => Promise<SupervisorAgentDto[]>;
215
+ /** Listen in (monitor), coach the agent (whisper) or join the call (barge). Join `media` with your adapter. */
216
+ supervise: (callId: string, mode?: "monitor" | "whisper" | "barge") => Promise<SupervisorSuperviseDto>;
217
+ setMode: (callId: string, mode: "monitor" | "whisper" | "barge", supervisorTrackSid?: string) => Promise<{
218
+ callId: string;
219
+ mode: string;
220
+ }>;
221
+ };
222
+ readonly push: {
223
+ /** Register this device's FCM token (Android) or PushKit/APNs token (iPhone) for YOUR app's credentials. */
224
+ register: (sub: AgentPushSubscriptionInput) => Promise<AgentPushSubscriptionDto>;
225
+ unregister: (token: string) => Promise<void>;
226
+ };
227
+ /** A REST call; a final 401 session_revoked tells the app and forgets the session. */
228
+ private guard;
229
+ private onRevoked;
230
+ private openSocket;
231
+ private onFrame;
232
+ /** Rings waiting on the server → the call state (a cold start, a missed push, a resync). */
233
+ private syncRings;
234
+ private onEffect;
235
+ }
236
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,313 @@
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.rings = {
34
+ /** Rings waiting for you now (also fed into the call state). */
35
+ pending: () => this.syncRings(),
36
+ };
37
+ this.calls = {
38
+ /**
39
+ * Answer: the server's answer race decides (409 = someone else was
40
+ * faster). With `media`, joins the room and returns the session.
41
+ */
42
+ accept: async (callId, ring) => {
43
+ const known = this.callStore.state.calls[callId];
44
+ if (!known || known.phase === "ended") {
45
+ // Answered from a push (CallKit / the Android call notification) before
46
+ // the socket told us about the ring: the state machine learns it now.
47
+ this.callStore.dispatch({ type: "ring", call: {
48
+ id: callId, direction: "inbound", path: "queue", from: ring?.from ?? "",
49
+ ...(ring?.conversationId ? { conversationId: ring.conversationId } : {}), expiresAt: Date.now() + this.ringMs,
50
+ } });
51
+ }
52
+ this.callStore.dispatch({ type: "accept", id: callId });
53
+ let accepted;
54
+ try {
55
+ accepted = await this.guard(this.rest.acceptCall(callId));
56
+ }
57
+ catch (e) {
58
+ const err = HainivaAgentError.from(e, "accept_failed", this.redactor);
59
+ const reason = err.status === 409 ? "answered_elsewhere" : err.status === 404 || err.code === "call_ended" ? "gone" : "failed";
60
+ this.callStore.dispatch({ type: "accept_failed", id: callId, reason, error: err.code });
61
+ throw err;
62
+ }
63
+ if (!accepted.media || !this.o.media) {
64
+ this.callStore.dispatch({ type: "connected", id: callId, answered: true });
65
+ return { accepted, media: null };
66
+ }
67
+ const media = await this.joinMedia(callId, accepted.media);
68
+ return { accepted, media };
69
+ },
70
+ decline: async (callId) => {
71
+ this.callStore.dispatch({ type: "decline", id: callId });
72
+ return this.guard(this.rest.declineCall(callId));
73
+ },
74
+ /** Hang up here: media is left at once, then the server ends the call. */
75
+ end: async (callId) => {
76
+ this.callStore.dispatch({ type: "hang_up", id: callId });
77
+ return this.guard(this.rest.endCall(callId));
78
+ },
79
+ hold: async (callId, on) => {
80
+ const r = await this.guard(this.rest.holdCall(callId, on));
81
+ this.callStore.dispatch(on ? { type: "hold", id: callId } : { type: "resume", id: callId });
82
+ return r;
83
+ },
84
+ mute: async (callId, muted) => {
85
+ await this.media.get(callId)?.setMuted(muted);
86
+ this.callStore.dispatch({ type: "mute", id: callId, muted });
87
+ },
88
+ /** Warm or blind to a colleague, to a queue (always blind), or to a phone number. */
89
+ transfer: async (callId, target, mode = "warm") => {
90
+ this.callStore.dispatch({ type: "transfer_start", id: callId, mode, target });
91
+ try {
92
+ 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 }));
93
+ }
94
+ catch (e) {
95
+ this.callStore.dispatch({ type: "transfer_cancelled", id: callId, notice: "transfer_failed" });
96
+ throw e;
97
+ }
98
+ },
99
+ get: (callId) => this.guard(this.rest.getCall(callId)),
100
+ };
101
+ this.conversations = {
102
+ list: (q) => this.guard(this.rest.listConversations(q)),
103
+ get: (id) => this.guard(this.rest.getConversation(id)),
104
+ /** Take it yourself (no agentId) or, a supervisor, give it to a colleague. */
105
+ assign: (id, agentId) => this.guard(this.rest.assignConversation(id, agentId)),
106
+ release: (id, note) => this.guard(this.rest.releaseConversation(id, note)),
107
+ transfer: (id, to) => this.guard(this.rest.transferConversation(id, to)),
108
+ close: (id) => this.guard(this.rest.closeConversation(id)),
109
+ };
110
+ this.messages = {
111
+ list: (conversationId, q) => this.guard(this.rest.listMessages(conversationId, q)),
112
+ send: (conversationId, text) => this.guard(this.rest.sendMessage(conversationId, text)),
113
+ typing: (conversationId) => this.guard(this.rest.typing(conversationId)),
114
+ };
115
+ this.supervisor = {
116
+ liveCalls: () => this.guard(this.rest.liveCalls()),
117
+ agents: () => this.guard(this.rest.teamAgents()),
118
+ /** Listen in (monitor), coach the agent (whisper) or join the call (barge). Join `media` with your adapter. */
119
+ supervise: (callId, mode = "monitor") => this.guard(this.rest.supervise(callId, mode)),
120
+ setMode: (callId, mode, supervisorTrackSid) => this.guard(this.rest.setSuperviseMode(callId, mode, supervisorTrackSid)),
121
+ };
122
+ this.push = {
123
+ /** Register this device's FCM token (Android) or PushKit/APNs token (iPhone) for YOUR app's credentials. */
124
+ register: (sub) => this.guard(this.rest.registerPush(sub)),
125
+ unregister: (token) => this.guard(this.rest.unregisterPush(token)),
126
+ };
127
+ this.redactor = new Redactor();
128
+ this.log = safeLogger(o.log, this.redactor);
129
+ this.events = new TypedEmitter((e) => this.log("listener_error", e));
130
+ this.ringMs = o.ringTimeoutMs ?? 60000;
131
+ this.rest = new AgentRestClient({
132
+ baseUrl: o.baseUrl, tenantId: o.tenantId, redactor: this.redactor,
133
+ ...(o.fetch ? { fetch: o.fetch } : {}), ...(o.timeoutMs ? { timeoutMs: o.timeoutMs } : {}),
134
+ ...(o.device ? { device: o.device } : {}), ...(o.log ? { log: o.log } : {}),
135
+ ...(o.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {}),
136
+ });
137
+ this.session = new SessionManager({
138
+ getAssertion: o.getAssertion, transport: this.rest.sessions, redactor: this.redactor,
139
+ ...(o.store ? { store: o.store } : {}), ...(o.log ? { log: o.log } : {}),
140
+ });
141
+ this.rest.useTokens(this.session);
142
+ this.callStore = new CallStore();
143
+ this.callStore.events.on("change", (s) => this.events.emit("calls", s));
144
+ this.callStore.events.on("effect", (e) => this.onEffect(e));
145
+ }
146
+ /** The signed-in member (after connect()). */
147
+ get me() { return this.meDto; }
148
+ /** The calls now (the state machine): ringing, connecting, active, held, ended. */
149
+ get callsState() { return this.callStore.state; }
150
+ get connection() { return this.socket?.state ?? "idle"; }
151
+ on(event, fn) {
152
+ return this.events.on(event, fn);
153
+ }
154
+ /** Sign in (or restore the stored session), load who you are and the rings waiting, open the event socket. */
155
+ async connect() {
156
+ await this.session.signIn();
157
+ this.meDto = await this.guard(this.rest.me());
158
+ if (!this.socket)
159
+ this.openSocket();
160
+ this.socket.connect();
161
+ await this.syncRings().catch((e) => this.log("pending_rings_failed", e));
162
+ return this.meDto;
163
+ }
164
+ /**
165
+ * Close the socket and leave every call's media. `signOut: true` also ends
166
+ * the session on the server (and removes it from the store) — do that when
167
+ * the staff member signs out; unregister this device's push first.
168
+ */
169
+ async disconnect(opts = {}) {
170
+ this.socket?.disconnect();
171
+ this.socket = null;
172
+ for (const off of this.offs.splice(0))
173
+ off();
174
+ await Promise.all([...this.media.values()].map((m) => m.leave().catch(() => undefined)));
175
+ this.media.clear();
176
+ if (opts.signOut)
177
+ await this.session.signOut();
178
+ }
179
+ setStatus(status, o) { return this.guard(this.rest.setStatus(status, o)); }
180
+ /** Join (or re-join) a call's media room. Without credentials, a fresh LiveKit token is minted. */
181
+ async joinMedia(callId, creds) {
182
+ if (!this.o.media)
183
+ throw new HainivaAgentError(0, "no_media_adapter", { hint: "pass options.media = joinCallRoom from @hainiva/agent-sdk/web or /react-native" });
184
+ const c = creds ?? await this.guard(this.rest.mediaToken(callId));
185
+ this.redactor.add(c.token);
186
+ const previous = this.media.get(callId);
187
+ if (previous)
188
+ await previous.leave().catch(() => undefined);
189
+ let m;
190
+ try {
191
+ m = await this.o.media({ url: c.livekitUrl, token: c.token });
192
+ }
193
+ catch (e) {
194
+ this.callStore.dispatch({ type: "accept_failed", id: callId, reason: "failed", error: "media_connect_failed" });
195
+ throw HainivaAgentError.from(e, "media_connect_failed", this.redactor);
196
+ }
197
+ this.media.set(callId, m);
198
+ m.onDisconnected(() => {
199
+ if (this.media.get(callId) !== m)
200
+ return;
201
+ this.media.delete(callId);
202
+ this.callStore.dispatch({ type: "remote_end", id: callId });
203
+ });
204
+ // Media that comes up after the caller hung up is left at once (the machine's media.leave effect).
205
+ this.callStore.dispatch({ type: "connected", id: callId, answered: true });
206
+ return m;
207
+ }
208
+ /** After a call: a disposition code from dispositions() and notes. */
209
+ wrapUp(callId, w = {}) { return this.guard(this.rest.wrapUp(callId, w)); }
210
+ dispositions(channel) { return this.guard(this.rest.dispositions(channel)); }
211
+ // ── Internals ───────────────────────────────────────────────────────────────
212
+ /** A REST call; a final 401 session_revoked tells the app and forgets the session. */
213
+ async guard(p) {
214
+ try {
215
+ return await p;
216
+ }
217
+ catch (e) {
218
+ if (e instanceof HainivaAgentError && e.status === 401 && e.code === "session_revoked")
219
+ await this.onRevoked("session_revoked");
220
+ throw e;
221
+ }
222
+ }
223
+ async onRevoked(reason) {
224
+ this.socket?.disconnect();
225
+ this.socket = null;
226
+ await this.session.clear();
227
+ this.events.emit("revoked", { reason });
228
+ }
229
+ openSocket() {
230
+ let sock;
231
+ sock = new ReconnectingSocket({
232
+ url: this.rest.wsUrl,
233
+ getToken: () => this.session.accessToken(),
234
+ onTokenRejected: () => this.session.invalidate(),
235
+ redactor: this.redactor,
236
+ ...(this.o.WebSocket ? { WebSocket: this.o.WebSocket } : {}),
237
+ ...(this.o.log ? { log: this.o.log } : {}),
238
+ ...(this.o.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {}),
239
+ ...agentSocketBindings(() => sock.lastSeq),
240
+ });
241
+ this.socket = sock;
242
+ 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) => {
243
+ const seq = f.type === "ready" && typeof f.seq === "number" ? f.seq : 0;
244
+ // A first connect starts at the server's newest event: old rings are not replayed.
245
+ if (sock.lastSeq === 0 && seq > 0)
246
+ sock.setLastSeq(seq);
247
+ this.events.emit("ready", { seq });
248
+ }), sock.events.on("frame", (f) => this.onFrame(sock, f)), this.session.events.on("token", (t) => { sock.updateToken(t); }));
249
+ }
250
+ onFrame(sock, f) {
251
+ switch (f.type) {
252
+ case "event": {
253
+ if (!isEventFrame(f))
254
+ return;
255
+ for (const ev of toCallEvents(f, this.callStore.state, Date.now(), this.ringMs))
256
+ this.callStore.dispatch(ev);
257
+ if (isKnownEvent(f.event))
258
+ this.events.emit(f.event, f.data);
259
+ else
260
+ this.events.emit("event.unknown", f);
261
+ return;
262
+ }
263
+ case "resync_required": {
264
+ const from = typeof f.fromSeq === "number" && f.fromSeq >= 0 ? f.fromSeq : 0;
265
+ sock.setLastSeq(from);
266
+ void this.syncRings().catch((e) => this.log("pending_rings_failed", e));
267
+ this.events.emit("resync", { fromSeq: from });
268
+ return;
269
+ }
270
+ case "session.expiring":
271
+ this.events.emit("session.expiring", { expiresAt: String(f.expiresAt ?? "") });
272
+ // The server's clock decides: refresh now even if ours thinks there is time.
273
+ // Refreshing emits "token", which hands the new token to this socket (token.refresh).
274
+ this.session.invalidate(this.session.current?.accessToken);
275
+ void this.session.accessToken().catch((e) => this.log("refresh_failed", e));
276
+ return;
277
+ case "ack":
278
+ if (!f.ok)
279
+ this.log("socket_ack_refused", { error: f.error });
280
+ return;
281
+ default:
282
+ return;
283
+ }
284
+ }
285
+ /** Rings waiting on the server → the call state (a cold start, a missed push, a resync). */
286
+ async syncRings() {
287
+ const rings = await this.guard(this.rest.pendingRings());
288
+ const now = Date.now();
289
+ for (const r of rings) {
290
+ if (!r || typeof r.callId !== "string")
291
+ continue;
292
+ this.callStore.dispatch({
293
+ type: "ring",
294
+ call: {
295
+ id: r.callId, conversationId: r.conversationId, direction: "inbound",
296
+ path: r.path === "direct" ? "direct" : "queue",
297
+ from: r.contactName ?? r.callerNumber ?? "", expiresAt: now + this.ringMs,
298
+ },
299
+ });
300
+ }
301
+ return rings;
302
+ }
303
+ onEffect(e) {
304
+ if (e.type === "media.leave") {
305
+ const m = this.media.get(e.id);
306
+ this.media.delete(e.id);
307
+ if (m)
308
+ void m.leave().catch(() => undefined);
309
+ }
310
+ this.events.emit("callEffect", e);
311
+ }
312
+ }
313
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}