@onedeskpro/chatbot-core 0.2.1 → 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.
- package/README.md +6 -2
- package/dist/index.cjs +254 -23
- package/dist/index.d.cts +110 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.iife.js +254 -23
- package/dist/index.js +1327 -433
- package/package.json +6 -6
package/dist/index.d.cts
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
1
|
import { ApiError } from '@onedeskpro/chatbot-types';
|
|
2
2
|
import { ApiResponse } from '@onedeskpro/chatbot-types';
|
|
3
|
+
import { ChatAttachment } from '@onedeskpro/chatbot-types';
|
|
3
4
|
import { ChatbotBlockReason } from '@onedeskpro/chatbot-types';
|
|
4
5
|
import { ChatbotEventMap } from '@onedeskpro/chatbot-types';
|
|
5
6
|
import { ChatbotInitOptions } from '@onedeskpro/chatbot-types';
|
|
6
7
|
import { ChatbotState } from '@onedeskpro/chatbot-types';
|
|
7
8
|
import { ChatbotTicketMode } from '@onedeskpro/chatbot-types';
|
|
8
9
|
import { ChatMessage } from '@onedeskpro/chatbot-types';
|
|
10
|
+
import { ChatMessageKind } from '@onedeskpro/chatbot-types';
|
|
9
11
|
import { ChatRequest } from '@onedeskpro/chatbot-types';
|
|
10
12
|
import { ChatResponseData } from '@onedeskpro/chatbot-types';
|
|
11
13
|
import { IdentifyRequest } from '@onedeskpro/chatbot-types';
|
|
12
14
|
import { IdentifyResponseData } from '@onedeskpro/chatbot-types';
|
|
13
15
|
import { SdkConfigResponse } from '@onedeskpro/chatbot-types';
|
|
14
16
|
import { TicketStatusData } from '@onedeskpro/chatbot-types';
|
|
17
|
+
import { UploadAttachmentResponseData } from '@onedeskpro/chatbot-types';
|
|
15
18
|
import { VisitorVerifyResponse } from '@onedeskpro/chatbot-types';
|
|
19
|
+
import { VoiceRecording } from '@onedeskpro/chatbot-types';
|
|
16
20
|
|
|
17
21
|
export declare class ApiClient {
|
|
18
22
|
private baseUrl;
|
|
19
23
|
private apiKey;
|
|
20
24
|
private timeoutMs;
|
|
25
|
+
private uploadTimeoutMs;
|
|
21
26
|
constructor(options: ApiClientOptions);
|
|
22
27
|
private fail;
|
|
23
28
|
private request;
|
|
24
29
|
identify(payload: IdentifyRequest): Promise<IdentifyResponseData>;
|
|
25
30
|
verifyVisitor(visitorToken: string): Promise<VisitorVerifyResponse>;
|
|
26
31
|
sendMessage(payload: ChatRequest): Promise<ChatResponseData>;
|
|
32
|
+
/** Uploads one file for a media message; the result goes into `ChatRequest.attachments`. */
|
|
33
|
+
uploadAttachment(file: File, visitorToken: string): Promise<UploadAttachmentResponseData>;
|
|
27
34
|
fetchConfig(): Promise<SdkConfigResponse>;
|
|
28
35
|
requestHuman(visitorToken: string): Promise<TicketStatusData>;
|
|
29
36
|
fetchTicketStatus(visitorToken: string): Promise<TicketStatusData>;
|
|
@@ -34,12 +41,16 @@ declare interface ApiClientOptions {
|
|
|
34
41
|
apiKey: string;
|
|
35
42
|
/** Abort a request that has not responded within this many milliseconds. */
|
|
36
43
|
timeoutMs?: number;
|
|
44
|
+
/** Abort a file upload that has not completed within this many milliseconds. */
|
|
45
|
+
uploadTimeoutMs?: number;
|
|
37
46
|
}
|
|
38
47
|
|
|
39
48
|
export { ApiError }
|
|
40
49
|
|
|
41
50
|
export { ApiResponse }
|
|
42
51
|
|
|
52
|
+
export { ChatAttachment }
|
|
53
|
+
|
|
43
54
|
export { ChatbotBlockReason }
|
|
44
55
|
|
|
45
56
|
export declare class ChatbotCore {
|
|
@@ -119,7 +130,42 @@ export declare class ChatbotCore {
|
|
|
119
130
|
* Escalate the open AI ticket to Unassigned. No-op unless the widget is in `ai` mode.
|
|
120
131
|
*/
|
|
121
132
|
requestHuman(): Promise<void>;
|
|
133
|
+
/** The visitor token every send needs; throws when the visitor has not identified. */
|
|
134
|
+
private requireVisitorToken;
|
|
135
|
+
/** Adds the visitor's own message optimistically and marks a send in flight. */
|
|
136
|
+
private pushLocalMessage;
|
|
137
|
+
private replaceMessage;
|
|
138
|
+
private removeMessage;
|
|
122
139
|
sendMessage(text: string): Promise<void>;
|
|
140
|
+
/** Records a send that never left the browser: `state.error`, the composer, and `error`. */
|
|
141
|
+
private rejectSend;
|
|
142
|
+
/**
|
|
143
|
+
* Sends `files` as one media message, with `text` as its caption. The bubble
|
|
144
|
+
* appears at once with local previews, uploads each file through the API, then
|
|
145
|
+
* posts the chat message the same way `sendMessage` does. Rejects when the visitor
|
|
146
|
+
* has not identified; a file that breaks the size or count limit is reported as
|
|
147
|
+
* `state.error` (and an `error` event) without sending anything.
|
|
148
|
+
*/
|
|
149
|
+
sendAttachments(files: File[], text?: string): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Sends a recorded voice note (from `VoiceRecorder` or your own recorder). The
|
|
152
|
+
* recording is re-encoded as mono WAV with a waveform where Web Audio allows,
|
|
153
|
+
* uploaded, and posted as a `voice` message so the inbox shows its voice player.
|
|
154
|
+
* Rejects when the visitor has not identified; an unusable or oversized recording is
|
|
155
|
+
* reported as `state.error` (and an `error` event) without sending anything.
|
|
156
|
+
*/
|
|
157
|
+
sendVoice(recording: VoiceRecording): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Shared tail of every file send: an optimistic `pending` bubble with local previews,
|
|
160
|
+
* one upload per file, then `deliver`. A failed upload removes the bubble; a failed
|
|
161
|
+
* chat post keeps it (the files are already stored) and records the error.
|
|
162
|
+
*/
|
|
163
|
+
private uploadThenDeliver;
|
|
164
|
+
/**
|
|
165
|
+
* Posts `payload` to `/sdk/chat` and applies the outcome: the ticket now exists,
|
|
166
|
+
* the mode may have moved, and in `ai` mode the reply becomes a bubble.
|
|
167
|
+
*/
|
|
168
|
+
private deliver;
|
|
123
169
|
on<K extends keyof ChatbotEventMap>(event: K, listener: Listener<K>): () => void;
|
|
124
170
|
resetSession(): void;
|
|
125
171
|
open(): void;
|
|
@@ -151,6 +197,8 @@ export { ChatbotTicketMode }
|
|
|
151
197
|
|
|
152
198
|
export { ChatMessage }
|
|
153
199
|
|
|
200
|
+
export { ChatMessageKind }
|
|
201
|
+
|
|
154
202
|
export { ChatRequest }
|
|
155
203
|
|
|
156
204
|
export { ChatResponseData }
|
|
@@ -189,6 +237,12 @@ export declare const OnedeskProChatbot: {
|
|
|
189
237
|
*/
|
|
190
238
|
export declare function resolveSdkSocketUrl(baseUrl: string): string;
|
|
191
239
|
|
|
240
|
+
/** Most attachments one chat message may carry. */
|
|
241
|
+
export declare const SDK_CHAT_MAX_ATTACHMENTS = 10;
|
|
242
|
+
|
|
243
|
+
/** Largest file `POST /sdk/upload` accepts, in bytes (10 MB). */
|
|
244
|
+
export declare const SDK_UPLOAD_MAX_BYTES: number;
|
|
245
|
+
|
|
192
246
|
export { SdkConfigResponse }
|
|
193
247
|
|
|
194
248
|
/**
|
|
@@ -230,6 +284,62 @@ export declare class SessionManager {
|
|
|
230
284
|
|
|
231
285
|
export { TicketStatusData }
|
|
232
286
|
|
|
287
|
+
export { UploadAttachmentResponseData }
|
|
288
|
+
|
|
233
289
|
export { VisitorVerifyResponse }
|
|
234
290
|
|
|
291
|
+
/** Longest voice note the widget records before stopping on its own. */
|
|
292
|
+
export declare const VOICE_MAX_DURATION_SECONDS = 300;
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Records a voice note with `MediaRecorder`. Framework-independent: the widget uses it,
|
|
296
|
+
* and custom UIs built on `ChatbotCore` can too. `destroy()` releases the microphone,
|
|
297
|
+
* timers and audio context; nothing is left running once it returns.
|
|
298
|
+
*/
|
|
299
|
+
export declare class VoiceRecorder {
|
|
300
|
+
private readonly onChange;
|
|
301
|
+
private readonly maxDurationSeconds;
|
|
302
|
+
private recorder;
|
|
303
|
+
private stream;
|
|
304
|
+
private chunks;
|
|
305
|
+
private mimeType;
|
|
306
|
+
private startedAt;
|
|
307
|
+
private tickTimer;
|
|
308
|
+
private levelTimer;
|
|
309
|
+
private maxTimer;
|
|
310
|
+
private audioContext;
|
|
311
|
+
private analyser;
|
|
312
|
+
private snapshot;
|
|
313
|
+
constructor(onChange: (snapshot: VoiceRecorderSnapshot) => void, maxDurationSeconds?: number);
|
|
314
|
+
static isSupported(): boolean;
|
|
315
|
+
getSnapshot(): VoiceRecorderSnapshot;
|
|
316
|
+
/** Asks for the microphone and starts recording. Rejects with a visitor-facing message. */
|
|
317
|
+
start(): Promise<void>;
|
|
318
|
+
/** Stops recording and moves to `preview`. Resolves with the recording, or null if none. */
|
|
319
|
+
stop(): Promise<VoiceRecording | null>;
|
|
320
|
+
/** Discards the recording (or the one in preview) and returns to `idle`. */
|
|
321
|
+
cancel(): void;
|
|
322
|
+
destroy(): void;
|
|
323
|
+
private update;
|
|
324
|
+
private elapsedMs;
|
|
325
|
+
private startLevelMeter;
|
|
326
|
+
private clearTimers;
|
|
327
|
+
private releaseMedia;
|
|
328
|
+
private release;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export declare interface VoiceRecorderSnapshot {
|
|
332
|
+
state: VoiceRecorderState;
|
|
333
|
+
/** Whole seconds recorded so far (or the final length in `preview`). */
|
|
334
|
+
elapsedSeconds: number;
|
|
335
|
+
/** Microphone loudness 0–1 while recording, 0 otherwise. */
|
|
336
|
+
level: number;
|
|
337
|
+
/** The finished recording while in `preview`. */
|
|
338
|
+
result: VoiceRecording | null;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export declare type VoiceRecorderState = 'idle' | 'recording' | 'preview';
|
|
342
|
+
|
|
343
|
+
export { VoiceRecording }
|
|
344
|
+
|
|
235
345
|
export { }
|
package/dist/index.d.ts
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
1
|
import { ApiError } from '@onedeskpro/chatbot-types';
|
|
2
2
|
import { ApiResponse } from '@onedeskpro/chatbot-types';
|
|
3
|
+
import { ChatAttachment } from '@onedeskpro/chatbot-types';
|
|
3
4
|
import { ChatbotBlockReason } from '@onedeskpro/chatbot-types';
|
|
4
5
|
import { ChatbotEventMap } from '@onedeskpro/chatbot-types';
|
|
5
6
|
import { ChatbotInitOptions } from '@onedeskpro/chatbot-types';
|
|
6
7
|
import { ChatbotState } from '@onedeskpro/chatbot-types';
|
|
7
8
|
import { ChatbotTicketMode } from '@onedeskpro/chatbot-types';
|
|
8
9
|
import { ChatMessage } from '@onedeskpro/chatbot-types';
|
|
10
|
+
import { ChatMessageKind } from '@onedeskpro/chatbot-types';
|
|
9
11
|
import { ChatRequest } from '@onedeskpro/chatbot-types';
|
|
10
12
|
import { ChatResponseData } from '@onedeskpro/chatbot-types';
|
|
11
13
|
import { IdentifyRequest } from '@onedeskpro/chatbot-types';
|
|
12
14
|
import { IdentifyResponseData } from '@onedeskpro/chatbot-types';
|
|
13
15
|
import { SdkConfigResponse } from '@onedeskpro/chatbot-types';
|
|
14
16
|
import { TicketStatusData } from '@onedeskpro/chatbot-types';
|
|
17
|
+
import { UploadAttachmentResponseData } from '@onedeskpro/chatbot-types';
|
|
15
18
|
import { VisitorVerifyResponse } from '@onedeskpro/chatbot-types';
|
|
19
|
+
import { VoiceRecording } from '@onedeskpro/chatbot-types';
|
|
16
20
|
|
|
17
21
|
export declare class ApiClient {
|
|
18
22
|
private baseUrl;
|
|
19
23
|
private apiKey;
|
|
20
24
|
private timeoutMs;
|
|
25
|
+
private uploadTimeoutMs;
|
|
21
26
|
constructor(options: ApiClientOptions);
|
|
22
27
|
private fail;
|
|
23
28
|
private request;
|
|
24
29
|
identify(payload: IdentifyRequest): Promise<IdentifyResponseData>;
|
|
25
30
|
verifyVisitor(visitorToken: string): Promise<VisitorVerifyResponse>;
|
|
26
31
|
sendMessage(payload: ChatRequest): Promise<ChatResponseData>;
|
|
32
|
+
/** Uploads one file for a media message; the result goes into `ChatRequest.attachments`. */
|
|
33
|
+
uploadAttachment(file: File, visitorToken: string): Promise<UploadAttachmentResponseData>;
|
|
27
34
|
fetchConfig(): Promise<SdkConfigResponse>;
|
|
28
35
|
requestHuman(visitorToken: string): Promise<TicketStatusData>;
|
|
29
36
|
fetchTicketStatus(visitorToken: string): Promise<TicketStatusData>;
|
|
@@ -34,12 +41,16 @@ declare interface ApiClientOptions {
|
|
|
34
41
|
apiKey: string;
|
|
35
42
|
/** Abort a request that has not responded within this many milliseconds. */
|
|
36
43
|
timeoutMs?: number;
|
|
44
|
+
/** Abort a file upload that has not completed within this many milliseconds. */
|
|
45
|
+
uploadTimeoutMs?: number;
|
|
37
46
|
}
|
|
38
47
|
|
|
39
48
|
export { ApiError }
|
|
40
49
|
|
|
41
50
|
export { ApiResponse }
|
|
42
51
|
|
|
52
|
+
export { ChatAttachment }
|
|
53
|
+
|
|
43
54
|
export { ChatbotBlockReason }
|
|
44
55
|
|
|
45
56
|
export declare class ChatbotCore {
|
|
@@ -119,7 +130,42 @@ export declare class ChatbotCore {
|
|
|
119
130
|
* Escalate the open AI ticket to Unassigned. No-op unless the widget is in `ai` mode.
|
|
120
131
|
*/
|
|
121
132
|
requestHuman(): Promise<void>;
|
|
133
|
+
/** The visitor token every send needs; throws when the visitor has not identified. */
|
|
134
|
+
private requireVisitorToken;
|
|
135
|
+
/** Adds the visitor's own message optimistically and marks a send in flight. */
|
|
136
|
+
private pushLocalMessage;
|
|
137
|
+
private replaceMessage;
|
|
138
|
+
private removeMessage;
|
|
122
139
|
sendMessage(text: string): Promise<void>;
|
|
140
|
+
/** Records a send that never left the browser: `state.error`, the composer, and `error`. */
|
|
141
|
+
private rejectSend;
|
|
142
|
+
/**
|
|
143
|
+
* Sends `files` as one media message, with `text` as its caption. The bubble
|
|
144
|
+
* appears at once with local previews, uploads each file through the API, then
|
|
145
|
+
* posts the chat message the same way `sendMessage` does. Rejects when the visitor
|
|
146
|
+
* has not identified; a file that breaks the size or count limit is reported as
|
|
147
|
+
* `state.error` (and an `error` event) without sending anything.
|
|
148
|
+
*/
|
|
149
|
+
sendAttachments(files: File[], text?: string): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Sends a recorded voice note (from `VoiceRecorder` or your own recorder). The
|
|
152
|
+
* recording is re-encoded as mono WAV with a waveform where Web Audio allows,
|
|
153
|
+
* uploaded, and posted as a `voice` message so the inbox shows its voice player.
|
|
154
|
+
* Rejects when the visitor has not identified; an unusable or oversized recording is
|
|
155
|
+
* reported as `state.error` (and an `error` event) without sending anything.
|
|
156
|
+
*/
|
|
157
|
+
sendVoice(recording: VoiceRecording): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Shared tail of every file send: an optimistic `pending` bubble with local previews,
|
|
160
|
+
* one upload per file, then `deliver`. A failed upload removes the bubble; a failed
|
|
161
|
+
* chat post keeps it (the files are already stored) and records the error.
|
|
162
|
+
*/
|
|
163
|
+
private uploadThenDeliver;
|
|
164
|
+
/**
|
|
165
|
+
* Posts `payload` to `/sdk/chat` and applies the outcome: the ticket now exists,
|
|
166
|
+
* the mode may have moved, and in `ai` mode the reply becomes a bubble.
|
|
167
|
+
*/
|
|
168
|
+
private deliver;
|
|
123
169
|
on<K extends keyof ChatbotEventMap>(event: K, listener: Listener<K>): () => void;
|
|
124
170
|
resetSession(): void;
|
|
125
171
|
open(): void;
|
|
@@ -151,6 +197,8 @@ export { ChatbotTicketMode }
|
|
|
151
197
|
|
|
152
198
|
export { ChatMessage }
|
|
153
199
|
|
|
200
|
+
export { ChatMessageKind }
|
|
201
|
+
|
|
154
202
|
export { ChatRequest }
|
|
155
203
|
|
|
156
204
|
export { ChatResponseData }
|
|
@@ -189,6 +237,12 @@ export declare const OnedeskProChatbot: {
|
|
|
189
237
|
*/
|
|
190
238
|
export declare function resolveSdkSocketUrl(baseUrl: string): string;
|
|
191
239
|
|
|
240
|
+
/** Most attachments one chat message may carry. */
|
|
241
|
+
export declare const SDK_CHAT_MAX_ATTACHMENTS = 10;
|
|
242
|
+
|
|
243
|
+
/** Largest file `POST /sdk/upload` accepts, in bytes (10 MB). */
|
|
244
|
+
export declare const SDK_UPLOAD_MAX_BYTES: number;
|
|
245
|
+
|
|
192
246
|
export { SdkConfigResponse }
|
|
193
247
|
|
|
194
248
|
/**
|
|
@@ -230,6 +284,62 @@ export declare class SessionManager {
|
|
|
230
284
|
|
|
231
285
|
export { TicketStatusData }
|
|
232
286
|
|
|
287
|
+
export { UploadAttachmentResponseData }
|
|
288
|
+
|
|
233
289
|
export { VisitorVerifyResponse }
|
|
234
290
|
|
|
291
|
+
/** Longest voice note the widget records before stopping on its own. */
|
|
292
|
+
export declare const VOICE_MAX_DURATION_SECONDS = 300;
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Records a voice note with `MediaRecorder`. Framework-independent: the widget uses it,
|
|
296
|
+
* and custom UIs built on `ChatbotCore` can too. `destroy()` releases the microphone,
|
|
297
|
+
* timers and audio context; nothing is left running once it returns.
|
|
298
|
+
*/
|
|
299
|
+
export declare class VoiceRecorder {
|
|
300
|
+
private readonly onChange;
|
|
301
|
+
private readonly maxDurationSeconds;
|
|
302
|
+
private recorder;
|
|
303
|
+
private stream;
|
|
304
|
+
private chunks;
|
|
305
|
+
private mimeType;
|
|
306
|
+
private startedAt;
|
|
307
|
+
private tickTimer;
|
|
308
|
+
private levelTimer;
|
|
309
|
+
private maxTimer;
|
|
310
|
+
private audioContext;
|
|
311
|
+
private analyser;
|
|
312
|
+
private snapshot;
|
|
313
|
+
constructor(onChange: (snapshot: VoiceRecorderSnapshot) => void, maxDurationSeconds?: number);
|
|
314
|
+
static isSupported(): boolean;
|
|
315
|
+
getSnapshot(): VoiceRecorderSnapshot;
|
|
316
|
+
/** Asks for the microphone and starts recording. Rejects with a visitor-facing message. */
|
|
317
|
+
start(): Promise<void>;
|
|
318
|
+
/** Stops recording and moves to `preview`. Resolves with the recording, or null if none. */
|
|
319
|
+
stop(): Promise<VoiceRecording | null>;
|
|
320
|
+
/** Discards the recording (or the one in preview) and returns to `idle`. */
|
|
321
|
+
cancel(): void;
|
|
322
|
+
destroy(): void;
|
|
323
|
+
private update;
|
|
324
|
+
private elapsedMs;
|
|
325
|
+
private startLevelMeter;
|
|
326
|
+
private clearTimers;
|
|
327
|
+
private releaseMedia;
|
|
328
|
+
private release;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export declare interface VoiceRecorderSnapshot {
|
|
332
|
+
state: VoiceRecorderState;
|
|
333
|
+
/** Whole seconds recorded so far (or the final length in `preview`). */
|
|
334
|
+
elapsedSeconds: number;
|
|
335
|
+
/** Microphone loudness 0–1 while recording, 0 otherwise. */
|
|
336
|
+
level: number;
|
|
337
|
+
/** The finished recording while in `preview`. */
|
|
338
|
+
result: VoiceRecording | null;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export declare type VoiceRecorderState = 'idle' | 'recording' | 'preview';
|
|
342
|
+
|
|
343
|
+
export { VoiceRecording }
|
|
344
|
+
|
|
235
345
|
export { }
|