@humeai/voice-embed 0.0.0-beta.2 → 0.0.0-beta.21
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/dist/index.d.mts +66 -48
- package/dist/index.d.ts +66 -48
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.d.mts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export { AgentTranscriptMessage, Config, EmotionScores, JSONMessage, LanguageModelOption, UserTranscriptMessage } from '@humeai/voice';
|
|
1
|
+
import { SocketConfig, UserTranscriptMessage, AssistantTranscriptMessage } from '@humeai/voice';
|
|
2
|
+
export { AssistantTranscriptMessage, EmotionScores, JSONMessage, LanguageModelOption, SocketConfig, UserTranscriptMessage } from '@humeai/voice';
|
|
4
3
|
import { z } from 'zod';
|
|
5
4
|
|
|
6
5
|
type EmbeddedVoiceConfig = {
|
|
7
6
|
rendererUrl: string;
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
iframeTitle?: string;
|
|
8
|
+
} & SocketConfig;
|
|
9
|
+
type TranscriptMessageHandler = (message: UserTranscriptMessage | AssistantTranscriptMessage) => void;
|
|
10
10
|
type CloseHandler = () => void;
|
|
11
11
|
declare class EmbeddedVoice {
|
|
12
12
|
private iframe;
|
|
@@ -15,10 +15,12 @@ declare class EmbeddedVoice {
|
|
|
15
15
|
private config;
|
|
16
16
|
private onMessage;
|
|
17
17
|
private onClose;
|
|
18
|
+
private openOnMount;
|
|
18
19
|
private constructor();
|
|
19
|
-
static create({ rendererUrl, onMessage, onClose, ...config }: Partial<EmbeddedVoiceConfig> & {
|
|
20
|
+
static create({ rendererUrl, onMessage, onClose, openOnMount, ...config }: Partial<EmbeddedVoiceConfig> & {
|
|
20
21
|
onMessage?: TranscriptMessageHandler;
|
|
21
22
|
onClose?: CloseHandler;
|
|
23
|
+
openOnMount?: boolean;
|
|
22
24
|
} & NonNullable<Pick<EmbeddedVoiceConfig, 'auth'>>): EmbeddedVoice;
|
|
23
25
|
mount(container?: HTMLElement): () => void;
|
|
24
26
|
private createContainer;
|
|
@@ -33,6 +35,39 @@ declare class EmbeddedVoice {
|
|
|
33
35
|
private resizeIframe;
|
|
34
36
|
}
|
|
35
37
|
|
|
38
|
+
/**
|
|
39
|
+
|
|
40
|
+
client frame
|
|
41
|
+
|
|
42
|
+
┌───────────────────────────┐
|
|
43
|
+
│ mount iframe │ ───────────▶
|
|
44
|
+
└───────────────────────────┘
|
|
45
|
+
┌───────────────────────────┐
|
|
46
|
+
◀─────────── │ iframe is ready │
|
|
47
|
+
└───────────────────────────┘
|
|
48
|
+
┌───────────────────────────┐
|
|
49
|
+
│ send config │ ───────────▶
|
|
50
|
+
└───────────────────────────┘
|
|
51
|
+
┌───────────────────────────┐
|
|
52
|
+
◀─────────── │ widget is open │
|
|
53
|
+
└───────────────────────────┘
|
|
54
|
+
┌───────────────────────────┐
|
|
55
|
+
◀─────────── │ widget is collapsed │
|
|
56
|
+
└───────────────────────────┘
|
|
57
|
+
┌───────────────────────────┐
|
|
58
|
+
◀─────────── │ widget is minimized │
|
|
59
|
+
└───────────────────────────┘
|
|
60
|
+
┌───────────────────────────┐
|
|
61
|
+
◀─────────── │ transcript message │
|
|
62
|
+
└───────────────────────────┘
|
|
63
|
+
┌───────────────────────────┐
|
|
64
|
+
◀─────────── │ resize window │
|
|
65
|
+
└───────────────────────────┘
|
|
66
|
+
┌───────────────────────────┐
|
|
67
|
+
│ unmount iframe │ ───────────▶
|
|
68
|
+
└───────────────────────────┘
|
|
69
|
+
*/
|
|
70
|
+
|
|
36
71
|
declare const WindowDimensionsSchema: z.ZodObject<{
|
|
37
72
|
width: z.ZodNumber;
|
|
38
73
|
height: z.ZodNumber;
|
|
@@ -47,6 +82,9 @@ type WindowDimensions = z.infer<typeof WindowDimensionsSchema>;
|
|
|
47
82
|
declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
48
83
|
type: z.ZodLiteral<"update_config">;
|
|
49
84
|
payload: z.ZodObject<{
|
|
85
|
+
hostname: z.ZodString;
|
|
86
|
+
reconnectAttempts: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
87
|
+
debug: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
50
88
|
auth: z.ZodUnion<[z.ZodObject<{
|
|
51
89
|
type: z.ZodLiteral<"apiKey">;
|
|
52
90
|
value: z.ZodString;
|
|
@@ -66,17 +104,12 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
66
104
|
type: "accessToken";
|
|
67
105
|
value: string;
|
|
68
106
|
}>]>;
|
|
69
|
-
hostname: z.ZodString;
|
|
70
|
-
channels: z.ZodOptional<z.ZodNativeEnum<typeof _humeai_voice.Channels>>;
|
|
71
|
-
sampleRate: z.ZodOptional<z.ZodNumber>;
|
|
72
|
-
tts: z.ZodDefault<z.ZodOptional<z.ZodNativeEnum<typeof _humeai_voice.TTSService>>>;
|
|
73
|
-
speedRatio: z.ZodOptional<z.ZodNumber>;
|
|
74
|
-
reconnectAttempts: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
75
|
-
debug: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
76
|
-
systemPrompt: z.ZodOptional<z.ZodString>;
|
|
77
107
|
configId: z.ZodOptional<z.ZodString>;
|
|
78
|
-
|
|
108
|
+
configVersion: z.ZodOptional<z.ZodNumber>;
|
|
79
109
|
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
hostname: string;
|
|
111
|
+
reconnectAttempts: number;
|
|
112
|
+
debug: boolean;
|
|
80
113
|
auth: {
|
|
81
114
|
type: "apiKey";
|
|
82
115
|
value: string;
|
|
@@ -84,17 +117,10 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
84
117
|
type: "accessToken";
|
|
85
118
|
value: string;
|
|
86
119
|
};
|
|
87
|
-
hostname: string;
|
|
88
|
-
tts: _humeai_voice.TTSService;
|
|
89
|
-
reconnectAttempts: number;
|
|
90
|
-
debug: boolean;
|
|
91
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
92
|
-
sampleRate?: number | undefined;
|
|
93
|
-
speedRatio?: number | undefined;
|
|
94
|
-
systemPrompt?: string | undefined;
|
|
95
120
|
configId?: string | undefined;
|
|
96
|
-
|
|
121
|
+
configVersion?: number | undefined;
|
|
97
122
|
}, {
|
|
123
|
+
hostname: string;
|
|
98
124
|
auth: {
|
|
99
125
|
type: "apiKey";
|
|
100
126
|
value: string;
|
|
@@ -102,20 +128,17 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
102
128
|
type: "accessToken";
|
|
103
129
|
value: string;
|
|
104
130
|
};
|
|
105
|
-
hostname: string;
|
|
106
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
107
|
-
sampleRate?: number | undefined;
|
|
108
|
-
tts?: _humeai_voice.TTSService | undefined;
|
|
109
|
-
speedRatio?: number | undefined;
|
|
110
131
|
reconnectAttempts?: number | undefined;
|
|
111
132
|
debug?: boolean | undefined;
|
|
112
|
-
systemPrompt?: string | undefined;
|
|
113
133
|
configId?: string | undefined;
|
|
114
|
-
|
|
134
|
+
configVersion?: number | undefined;
|
|
115
135
|
}>;
|
|
116
136
|
}, "strip", z.ZodTypeAny, {
|
|
117
137
|
type: "update_config";
|
|
118
138
|
payload: {
|
|
139
|
+
hostname: string;
|
|
140
|
+
reconnectAttempts: number;
|
|
141
|
+
debug: boolean;
|
|
119
142
|
auth: {
|
|
120
143
|
type: "apiKey";
|
|
121
144
|
value: string;
|
|
@@ -123,20 +146,13 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
123
146
|
type: "accessToken";
|
|
124
147
|
value: string;
|
|
125
148
|
};
|
|
126
|
-
hostname: string;
|
|
127
|
-
tts: _humeai_voice.TTSService;
|
|
128
|
-
reconnectAttempts: number;
|
|
129
|
-
debug: boolean;
|
|
130
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
131
|
-
sampleRate?: number | undefined;
|
|
132
|
-
speedRatio?: number | undefined;
|
|
133
|
-
systemPrompt?: string | undefined;
|
|
134
149
|
configId?: string | undefined;
|
|
135
|
-
|
|
150
|
+
configVersion?: number | undefined;
|
|
136
151
|
};
|
|
137
152
|
}, {
|
|
138
153
|
type: "update_config";
|
|
139
154
|
payload: {
|
|
155
|
+
hostname: string;
|
|
140
156
|
auth: {
|
|
141
157
|
type: "apiKey";
|
|
142
158
|
value: string;
|
|
@@ -144,16 +160,10 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
144
160
|
type: "accessToken";
|
|
145
161
|
value: string;
|
|
146
162
|
};
|
|
147
|
-
hostname: string;
|
|
148
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
149
|
-
sampleRate?: number | undefined;
|
|
150
|
-
tts?: _humeai_voice.TTSService | undefined;
|
|
151
|
-
speedRatio?: number | undefined;
|
|
152
163
|
reconnectAttempts?: number | undefined;
|
|
153
164
|
debug?: boolean | undefined;
|
|
154
|
-
systemPrompt?: string | undefined;
|
|
155
165
|
configId?: string | undefined;
|
|
156
|
-
|
|
166
|
+
configVersion?: number | undefined;
|
|
157
167
|
};
|
|
158
168
|
}>, z.ZodObject<{
|
|
159
169
|
type: z.ZodLiteral<"cancel">;
|
|
@@ -395,6 +405,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
395
405
|
end: number;
|
|
396
406
|
} | null | undefined;
|
|
397
407
|
}>;
|
|
408
|
+
from_tts: z.ZodCatch<z.ZodBoolean>;
|
|
398
409
|
}, "strip", z.ZodTypeAny, {
|
|
399
410
|
type: "assistant_message";
|
|
400
411
|
message: {
|
|
@@ -411,6 +422,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
411
422
|
end: number;
|
|
412
423
|
} | null | undefined;
|
|
413
424
|
};
|
|
425
|
+
from_tts: boolean;
|
|
414
426
|
}, {
|
|
415
427
|
type: "assistant_message";
|
|
416
428
|
message: {
|
|
@@ -427,6 +439,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
427
439
|
end: number;
|
|
428
440
|
} | null | undefined;
|
|
429
441
|
};
|
|
442
|
+
from_tts?: unknown;
|
|
430
443
|
}>, {
|
|
431
444
|
type: "assistant_message";
|
|
432
445
|
message: {
|
|
@@ -443,6 +456,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
443
456
|
end: number;
|
|
444
457
|
} | null | undefined;
|
|
445
458
|
};
|
|
459
|
+
from_tts: boolean;
|
|
446
460
|
} & {
|
|
447
461
|
receivedAt: Date;
|
|
448
462
|
}, {
|
|
@@ -461,6 +475,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
461
475
|
end: number;
|
|
462
476
|
} | null | undefined;
|
|
463
477
|
};
|
|
478
|
+
from_tts?: unknown;
|
|
464
479
|
}>]>;
|
|
465
480
|
}, "strip", z.ZodTypeAny, {
|
|
466
481
|
type: "transcript_message";
|
|
@@ -497,6 +512,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
497
512
|
end: number;
|
|
498
513
|
} | null | undefined;
|
|
499
514
|
};
|
|
515
|
+
from_tts: boolean;
|
|
500
516
|
} & {
|
|
501
517
|
receivedAt: Date;
|
|
502
518
|
});
|
|
@@ -533,6 +549,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
533
549
|
end: number;
|
|
534
550
|
} | null | undefined;
|
|
535
551
|
};
|
|
552
|
+
from_tts?: unknown;
|
|
536
553
|
};
|
|
537
554
|
}>, z.ZodObject<{
|
|
538
555
|
type: z.ZodLiteral<"resize_frame">;
|
|
@@ -572,7 +589,7 @@ declare const MINIMIZE_WIDGET_ACTION: {
|
|
|
572
589
|
declare const WIDGET_IFRAME_IS_READY_ACTION: {
|
|
573
590
|
type: "widget_iframe_is_ready";
|
|
574
591
|
};
|
|
575
|
-
declare const TRANSCRIPT_MESSAGE_ACTION: (message: UserTranscriptMessage |
|
|
592
|
+
declare const TRANSCRIPT_MESSAGE_ACTION: (message: UserTranscriptMessage | AssistantTranscriptMessage) => {
|
|
576
593
|
type: "transcript_message";
|
|
577
594
|
payload: ({
|
|
578
595
|
type: "user_message";
|
|
@@ -607,6 +624,7 @@ declare const TRANSCRIPT_MESSAGE_ACTION: (message: UserTranscriptMessage | Agent
|
|
|
607
624
|
end: number;
|
|
608
625
|
} | null | undefined;
|
|
609
626
|
};
|
|
627
|
+
from_tts: boolean;
|
|
610
628
|
} & {
|
|
611
629
|
receivedAt: Date;
|
|
612
630
|
});
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export { AgentTranscriptMessage, Config, EmotionScores, JSONMessage, LanguageModelOption, UserTranscriptMessage } from '@humeai/voice';
|
|
1
|
+
import { SocketConfig, UserTranscriptMessage, AssistantTranscriptMessage } from '@humeai/voice';
|
|
2
|
+
export { AssistantTranscriptMessage, EmotionScores, JSONMessage, LanguageModelOption, SocketConfig, UserTranscriptMessage } from '@humeai/voice';
|
|
4
3
|
import { z } from 'zod';
|
|
5
4
|
|
|
6
5
|
type EmbeddedVoiceConfig = {
|
|
7
6
|
rendererUrl: string;
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
iframeTitle?: string;
|
|
8
|
+
} & SocketConfig;
|
|
9
|
+
type TranscriptMessageHandler = (message: UserTranscriptMessage | AssistantTranscriptMessage) => void;
|
|
10
10
|
type CloseHandler = () => void;
|
|
11
11
|
declare class EmbeddedVoice {
|
|
12
12
|
private iframe;
|
|
@@ -15,10 +15,12 @@ declare class EmbeddedVoice {
|
|
|
15
15
|
private config;
|
|
16
16
|
private onMessage;
|
|
17
17
|
private onClose;
|
|
18
|
+
private openOnMount;
|
|
18
19
|
private constructor();
|
|
19
|
-
static create({ rendererUrl, onMessage, onClose, ...config }: Partial<EmbeddedVoiceConfig> & {
|
|
20
|
+
static create({ rendererUrl, onMessage, onClose, openOnMount, ...config }: Partial<EmbeddedVoiceConfig> & {
|
|
20
21
|
onMessage?: TranscriptMessageHandler;
|
|
21
22
|
onClose?: CloseHandler;
|
|
23
|
+
openOnMount?: boolean;
|
|
22
24
|
} & NonNullable<Pick<EmbeddedVoiceConfig, 'auth'>>): EmbeddedVoice;
|
|
23
25
|
mount(container?: HTMLElement): () => void;
|
|
24
26
|
private createContainer;
|
|
@@ -33,6 +35,39 @@ declare class EmbeddedVoice {
|
|
|
33
35
|
private resizeIframe;
|
|
34
36
|
}
|
|
35
37
|
|
|
38
|
+
/**
|
|
39
|
+
|
|
40
|
+
client frame
|
|
41
|
+
|
|
42
|
+
┌───────────────────────────┐
|
|
43
|
+
│ mount iframe │ ───────────▶
|
|
44
|
+
└───────────────────────────┘
|
|
45
|
+
┌───────────────────────────┐
|
|
46
|
+
◀─────────── │ iframe is ready │
|
|
47
|
+
└───────────────────────────┘
|
|
48
|
+
┌───────────────────────────┐
|
|
49
|
+
│ send config │ ───────────▶
|
|
50
|
+
└───────────────────────────┘
|
|
51
|
+
┌───────────────────────────┐
|
|
52
|
+
◀─────────── │ widget is open │
|
|
53
|
+
└───────────────────────────┘
|
|
54
|
+
┌───────────────────────────┐
|
|
55
|
+
◀─────────── │ widget is collapsed │
|
|
56
|
+
└───────────────────────────┘
|
|
57
|
+
┌───────────────────────────┐
|
|
58
|
+
◀─────────── │ widget is minimized │
|
|
59
|
+
└───────────────────────────┘
|
|
60
|
+
┌───────────────────────────┐
|
|
61
|
+
◀─────────── │ transcript message │
|
|
62
|
+
└───────────────────────────┘
|
|
63
|
+
┌───────────────────────────┐
|
|
64
|
+
◀─────────── │ resize window │
|
|
65
|
+
└───────────────────────────┘
|
|
66
|
+
┌───────────────────────────┐
|
|
67
|
+
│ unmount iframe │ ───────────▶
|
|
68
|
+
└───────────────────────────┘
|
|
69
|
+
*/
|
|
70
|
+
|
|
36
71
|
declare const WindowDimensionsSchema: z.ZodObject<{
|
|
37
72
|
width: z.ZodNumber;
|
|
38
73
|
height: z.ZodNumber;
|
|
@@ -47,6 +82,9 @@ type WindowDimensions = z.infer<typeof WindowDimensionsSchema>;
|
|
|
47
82
|
declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
48
83
|
type: z.ZodLiteral<"update_config">;
|
|
49
84
|
payload: z.ZodObject<{
|
|
85
|
+
hostname: z.ZodString;
|
|
86
|
+
reconnectAttempts: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
87
|
+
debug: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
50
88
|
auth: z.ZodUnion<[z.ZodObject<{
|
|
51
89
|
type: z.ZodLiteral<"apiKey">;
|
|
52
90
|
value: z.ZodString;
|
|
@@ -66,17 +104,12 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
66
104
|
type: "accessToken";
|
|
67
105
|
value: string;
|
|
68
106
|
}>]>;
|
|
69
|
-
hostname: z.ZodString;
|
|
70
|
-
channels: z.ZodOptional<z.ZodNativeEnum<typeof _humeai_voice.Channels>>;
|
|
71
|
-
sampleRate: z.ZodOptional<z.ZodNumber>;
|
|
72
|
-
tts: z.ZodDefault<z.ZodOptional<z.ZodNativeEnum<typeof _humeai_voice.TTSService>>>;
|
|
73
|
-
speedRatio: z.ZodOptional<z.ZodNumber>;
|
|
74
|
-
reconnectAttempts: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
75
|
-
debug: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
76
|
-
systemPrompt: z.ZodOptional<z.ZodString>;
|
|
77
107
|
configId: z.ZodOptional<z.ZodString>;
|
|
78
|
-
|
|
108
|
+
configVersion: z.ZodOptional<z.ZodNumber>;
|
|
79
109
|
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
hostname: string;
|
|
111
|
+
reconnectAttempts: number;
|
|
112
|
+
debug: boolean;
|
|
80
113
|
auth: {
|
|
81
114
|
type: "apiKey";
|
|
82
115
|
value: string;
|
|
@@ -84,17 +117,10 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
84
117
|
type: "accessToken";
|
|
85
118
|
value: string;
|
|
86
119
|
};
|
|
87
|
-
hostname: string;
|
|
88
|
-
tts: _humeai_voice.TTSService;
|
|
89
|
-
reconnectAttempts: number;
|
|
90
|
-
debug: boolean;
|
|
91
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
92
|
-
sampleRate?: number | undefined;
|
|
93
|
-
speedRatio?: number | undefined;
|
|
94
|
-
systemPrompt?: string | undefined;
|
|
95
120
|
configId?: string | undefined;
|
|
96
|
-
|
|
121
|
+
configVersion?: number | undefined;
|
|
97
122
|
}, {
|
|
123
|
+
hostname: string;
|
|
98
124
|
auth: {
|
|
99
125
|
type: "apiKey";
|
|
100
126
|
value: string;
|
|
@@ -102,20 +128,17 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
102
128
|
type: "accessToken";
|
|
103
129
|
value: string;
|
|
104
130
|
};
|
|
105
|
-
hostname: string;
|
|
106
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
107
|
-
sampleRate?: number | undefined;
|
|
108
|
-
tts?: _humeai_voice.TTSService | undefined;
|
|
109
|
-
speedRatio?: number | undefined;
|
|
110
131
|
reconnectAttempts?: number | undefined;
|
|
111
132
|
debug?: boolean | undefined;
|
|
112
|
-
systemPrompt?: string | undefined;
|
|
113
133
|
configId?: string | undefined;
|
|
114
|
-
|
|
134
|
+
configVersion?: number | undefined;
|
|
115
135
|
}>;
|
|
116
136
|
}, "strip", z.ZodTypeAny, {
|
|
117
137
|
type: "update_config";
|
|
118
138
|
payload: {
|
|
139
|
+
hostname: string;
|
|
140
|
+
reconnectAttempts: number;
|
|
141
|
+
debug: boolean;
|
|
119
142
|
auth: {
|
|
120
143
|
type: "apiKey";
|
|
121
144
|
value: string;
|
|
@@ -123,20 +146,13 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
123
146
|
type: "accessToken";
|
|
124
147
|
value: string;
|
|
125
148
|
};
|
|
126
|
-
hostname: string;
|
|
127
|
-
tts: _humeai_voice.TTSService;
|
|
128
|
-
reconnectAttempts: number;
|
|
129
|
-
debug: boolean;
|
|
130
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
131
|
-
sampleRate?: number | undefined;
|
|
132
|
-
speedRatio?: number | undefined;
|
|
133
|
-
systemPrompt?: string | undefined;
|
|
134
149
|
configId?: string | undefined;
|
|
135
|
-
|
|
150
|
+
configVersion?: number | undefined;
|
|
136
151
|
};
|
|
137
152
|
}, {
|
|
138
153
|
type: "update_config";
|
|
139
154
|
payload: {
|
|
155
|
+
hostname: string;
|
|
140
156
|
auth: {
|
|
141
157
|
type: "apiKey";
|
|
142
158
|
value: string;
|
|
@@ -144,16 +160,10 @@ declare const ClientToFrameActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
144
160
|
type: "accessToken";
|
|
145
161
|
value: string;
|
|
146
162
|
};
|
|
147
|
-
hostname: string;
|
|
148
|
-
channels?: _humeai_voice.Channels | undefined;
|
|
149
|
-
sampleRate?: number | undefined;
|
|
150
|
-
tts?: _humeai_voice.TTSService | undefined;
|
|
151
|
-
speedRatio?: number | undefined;
|
|
152
163
|
reconnectAttempts?: number | undefined;
|
|
153
164
|
debug?: boolean | undefined;
|
|
154
|
-
systemPrompt?: string | undefined;
|
|
155
165
|
configId?: string | undefined;
|
|
156
|
-
|
|
166
|
+
configVersion?: number | undefined;
|
|
157
167
|
};
|
|
158
168
|
}>, z.ZodObject<{
|
|
159
169
|
type: z.ZodLiteral<"cancel">;
|
|
@@ -395,6 +405,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
395
405
|
end: number;
|
|
396
406
|
} | null | undefined;
|
|
397
407
|
}>;
|
|
408
|
+
from_tts: z.ZodCatch<z.ZodBoolean>;
|
|
398
409
|
}, "strip", z.ZodTypeAny, {
|
|
399
410
|
type: "assistant_message";
|
|
400
411
|
message: {
|
|
@@ -411,6 +422,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
411
422
|
end: number;
|
|
412
423
|
} | null | undefined;
|
|
413
424
|
};
|
|
425
|
+
from_tts: boolean;
|
|
414
426
|
}, {
|
|
415
427
|
type: "assistant_message";
|
|
416
428
|
message: {
|
|
@@ -427,6 +439,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
427
439
|
end: number;
|
|
428
440
|
} | null | undefined;
|
|
429
441
|
};
|
|
442
|
+
from_tts?: unknown;
|
|
430
443
|
}>, {
|
|
431
444
|
type: "assistant_message";
|
|
432
445
|
message: {
|
|
@@ -443,6 +456,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
443
456
|
end: number;
|
|
444
457
|
} | null | undefined;
|
|
445
458
|
};
|
|
459
|
+
from_tts: boolean;
|
|
446
460
|
} & {
|
|
447
461
|
receivedAt: Date;
|
|
448
462
|
}, {
|
|
@@ -461,6 +475,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
461
475
|
end: number;
|
|
462
476
|
} | null | undefined;
|
|
463
477
|
};
|
|
478
|
+
from_tts?: unknown;
|
|
464
479
|
}>]>;
|
|
465
480
|
}, "strip", z.ZodTypeAny, {
|
|
466
481
|
type: "transcript_message";
|
|
@@ -497,6 +512,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
497
512
|
end: number;
|
|
498
513
|
} | null | undefined;
|
|
499
514
|
};
|
|
515
|
+
from_tts: boolean;
|
|
500
516
|
} & {
|
|
501
517
|
receivedAt: Date;
|
|
502
518
|
});
|
|
@@ -533,6 +549,7 @@ declare const FrameToClientActionSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
533
549
|
end: number;
|
|
534
550
|
} | null | undefined;
|
|
535
551
|
};
|
|
552
|
+
from_tts?: unknown;
|
|
536
553
|
};
|
|
537
554
|
}>, z.ZodObject<{
|
|
538
555
|
type: z.ZodLiteral<"resize_frame">;
|
|
@@ -572,7 +589,7 @@ declare const MINIMIZE_WIDGET_ACTION: {
|
|
|
572
589
|
declare const WIDGET_IFRAME_IS_READY_ACTION: {
|
|
573
590
|
type: "widget_iframe_is_ready";
|
|
574
591
|
};
|
|
575
|
-
declare const TRANSCRIPT_MESSAGE_ACTION: (message: UserTranscriptMessage |
|
|
592
|
+
declare const TRANSCRIPT_MESSAGE_ACTION: (message: UserTranscriptMessage | AssistantTranscriptMessage) => {
|
|
576
593
|
type: "transcript_message";
|
|
577
594
|
payload: ({
|
|
578
595
|
type: "user_message";
|
|
@@ -607,6 +624,7 @@ declare const TRANSCRIPT_MESSAGE_ACTION: (message: UserTranscriptMessage | Agent
|
|
|
607
624
|
end: number;
|
|
608
625
|
} | null | undefined;
|
|
609
626
|
};
|
|
627
|
+
from_tts: boolean;
|
|
610
628
|
} & {
|
|
611
629
|
receivedAt: Date;
|
|
612
630
|
});
|
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@ var WindowDimensionsSchema = import_zod.z.object({
|
|
|
45
45
|
var ClientToFrameActionSchema = import_zod.z.union([
|
|
46
46
|
import_zod.z.object({
|
|
47
47
|
type: import_zod.z.literal("update_config"),
|
|
48
|
-
payload: import_voice.
|
|
48
|
+
payload: import_voice.SocketConfigSchema
|
|
49
49
|
}),
|
|
50
50
|
import_zod.z.object({
|
|
51
51
|
type: import_zod.z.literal("cancel")
|
|
@@ -98,7 +98,7 @@ var FrameToClientActionSchema = import_zod.z.union([
|
|
|
98
98
|
type: import_zod.z.literal("transcript_message"),
|
|
99
99
|
payload: import_zod.z.union([
|
|
100
100
|
import_voice.UserTranscriptMessageSchema,
|
|
101
|
-
import_voice.
|
|
101
|
+
import_voice.AssistantTranscriptMessageSchema
|
|
102
102
|
])
|
|
103
103
|
}),
|
|
104
104
|
import_zod.z.object({
|
|
@@ -145,30 +145,36 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
145
145
|
config;
|
|
146
146
|
onMessage;
|
|
147
147
|
onClose;
|
|
148
|
+
openOnMount;
|
|
148
149
|
constructor({
|
|
149
150
|
onMessage = () => {
|
|
150
151
|
},
|
|
151
152
|
onClose = () => {
|
|
152
153
|
},
|
|
154
|
+
openOnMount,
|
|
153
155
|
...config
|
|
154
156
|
}) {
|
|
155
157
|
this.config = config;
|
|
156
158
|
this.iframe = this.createIframe(config);
|
|
157
159
|
this.onMessage = onMessage;
|
|
158
160
|
this.onClose = onClose;
|
|
161
|
+
this.openOnMount = openOnMount ?? false;
|
|
162
|
+
this.messageHandler = this.messageHandler.bind(this);
|
|
159
163
|
this.messageHandler = this.messageHandler.bind(this);
|
|
160
164
|
}
|
|
161
165
|
static create({
|
|
162
166
|
rendererUrl,
|
|
163
167
|
onMessage,
|
|
164
168
|
onClose,
|
|
169
|
+
openOnMount,
|
|
165
170
|
...config
|
|
166
171
|
}) {
|
|
167
|
-
const parsedConfig = (0, import_voice2.
|
|
172
|
+
const parsedConfig = (0, import_voice2.createSocketConfig)(config);
|
|
168
173
|
return new _EmbeddedVoice({
|
|
169
174
|
rendererUrl: rendererUrl ?? "https://voice-widget.hume.ai",
|
|
170
175
|
onMessage,
|
|
171
176
|
onClose,
|
|
177
|
+
openOnMount,
|
|
172
178
|
...parsedConfig
|
|
173
179
|
});
|
|
174
180
|
}
|
|
@@ -211,7 +217,7 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
211
217
|
position: "fixed",
|
|
212
218
|
bottom: "0",
|
|
213
219
|
right: "0",
|
|
214
|
-
|
|
220
|
+
margin: "24px",
|
|
215
221
|
zIndex: "999999",
|
|
216
222
|
fontSize: "0px",
|
|
217
223
|
pointerEvents: "none"
|
|
@@ -220,7 +226,7 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
220
226
|
document.body.appendChild(div);
|
|
221
227
|
return div;
|
|
222
228
|
}
|
|
223
|
-
createIframe({ rendererUrl }) {
|
|
229
|
+
createIframe({ rendererUrl, iframeTitle }) {
|
|
224
230
|
const el = document.createElement("iframe");
|
|
225
231
|
Object.assign(el.style, {
|
|
226
232
|
backgroundColor: "transparent",
|
|
@@ -232,6 +238,7 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
232
238
|
});
|
|
233
239
|
el.id = "hume-embedded-voice";
|
|
234
240
|
el.src = `${rendererUrl}`;
|
|
241
|
+
el.setAttribute("title", iframeTitle ?? "Hume Empathic Voice Widget");
|
|
235
242
|
el.setAttribute("frameborder", "0");
|
|
236
243
|
el.setAttribute("allowtransparency", "true");
|
|
237
244
|
el.setAttribute("scrolling", "no");
|
|
@@ -258,6 +265,9 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
258
265
|
this.showIframe();
|
|
259
266
|
this.sendConfigObject();
|
|
260
267
|
this.sendWindowSize();
|
|
268
|
+
if (this.openOnMount) {
|
|
269
|
+
this.openEmbed();
|
|
270
|
+
}
|
|
261
271
|
break;
|
|
262
272
|
}
|
|
263
273
|
case "resize_frame": {
|
|
@@ -276,8 +286,8 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
276
286
|
}
|
|
277
287
|
openEmbed() {
|
|
278
288
|
const action = EXPAND_FROM_CLIENT_ACTION({
|
|
279
|
-
width: window.
|
|
280
|
-
height: window.
|
|
289
|
+
width: window.screen.availWidth,
|
|
290
|
+
height: window.screen.availHeight
|
|
281
291
|
});
|
|
282
292
|
this.sendMessageToFrame(action);
|
|
283
293
|
}
|
|
@@ -287,8 +297,8 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
287
297
|
}
|
|
288
298
|
sendWindowSize() {
|
|
289
299
|
const action = SEND_WINDOW_SIZE_ACTION({
|
|
290
|
-
width: window.
|
|
291
|
-
height: window.
|
|
300
|
+
width: window.screen.availWidth,
|
|
301
|
+
height: window.screen.availHeight
|
|
292
302
|
});
|
|
293
303
|
this.sendMessageToFrame(action);
|
|
294
304
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/embed.ts","../src/lib/embed-messages.ts"],"sourcesContent":["export * from './lib/embed';\n\nexport {\n COLLAPSE_WIDGET_ACTION,\n EXPAND_WIDGET_ACTION,\n MINIMIZE_WIDGET_ACTION,\n RESIZE_FRAME_ACTION,\n TRANSCRIPT_MESSAGE_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n parseClientToFrameAction,\n type FrameToClientAction,\n type WindowDimensions,\n} from './lib/embed-messages';\n\nexport type {\n AgentTranscriptMessage,\n Config,\n JSONMessage,\n UserTranscriptMessage,\n EmotionScores,\n} from '@humeai/voice';\n\nexport { LanguageModelOption } from '@humeai/voice';\n","import type {\n AgentTranscriptMessage,\n Config,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport { createConfig } from '@humeai/voice';\n\nimport type { ClientToFrameAction } from './embed-messages';\nimport {\n EXPAND_FROM_CLIENT_ACTION,\n FrameToClientActionSchema,\n SEND_WINDOW_SIZE_ACTION,\n UPDATE_CONFIG_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n} from './embed-messages';\n\nexport type EmbeddedVoiceConfig = {\n rendererUrl: string;\n} & Config;\n\nexport type TranscriptMessageHandler = (\n message: UserTranscriptMessage | AgentTranscriptMessage,\n) => void;\n\nexport type CloseHandler = () => void;\n\nexport class EmbeddedVoice {\n private iframe: HTMLIFrameElement;\n\n private isMounted: boolean = false;\n\n private managedContainer: HTMLElement | null = null;\n\n private config: EmbeddedVoiceConfig;\n\n private onMessage: TranscriptMessageHandler;\n\n private onClose: CloseHandler;\n\n private constructor({\n onMessage = () => {},\n onClose = () => {},\n ...config\n }: {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n } & EmbeddedVoiceConfig) {\n this.config = config;\n this.iframe = this.createIframe(config);\n this.onMessage = onMessage;\n this.onClose = onClose;\n this.messageHandler = this.messageHandler.bind(this);\n }\n\n static create({\n rendererUrl,\n onMessage,\n onClose,\n ...config\n }: Partial<EmbeddedVoiceConfig> & {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n } & NonNullable<Pick<EmbeddedVoiceConfig, 'auth'>>): EmbeddedVoice {\n const parsedConfig = createConfig(config);\n\n return new EmbeddedVoice({\n rendererUrl: rendererUrl ?? 'https://voice-widget.hume.ai',\n onMessage,\n onClose,\n ...parsedConfig,\n });\n }\n\n mount(container?: HTMLElement) {\n const messageHandler = (event: MessageEvent<unknown>) => {\n this.messageHandler(event);\n };\n\n const resizeHandler = () => {\n this.sendWindowSize();\n };\n\n const el = container ?? this.createContainer();\n\n this.managedContainer = el;\n\n try {\n window.addEventListener('message', messageHandler);\n window.addEventListener('resize', resizeHandler);\n el.appendChild(this.iframe);\n this.isMounted = true;\n } catch (e) {\n this.isMounted = false;\n }\n\n const unmount = () => {\n try {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('resize', resizeHandler);\n this.iframe.remove();\n this.isMounted = false;\n } catch (e) {\n this.isMounted = true;\n }\n\n if (!container) {\n el.remove();\n }\n };\n\n return unmount;\n }\n\n private createContainer() {\n const div = document.createElement('div');\n\n Object.assign(div.style, {\n background: 'transparent',\n position: 'fixed',\n bottom: '0',\n right: '0',\n padding: '24px',\n zIndex: '999999',\n fontSize: '0px',\n pointerEvents: 'none',\n });\n\n div.id = 'hume-embedded-voice-container';\n\n document.body.appendChild(div);\n\n return div;\n }\n\n private createIframe({ rendererUrl }: EmbeddedVoiceConfig) {\n const el = document.createElement('iframe');\n\n Object.assign(el.style, {\n backgroundColor: 'transparent',\n backgroundImage: 'none',\n border: 'none',\n height: '0px',\n width: '0px',\n opacity: '0',\n });\n\n el.id = 'hume-embedded-voice';\n\n el.src = `${rendererUrl}`;\n\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowtransparency', 'true');\n el.setAttribute('scrolling', 'no');\n el.setAttribute('allow', 'microphone');\n\n if (el.contentWindow) {\n el.contentWindow.document.documentElement.style.backgroundColor =\n 'transparent';\n el.contentWindow.document.body.style.backgroundColor = 'transparent';\n }\n\n return el;\n }\n\n private messageHandler(event: MessageEvent<unknown>) {\n if (!this.iframe) {\n return;\n }\n\n if (event.origin !== new URL(this.iframe.src).origin) {\n return;\n }\n\n const action = FrameToClientActionSchema.safeParse(event.data);\n\n if (!action.success) {\n return;\n }\n\n switch (action.data.type) {\n case WIDGET_IFRAME_IS_READY_ACTION.type: {\n this.showIframe();\n this.sendConfigObject();\n this.sendWindowSize();\n break;\n }\n case 'resize_frame': {\n this.resizeIframe(action.data.payload);\n break;\n }\n case 'transcript_message': {\n this.onMessage(action.data.payload);\n break;\n }\n case 'collapse_widget': {\n this.onClose();\n break;\n }\n }\n }\n\n openEmbed() {\n const action = EXPAND_FROM_CLIENT_ACTION({\n width: window.document.body.clientWidth,\n height: window.document.body.clientHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendConfigObject() {\n const action = UPDATE_CONFIG_ACTION(this.config);\n this.sendMessageToFrame(action);\n }\n\n private sendWindowSize() {\n const action = SEND_WINDOW_SIZE_ACTION({\n width: window.document.body.clientWidth,\n height: window.document.body.clientHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendMessageToFrame(action: ClientToFrameAction) {\n const frame = this.iframe;\n\n if (!frame.contentWindow) {\n return;\n }\n\n frame.contentWindow.postMessage(action, new URL(frame.src).origin);\n }\n\n private showIframe() {\n this.iframe.style.opacity = '1';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'all';\n }\n }\n\n private hideIframe() {\n this.iframe.style.opacity = '0';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'none';\n }\n }\n\n private resizeIframe({ width, height }: { width: number; height: number }) {\n this.iframe.style.width = `${width}px`;\n this.iframe.style.height = `${height}px`;\n }\n}\n","/** \n \n client frame \n \n ┌───────────────────────────┐ \n │ mount iframe │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ iframe is ready │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ send config │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ widget is open │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is collapsed │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is minimized │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ transcript message │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ resize window │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ unmount iframe │ ───────────▶ \n └───────────────────────────┘ \n */\nimport type {\n AgentTranscriptMessage,\n Config,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport {\n AgentTranscriptMessageSchema,\n ConfigSchema,\n UserTranscriptMessageSchema,\n} from '@humeai/voice';\nimport { z } from 'zod';\n\nconst WindowDimensionsSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport type WindowDimensions = z.infer<typeof WindowDimensionsSchema>;\n\n// ---------------------------------------------------------------------------\n// Client to frame actions\n// ---------------------------------------------------------------------------\nexport const ClientToFrameActionSchema = z.union([\n z.object({\n type: z.literal('update_config'),\n payload: ConfigSchema,\n }),\n z.object({\n type: z.literal('cancel'),\n }),\n z.object({\n type: z.literal('expand_widget_from_client'),\n payload: WindowDimensionsSchema,\n }),\n z.object({\n type: z.literal('send_window_size'),\n payload: WindowDimensionsSchema,\n }),\n]);\n\nexport type ClientToFrameAction = z.infer<typeof ClientToFrameActionSchema>;\n\nexport const UPDATE_CONFIG_ACTION = (config: Config) =>\n ({\n type: 'update_config',\n payload: config,\n }) satisfies ClientToFrameAction;\n\nexport const EXPAND_FROM_CLIENT_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'expand_widget_from_client',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const SEND_WINDOW_SIZE_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'send_window_size',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const parseClientToFrameAction = (\n data: unknown,\n): Promise<ClientToFrameAction> => {\n return new Promise((resolve, reject) => {\n try {\n const value = ClientToFrameActionSchema.parse(data);\n resolve(value);\n } catch (error) {\n reject(error);\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// Frame to client actions\n// ---------------------------------------------------------------------------\nexport const FrameToClientActionSchema = z.union([\n z.object({\n type: z.literal('expand_widget'),\n }),\n z.object({\n type: z.literal('collapse_widget'),\n }),\n z.object({\n type: z.literal('minimize_widget'),\n }),\n z.object({\n type: z.literal('widget_iframe_is_ready'),\n }),\n z.object({\n type: z.literal('transcript_message'),\n payload: z.union([\n UserTranscriptMessageSchema,\n AgentTranscriptMessageSchema,\n ]),\n }),\n z.object({\n type: z.literal('resize_frame'),\n payload: z.object({\n width: z.number(),\n height: z.number(),\n }),\n }),\n]);\n\nexport type FrameToClientAction = z.infer<typeof FrameToClientActionSchema>;\n\nexport const EXPAND_WIDGET_ACTION = {\n type: 'expand_widget',\n} satisfies FrameToClientAction;\n\nexport const COLLAPSE_WIDGET_ACTION = {\n type: 'collapse_widget' as const,\n} satisfies FrameToClientAction;\n\nexport const MINIMIZE_WIDGET_ACTION = {\n type: 'minimize_widget',\n} satisfies FrameToClientAction;\n\nexport const WIDGET_IFRAME_IS_READY_ACTION = {\n type: 'widget_iframe_is_ready',\n} satisfies FrameToClientAction;\n\nexport const TRANSCRIPT_MESSAGE_ACTION = (\n message: UserTranscriptMessage | AgentTranscriptMessage,\n) => {\n return {\n type: 'transcript_message',\n payload: message,\n } satisfies FrameToClientAction;\n};\n\nexport const RESIZE_FRAME_ACTION = (dimensions: {\n width: number;\n height: number;\n}) => {\n return {\n type: 'resize_frame',\n payload: {\n width: dimensions.width,\n height: dimensions.height,\n },\n } satisfies FrameToClientAction;\n};\n"],"mappings":"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","names":["import_voice","import_voice"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/embed.ts","../src/lib/embed-messages.ts"],"sourcesContent":["export * from './lib/embed';\n\nexport {\n COLLAPSE_WIDGET_ACTION,\n EXPAND_WIDGET_ACTION,\n MINIMIZE_WIDGET_ACTION,\n RESIZE_FRAME_ACTION,\n TRANSCRIPT_MESSAGE_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n parseClientToFrameAction,\n type FrameToClientAction,\n type WindowDimensions,\n} from './lib/embed-messages';\n\nexport type {\n AssistantTranscriptMessage,\n SocketConfig,\n JSONMessage,\n UserTranscriptMessage,\n EmotionScores,\n} from '@humeai/voice';\n\nexport { LanguageModelOption } from '@humeai/voice';\n","import type {\n AssistantTranscriptMessage,\n SocketConfig,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport { createSocketConfig } from '@humeai/voice';\n\nimport type { ClientToFrameAction } from './embed-messages';\nimport {\n EXPAND_FROM_CLIENT_ACTION,\n FrameToClientActionSchema,\n SEND_WINDOW_SIZE_ACTION,\n UPDATE_CONFIG_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n} from './embed-messages';\n\nexport type EmbeddedVoiceConfig = {\n rendererUrl: string;\n iframeTitle?: string;\n} & SocketConfig;\n\nexport type TranscriptMessageHandler = (\n message: UserTranscriptMessage | AssistantTranscriptMessage,\n) => void;\n\nexport type CloseHandler = () => void;\n\nexport class EmbeddedVoice {\n private iframe: HTMLIFrameElement;\n\n private isMounted: boolean = false;\n\n private managedContainer: HTMLElement | null = null;\n\n private config: EmbeddedVoiceConfig;\n\n private onMessage: TranscriptMessageHandler;\n\n private onClose: CloseHandler;\n\n private openOnMount: boolean;\n\n private constructor({\n onMessage = () => {},\n onClose = () => {},\n openOnMount,\n ...config\n }: {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n openOnMount?: boolean;\n } & EmbeddedVoiceConfig) {\n this.config = config;\n this.iframe = this.createIframe(config);\n this.onMessage = onMessage;\n this.onClose = onClose;\n this.openOnMount = openOnMount ?? false;\n this.messageHandler = this.messageHandler.bind(this);\n this.messageHandler = this.messageHandler.bind(this);\n }\n\n static create({\n rendererUrl,\n onMessage,\n onClose,\n openOnMount,\n ...config\n }: Partial<EmbeddedVoiceConfig> & {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n openOnMount?: boolean;\n } & NonNullable<Pick<EmbeddedVoiceConfig, 'auth'>>): EmbeddedVoice {\n const parsedConfig = createSocketConfig(config);\n\n return new EmbeddedVoice({\n rendererUrl: rendererUrl ?? 'https://voice-widget.hume.ai',\n onMessage,\n onClose,\n openOnMount,\n ...parsedConfig,\n });\n }\n\n mount(container?: HTMLElement) {\n const messageHandler = (event: MessageEvent<unknown>) => {\n this.messageHandler(event);\n };\n\n const resizeHandler = () => {\n this.sendWindowSize();\n };\n\n const el = container ?? this.createContainer();\n\n this.managedContainer = el;\n\n try {\n window.addEventListener('message', messageHandler);\n window.addEventListener('resize', resizeHandler);\n el.appendChild(this.iframe);\n this.isMounted = true;\n } catch (e) {\n this.isMounted = false;\n }\n\n const unmount = () => {\n try {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('resize', resizeHandler);\n this.iframe.remove();\n this.isMounted = false;\n } catch (e) {\n this.isMounted = true;\n }\n\n if (!container) {\n el.remove();\n }\n };\n\n return unmount;\n }\n\n private createContainer() {\n const div = document.createElement('div');\n\n Object.assign(div.style, {\n background: 'transparent',\n position: 'fixed',\n bottom: '0',\n right: '0',\n margin: '24px',\n zIndex: '999999',\n fontSize: '0px',\n pointerEvents: 'none',\n });\n\n div.id = 'hume-embedded-voice-container';\n\n document.body.appendChild(div);\n\n return div;\n }\n\n private createIframe({ rendererUrl, iframeTitle }: EmbeddedVoiceConfig) {\n const el = document.createElement('iframe');\n\n Object.assign(el.style, {\n backgroundColor: 'transparent',\n backgroundImage: 'none',\n border: 'none',\n height: '0px',\n width: '0px',\n opacity: '0',\n });\n\n el.id = 'hume-embedded-voice';\n el.src = `${rendererUrl}`;\n\n el.setAttribute('title', iframeTitle ?? 'Hume Empathic Voice Widget');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowtransparency', 'true');\n el.setAttribute('scrolling', 'no');\n el.setAttribute('allow', 'microphone');\n\n if (el.contentWindow) {\n el.contentWindow.document.documentElement.style.backgroundColor =\n 'transparent';\n el.contentWindow.document.body.style.backgroundColor = 'transparent';\n }\n\n return el;\n }\n\n private messageHandler(event: MessageEvent<unknown>) {\n if (!this.iframe) {\n return;\n }\n\n if (event.origin !== new URL(this.iframe.src).origin) {\n return;\n }\n\n const action = FrameToClientActionSchema.safeParse(event.data);\n\n if (!action.success) {\n return;\n }\n\n switch (action.data.type) {\n case WIDGET_IFRAME_IS_READY_ACTION.type: {\n this.showIframe();\n this.sendConfigObject();\n this.sendWindowSize();\n if (this.openOnMount) {\n this.openEmbed();\n }\n break;\n }\n case 'resize_frame': {\n this.resizeIframe(action.data.payload);\n break;\n }\n case 'transcript_message': {\n this.onMessage(action.data.payload);\n break;\n }\n case 'collapse_widget': {\n this.onClose();\n break;\n }\n }\n }\n\n openEmbed() {\n const action = EXPAND_FROM_CLIENT_ACTION({\n width: window.screen.availWidth,\n height: window.screen.availHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendConfigObject() {\n const action = UPDATE_CONFIG_ACTION(this.config);\n this.sendMessageToFrame(action);\n }\n\n private sendWindowSize() {\n const action = SEND_WINDOW_SIZE_ACTION({\n width: window.screen.availWidth,\n height: window.screen.availHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendMessageToFrame(action: ClientToFrameAction) {\n const frame = this.iframe;\n\n if (!frame.contentWindow) {\n return;\n }\n\n frame.contentWindow.postMessage(action, new URL(frame.src).origin);\n }\n\n private showIframe() {\n this.iframe.style.opacity = '1';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'all';\n }\n }\n\n private hideIframe() {\n this.iframe.style.opacity = '0';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'none';\n }\n }\n\n private resizeIframe({ width, height }: { width: number; height: number }) {\n this.iframe.style.width = `${width}px`;\n this.iframe.style.height = `${height}px`;\n }\n}\n","/** \n \n client frame \n \n ┌───────────────────────────┐ \n │ mount iframe │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ iframe is ready │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ send config │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ widget is open │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is collapsed │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is minimized │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ transcript message │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ resize window │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ unmount iframe │ ───────────▶ \n └───────────────────────────┘ \n */\nimport type {\n AssistantTranscriptMessage,\n SocketConfig,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport {\n AssistantTranscriptMessageSchema,\n SocketConfigSchema,\n UserTranscriptMessageSchema,\n} from '@humeai/voice';\nimport { z } from 'zod';\n\nconst WindowDimensionsSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport type WindowDimensions = z.infer<typeof WindowDimensionsSchema>;\n\n// ---------------------------------------------------------------------------\n// Client to frame actions\n// ---------------------------------------------------------------------------\nexport const ClientToFrameActionSchema = z.union([\n z.object({\n type: z.literal('update_config'),\n payload: SocketConfigSchema,\n }),\n z.object({\n type: z.literal('cancel'),\n }),\n z.object({\n type: z.literal('expand_widget_from_client'),\n payload: WindowDimensionsSchema,\n }),\n z.object({\n type: z.literal('send_window_size'),\n payload: WindowDimensionsSchema,\n }),\n]);\n\nexport type ClientToFrameAction = z.infer<typeof ClientToFrameActionSchema>;\n\nexport const UPDATE_CONFIG_ACTION = (config: SocketConfig) =>\n ({\n type: 'update_config',\n payload: config,\n }) satisfies ClientToFrameAction;\n\nexport const EXPAND_FROM_CLIENT_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'expand_widget_from_client',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const SEND_WINDOW_SIZE_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'send_window_size',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const parseClientToFrameAction = (\n data: unknown,\n): Promise<ClientToFrameAction> => {\n return new Promise((resolve, reject) => {\n try {\n const value = ClientToFrameActionSchema.parse(data);\n resolve(value);\n } catch (error) {\n reject(error);\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// Frame to client actions\n// ---------------------------------------------------------------------------\nexport const FrameToClientActionSchema = z.union([\n z.object({\n type: z.literal('expand_widget'),\n }),\n z.object({\n type: z.literal('collapse_widget'),\n }),\n z.object({\n type: z.literal('minimize_widget'),\n }),\n z.object({\n type: z.literal('widget_iframe_is_ready'),\n }),\n z.object({\n type: z.literal('transcript_message'),\n payload: z.union([\n UserTranscriptMessageSchema,\n AssistantTranscriptMessageSchema,\n ]),\n }),\n z.object({\n type: z.literal('resize_frame'),\n payload: z.object({\n width: z.number(),\n height: z.number(),\n }),\n }),\n]);\n\nexport type FrameToClientAction = z.infer<typeof FrameToClientActionSchema>;\n\nexport const EXPAND_WIDGET_ACTION = {\n type: 'expand_widget',\n} satisfies FrameToClientAction;\n\nexport const COLLAPSE_WIDGET_ACTION = {\n type: 'collapse_widget' as const,\n} satisfies FrameToClientAction;\n\nexport const MINIMIZE_WIDGET_ACTION = {\n type: 'minimize_widget',\n} satisfies FrameToClientAction;\n\nexport const WIDGET_IFRAME_IS_READY_ACTION = {\n type: 'widget_iframe_is_ready',\n} satisfies FrameToClientAction;\n\nexport const TRANSCRIPT_MESSAGE_ACTION = (\n message: UserTranscriptMessage | AssistantTranscriptMessage,\n) => {\n return {\n type: 'transcript_message',\n payload: message,\n } satisfies FrameToClientAction;\n};\n\nexport const RESIZE_FRAME_ACTION = (dimensions: {\n width: number;\n height: number;\n}) => {\n return {\n type: 'resize_frame',\n payload: {\n width: dimensions.width,\n height: dimensions.height,\n },\n } satisfies FrameToClientAction;\n};\n"],"mappings":"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","names":["import_voice","import_voice"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// src/lib/embed.ts
|
|
2
|
-
import {
|
|
2
|
+
import { createSocketConfig } from "@humeai/voice";
|
|
3
3
|
|
|
4
4
|
// src/lib/embed-messages.ts
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
AssistantTranscriptMessageSchema,
|
|
7
|
+
SocketConfigSchema,
|
|
8
8
|
UserTranscriptMessageSchema
|
|
9
9
|
} from "@humeai/voice";
|
|
10
10
|
import { z } from "zod";
|
|
@@ -15,7 +15,7 @@ var WindowDimensionsSchema = z.object({
|
|
|
15
15
|
var ClientToFrameActionSchema = z.union([
|
|
16
16
|
z.object({
|
|
17
17
|
type: z.literal("update_config"),
|
|
18
|
-
payload:
|
|
18
|
+
payload: SocketConfigSchema
|
|
19
19
|
}),
|
|
20
20
|
z.object({
|
|
21
21
|
type: z.literal("cancel")
|
|
@@ -68,7 +68,7 @@ var FrameToClientActionSchema = z.union([
|
|
|
68
68
|
type: z.literal("transcript_message"),
|
|
69
69
|
payload: z.union([
|
|
70
70
|
UserTranscriptMessageSchema,
|
|
71
|
-
|
|
71
|
+
AssistantTranscriptMessageSchema
|
|
72
72
|
])
|
|
73
73
|
}),
|
|
74
74
|
z.object({
|
|
@@ -115,30 +115,36 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
115
115
|
config;
|
|
116
116
|
onMessage;
|
|
117
117
|
onClose;
|
|
118
|
+
openOnMount;
|
|
118
119
|
constructor({
|
|
119
120
|
onMessage = () => {
|
|
120
121
|
},
|
|
121
122
|
onClose = () => {
|
|
122
123
|
},
|
|
124
|
+
openOnMount,
|
|
123
125
|
...config
|
|
124
126
|
}) {
|
|
125
127
|
this.config = config;
|
|
126
128
|
this.iframe = this.createIframe(config);
|
|
127
129
|
this.onMessage = onMessage;
|
|
128
130
|
this.onClose = onClose;
|
|
131
|
+
this.openOnMount = openOnMount ?? false;
|
|
132
|
+
this.messageHandler = this.messageHandler.bind(this);
|
|
129
133
|
this.messageHandler = this.messageHandler.bind(this);
|
|
130
134
|
}
|
|
131
135
|
static create({
|
|
132
136
|
rendererUrl,
|
|
133
137
|
onMessage,
|
|
134
138
|
onClose,
|
|
139
|
+
openOnMount,
|
|
135
140
|
...config
|
|
136
141
|
}) {
|
|
137
|
-
const parsedConfig =
|
|
142
|
+
const parsedConfig = createSocketConfig(config);
|
|
138
143
|
return new _EmbeddedVoice({
|
|
139
144
|
rendererUrl: rendererUrl ?? "https://voice-widget.hume.ai",
|
|
140
145
|
onMessage,
|
|
141
146
|
onClose,
|
|
147
|
+
openOnMount,
|
|
142
148
|
...parsedConfig
|
|
143
149
|
});
|
|
144
150
|
}
|
|
@@ -181,7 +187,7 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
181
187
|
position: "fixed",
|
|
182
188
|
bottom: "0",
|
|
183
189
|
right: "0",
|
|
184
|
-
|
|
190
|
+
margin: "24px",
|
|
185
191
|
zIndex: "999999",
|
|
186
192
|
fontSize: "0px",
|
|
187
193
|
pointerEvents: "none"
|
|
@@ -190,7 +196,7 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
190
196
|
document.body.appendChild(div);
|
|
191
197
|
return div;
|
|
192
198
|
}
|
|
193
|
-
createIframe({ rendererUrl }) {
|
|
199
|
+
createIframe({ rendererUrl, iframeTitle }) {
|
|
194
200
|
const el = document.createElement("iframe");
|
|
195
201
|
Object.assign(el.style, {
|
|
196
202
|
backgroundColor: "transparent",
|
|
@@ -202,6 +208,7 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
202
208
|
});
|
|
203
209
|
el.id = "hume-embedded-voice";
|
|
204
210
|
el.src = `${rendererUrl}`;
|
|
211
|
+
el.setAttribute("title", iframeTitle ?? "Hume Empathic Voice Widget");
|
|
205
212
|
el.setAttribute("frameborder", "0");
|
|
206
213
|
el.setAttribute("allowtransparency", "true");
|
|
207
214
|
el.setAttribute("scrolling", "no");
|
|
@@ -228,6 +235,9 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
228
235
|
this.showIframe();
|
|
229
236
|
this.sendConfigObject();
|
|
230
237
|
this.sendWindowSize();
|
|
238
|
+
if (this.openOnMount) {
|
|
239
|
+
this.openEmbed();
|
|
240
|
+
}
|
|
231
241
|
break;
|
|
232
242
|
}
|
|
233
243
|
case "resize_frame": {
|
|
@@ -246,8 +256,8 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
246
256
|
}
|
|
247
257
|
openEmbed() {
|
|
248
258
|
const action = EXPAND_FROM_CLIENT_ACTION({
|
|
249
|
-
width: window.
|
|
250
|
-
height: window.
|
|
259
|
+
width: window.screen.availWidth,
|
|
260
|
+
height: window.screen.availHeight
|
|
251
261
|
});
|
|
252
262
|
this.sendMessageToFrame(action);
|
|
253
263
|
}
|
|
@@ -257,8 +267,8 @@ var EmbeddedVoice = class _EmbeddedVoice {
|
|
|
257
267
|
}
|
|
258
268
|
sendWindowSize() {
|
|
259
269
|
const action = SEND_WINDOW_SIZE_ACTION({
|
|
260
|
-
width: window.
|
|
261
|
-
height: window.
|
|
270
|
+
width: window.screen.availWidth,
|
|
271
|
+
height: window.screen.availHeight
|
|
262
272
|
});
|
|
263
273
|
this.sendMessageToFrame(action);
|
|
264
274
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/embed.ts","../src/lib/embed-messages.ts","../src/index.ts"],"sourcesContent":["import type {\n AgentTranscriptMessage,\n Config,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport { createConfig } from '@humeai/voice';\n\nimport type { ClientToFrameAction } from './embed-messages';\nimport {\n EXPAND_FROM_CLIENT_ACTION,\n FrameToClientActionSchema,\n SEND_WINDOW_SIZE_ACTION,\n UPDATE_CONFIG_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n} from './embed-messages';\n\nexport type EmbeddedVoiceConfig = {\n rendererUrl: string;\n} & Config;\n\nexport type TranscriptMessageHandler = (\n message: UserTranscriptMessage | AgentTranscriptMessage,\n) => void;\n\nexport type CloseHandler = () => void;\n\nexport class EmbeddedVoice {\n private iframe: HTMLIFrameElement;\n\n private isMounted: boolean = false;\n\n private managedContainer: HTMLElement | null = null;\n\n private config: EmbeddedVoiceConfig;\n\n private onMessage: TranscriptMessageHandler;\n\n private onClose: CloseHandler;\n\n private constructor({\n onMessage = () => {},\n onClose = () => {},\n ...config\n }: {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n } & EmbeddedVoiceConfig) {\n this.config = config;\n this.iframe = this.createIframe(config);\n this.onMessage = onMessage;\n this.onClose = onClose;\n this.messageHandler = this.messageHandler.bind(this);\n }\n\n static create({\n rendererUrl,\n onMessage,\n onClose,\n ...config\n }: Partial<EmbeddedVoiceConfig> & {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n } & NonNullable<Pick<EmbeddedVoiceConfig, 'auth'>>): EmbeddedVoice {\n const parsedConfig = createConfig(config);\n\n return new EmbeddedVoice({\n rendererUrl: rendererUrl ?? 'https://voice-widget.hume.ai',\n onMessage,\n onClose,\n ...parsedConfig,\n });\n }\n\n mount(container?: HTMLElement) {\n const messageHandler = (event: MessageEvent<unknown>) => {\n this.messageHandler(event);\n };\n\n const resizeHandler = () => {\n this.sendWindowSize();\n };\n\n const el = container ?? this.createContainer();\n\n this.managedContainer = el;\n\n try {\n window.addEventListener('message', messageHandler);\n window.addEventListener('resize', resizeHandler);\n el.appendChild(this.iframe);\n this.isMounted = true;\n } catch (e) {\n this.isMounted = false;\n }\n\n const unmount = () => {\n try {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('resize', resizeHandler);\n this.iframe.remove();\n this.isMounted = false;\n } catch (e) {\n this.isMounted = true;\n }\n\n if (!container) {\n el.remove();\n }\n };\n\n return unmount;\n }\n\n private createContainer() {\n const div = document.createElement('div');\n\n Object.assign(div.style, {\n background: 'transparent',\n position: 'fixed',\n bottom: '0',\n right: '0',\n padding: '24px',\n zIndex: '999999',\n fontSize: '0px',\n pointerEvents: 'none',\n });\n\n div.id = 'hume-embedded-voice-container';\n\n document.body.appendChild(div);\n\n return div;\n }\n\n private createIframe({ rendererUrl }: EmbeddedVoiceConfig) {\n const el = document.createElement('iframe');\n\n Object.assign(el.style, {\n backgroundColor: 'transparent',\n backgroundImage: 'none',\n border: 'none',\n height: '0px',\n width: '0px',\n opacity: '0',\n });\n\n el.id = 'hume-embedded-voice';\n\n el.src = `${rendererUrl}`;\n\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowtransparency', 'true');\n el.setAttribute('scrolling', 'no');\n el.setAttribute('allow', 'microphone');\n\n if (el.contentWindow) {\n el.contentWindow.document.documentElement.style.backgroundColor =\n 'transparent';\n el.contentWindow.document.body.style.backgroundColor = 'transparent';\n }\n\n return el;\n }\n\n private messageHandler(event: MessageEvent<unknown>) {\n if (!this.iframe) {\n return;\n }\n\n if (event.origin !== new URL(this.iframe.src).origin) {\n return;\n }\n\n const action = FrameToClientActionSchema.safeParse(event.data);\n\n if (!action.success) {\n return;\n }\n\n switch (action.data.type) {\n case WIDGET_IFRAME_IS_READY_ACTION.type: {\n this.showIframe();\n this.sendConfigObject();\n this.sendWindowSize();\n break;\n }\n case 'resize_frame': {\n this.resizeIframe(action.data.payload);\n break;\n }\n case 'transcript_message': {\n this.onMessage(action.data.payload);\n break;\n }\n case 'collapse_widget': {\n this.onClose();\n break;\n }\n }\n }\n\n openEmbed() {\n const action = EXPAND_FROM_CLIENT_ACTION({\n width: window.document.body.clientWidth,\n height: window.document.body.clientHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendConfigObject() {\n const action = UPDATE_CONFIG_ACTION(this.config);\n this.sendMessageToFrame(action);\n }\n\n private sendWindowSize() {\n const action = SEND_WINDOW_SIZE_ACTION({\n width: window.document.body.clientWidth,\n height: window.document.body.clientHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendMessageToFrame(action: ClientToFrameAction) {\n const frame = this.iframe;\n\n if (!frame.contentWindow) {\n return;\n }\n\n frame.contentWindow.postMessage(action, new URL(frame.src).origin);\n }\n\n private showIframe() {\n this.iframe.style.opacity = '1';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'all';\n }\n }\n\n private hideIframe() {\n this.iframe.style.opacity = '0';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'none';\n }\n }\n\n private resizeIframe({ width, height }: { width: number; height: number }) {\n this.iframe.style.width = `${width}px`;\n this.iframe.style.height = `${height}px`;\n }\n}\n","/** \n \n client frame \n \n ┌───────────────────────────┐ \n │ mount iframe │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ iframe is ready │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ send config │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ widget is open │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is collapsed │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is minimized │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ transcript message │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ resize window │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ unmount iframe │ ───────────▶ \n └───────────────────────────┘ \n */\nimport type {\n AgentTranscriptMessage,\n Config,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport {\n AgentTranscriptMessageSchema,\n ConfigSchema,\n UserTranscriptMessageSchema,\n} from '@humeai/voice';\nimport { z } from 'zod';\n\nconst WindowDimensionsSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport type WindowDimensions = z.infer<typeof WindowDimensionsSchema>;\n\n// ---------------------------------------------------------------------------\n// Client to frame actions\n// ---------------------------------------------------------------------------\nexport const ClientToFrameActionSchema = z.union([\n z.object({\n type: z.literal('update_config'),\n payload: ConfigSchema,\n }),\n z.object({\n type: z.literal('cancel'),\n }),\n z.object({\n type: z.literal('expand_widget_from_client'),\n payload: WindowDimensionsSchema,\n }),\n z.object({\n type: z.literal('send_window_size'),\n payload: WindowDimensionsSchema,\n }),\n]);\n\nexport type ClientToFrameAction = z.infer<typeof ClientToFrameActionSchema>;\n\nexport const UPDATE_CONFIG_ACTION = (config: Config) =>\n ({\n type: 'update_config',\n payload: config,\n }) satisfies ClientToFrameAction;\n\nexport const EXPAND_FROM_CLIENT_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'expand_widget_from_client',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const SEND_WINDOW_SIZE_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'send_window_size',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const parseClientToFrameAction = (\n data: unknown,\n): Promise<ClientToFrameAction> => {\n return new Promise((resolve, reject) => {\n try {\n const value = ClientToFrameActionSchema.parse(data);\n resolve(value);\n } catch (error) {\n reject(error);\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// Frame to client actions\n// ---------------------------------------------------------------------------\nexport const FrameToClientActionSchema = z.union([\n z.object({\n type: z.literal('expand_widget'),\n }),\n z.object({\n type: z.literal('collapse_widget'),\n }),\n z.object({\n type: z.literal('minimize_widget'),\n }),\n z.object({\n type: z.literal('widget_iframe_is_ready'),\n }),\n z.object({\n type: z.literal('transcript_message'),\n payload: z.union([\n UserTranscriptMessageSchema,\n AgentTranscriptMessageSchema,\n ]),\n }),\n z.object({\n type: z.literal('resize_frame'),\n payload: z.object({\n width: z.number(),\n height: z.number(),\n }),\n }),\n]);\n\nexport type FrameToClientAction = z.infer<typeof FrameToClientActionSchema>;\n\nexport const EXPAND_WIDGET_ACTION = {\n type: 'expand_widget',\n} satisfies FrameToClientAction;\n\nexport const COLLAPSE_WIDGET_ACTION = {\n type: 'collapse_widget' as const,\n} satisfies FrameToClientAction;\n\nexport const MINIMIZE_WIDGET_ACTION = {\n type: 'minimize_widget',\n} satisfies FrameToClientAction;\n\nexport const WIDGET_IFRAME_IS_READY_ACTION = {\n type: 'widget_iframe_is_ready',\n} satisfies FrameToClientAction;\n\nexport const TRANSCRIPT_MESSAGE_ACTION = (\n message: UserTranscriptMessage | AgentTranscriptMessage,\n) => {\n return {\n type: 'transcript_message',\n payload: message,\n } satisfies FrameToClientAction;\n};\n\nexport const RESIZE_FRAME_ACTION = (dimensions: {\n width: number;\n height: number;\n}) => {\n return {\n type: 'resize_frame',\n payload: {\n width: dimensions.width,\n height: dimensions.height,\n },\n } satisfies FrameToClientAction;\n};\n","export * from './lib/embed';\n\nexport {\n COLLAPSE_WIDGET_ACTION,\n EXPAND_WIDGET_ACTION,\n MINIMIZE_WIDGET_ACTION,\n RESIZE_FRAME_ACTION,\n TRANSCRIPT_MESSAGE_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n parseClientToFrameAction,\n type FrameToClientAction,\n type WindowDimensions,\n} from './lib/embed-messages';\n\nexport type {\n AgentTranscriptMessage,\n Config,\n JSONMessage,\n UserTranscriptMessage,\n EmotionScores,\n} from '@humeai/voice';\n\nexport { LanguageModelOption } from '@humeai/voice';\n"],"mappings":";AAKA,SAAS,oBAAoB;;;ACgC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAElB,IAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,OAAO,EAAE,OAAO;AAAA,EAChB,QAAQ,EAAE,OAAO;AACnB,CAAC;AAOM,IAAM,4BAA4B,EAAE,MAAM;AAAA,EAC/C,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,eAAe;AAAA,IAC/B,SAAS;AAAA,EACX,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,2BAA2B;AAAA,IAC3C,SAAS;AAAA,EACX,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,kBAAkB;AAAA,IAClC,SAAS;AAAA,EACX,CAAC;AACH,CAAC;AAIM,IAAM,uBAAuB,CAAC,YAClC;AAAA,EACC,MAAM;AAAA,EACN,SAAS;AACX;AAEK,IAAM,4BAA4B,CAAC,gBACvC;AAAA,EACC,MAAM;AAAA,EACN,SAAS;AACX;AAEK,IAAM,0BAA0B,CAAC,gBACrC;AAAA,EACC,MAAM;AAAA,EACN,SAAS;AACX;AAEK,IAAM,2BAA2B,CACtC,SACiC;AACjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI;AACF,YAAM,QAAQ,0BAA0B,MAAM,IAAI;AAClD,cAAQ,KAAK;AAAA,IACf,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAKO,IAAM,4BAA4B,EAAE,MAAM;AAAA,EAC/C,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,eAAe;AAAA,EACjC,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,iBAAiB;AAAA,EACnC,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,iBAAiB;AAAA,EACnC,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,wBAAwB;AAAA,EAC1C,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,oBAAoB;AAAA,IACpC,SAAS,EAAE,MAAM;AAAA,MACf;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,cAAc;AAAA,IAC9B,SAAS,EAAE,OAAO;AAAA,MAChB,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,EAAE,OAAO;AAAA,IACnB,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAIM,IAAM,uBAAuB;AAAA,EAClC,MAAM;AACR;AAEO,IAAM,yBAAyB;AAAA,EACpC,MAAM;AACR;AAEO,IAAM,yBAAyB;AAAA,EACpC,MAAM;AACR;AAEO,IAAM,gCAAgC;AAAA,EAC3C,MAAM;AACR;AAEO,IAAM,4BAA4B,CACvC,YACG;AACH,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,IAAM,sBAAsB,CAAC,eAG9B;AACJ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP,OAAO,WAAW;AAAA,MAClB,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;ADrJO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACjB;AAAA,EAEA,YAAqB;AAAA,EAErB,mBAAuC;AAAA,EAEvC;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,YAAY;AAAA,IAClB,YAAY,MAAM;AAAA,IAAC;AAAA,IACnB,UAAU,MAAM;AAAA,IAAC;AAAA,IACjB,GAAG;AAAA,EACL,GAGyB;AACvB,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,aAAa,MAAM;AACtC,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,OAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAGmE;AACjE,UAAM,eAAe,aAAa,MAAM;AAExC,WAAO,IAAI,eAAc;AAAA,MACvB,aAAa,eAAe;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAyB;AAC7B,UAAM,iBAAiB,CAAC,UAAiC;AACvD,WAAK,eAAe,KAAK;AAAA,IAC3B;AAEA,UAAM,gBAAgB,MAAM;AAC1B,WAAK,eAAe;AAAA,IACtB;AAEA,UAAM,KAAK,aAAa,KAAK,gBAAgB;AAE7C,SAAK,mBAAmB;AAExB,QAAI;AACF,aAAO,iBAAiB,WAAW,cAAc;AACjD,aAAO,iBAAiB,UAAU,aAAa;AAC/C,SAAG,YAAY,KAAK,MAAM;AAC1B,WAAK,YAAY;AAAA,IACnB,SAAS,GAAG;AACV,WAAK,YAAY;AAAA,IACnB;AAEA,UAAM,UAAU,MAAM;AACpB,UAAI;AACF,eAAO,oBAAoB,WAAW,cAAc;AACpD,eAAO,oBAAoB,UAAU,aAAa;AAClD,aAAK,OAAO,OAAO;AACnB,aAAK,YAAY;AAAA,MACnB,SAAS,GAAG;AACV,aAAK,YAAY;AAAA,MACnB;AAEA,UAAI,CAAC,WAAW;AACd,WAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB;AACxB,UAAM,MAAM,SAAS,cAAc,KAAK;AAExC,WAAO,OAAO,IAAI,OAAO;AAAA,MACvB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,KAAK;AAET,aAAS,KAAK,YAAY,GAAG;AAE7B,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,EAAE,YAAY,GAAwB;AACzD,UAAM,KAAK,SAAS,cAAc,QAAQ;AAE1C,WAAO,OAAO,GAAG,OAAO;AAAA,MACtB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAED,OAAG,KAAK;AAER,OAAG,MAAM,GAAG,WAAW;AAEvB,OAAG,aAAa,eAAe,GAAG;AAClC,OAAG,aAAa,qBAAqB,MAAM;AAC3C,OAAG,aAAa,aAAa,IAAI;AACjC,OAAG,aAAa,SAAS,YAAY;AAErC,QAAI,GAAG,eAAe;AACpB,SAAG,cAAc,SAAS,gBAAgB,MAAM,kBAC9C;AACF,SAAG,cAAc,SAAS,KAAK,MAAM,kBAAkB;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAA8B;AACnD,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,IAAI,IAAI,KAAK,OAAO,GAAG,EAAE,QAAQ;AACpD;AAAA,IACF;AAEA,UAAM,SAAS,0BAA0B,UAAU,MAAM,IAAI;AAE7D,QAAI,CAAC,OAAO,SAAS;AACnB;AAAA,IACF;AAEA,YAAQ,OAAO,KAAK,MAAM;AAAA,MACxB,KAAK,8BAA8B,MAAM;AACvC,aAAK,WAAW;AAChB,aAAK,iBAAiB;AACtB,aAAK,eAAe;AACpB;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB;AACnB,aAAK,aAAa,OAAO,KAAK,OAAO;AACrC;AAAA,MACF;AAAA,MACA,KAAK,sBAAsB;AACzB,aAAK,UAAU,OAAO,KAAK,OAAO;AAClC;AAAA,MACF;AAAA,MACA,KAAK,mBAAmB;AACtB,aAAK,QAAQ;AACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,UAAM,SAAS,0BAA0B;AAAA,MACvC,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B,QAAQ,OAAO,SAAS,KAAK;AAAA,IAC/B,CAAC;AACD,SAAK,mBAAmB,MAAM;AAAA,EAChC;AAAA,EAEQ,mBAAmB;AACzB,UAAM,SAAS,qBAAqB,KAAK,MAAM;AAC/C,SAAK,mBAAmB,MAAM;AAAA,EAChC;AAAA,EAEQ,iBAAiB;AACvB,UAAM,SAAS,wBAAwB;AAAA,MACrC,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B,QAAQ,OAAO,SAAS,KAAK;AAAA,IAC/B,CAAC;AACD,SAAK,mBAAmB,MAAM;AAAA,EAChC;AAAA,EAEQ,mBAAmB,QAA6B;AACtD,UAAM,QAAQ,KAAK;AAEnB,QAAI,CAAC,MAAM,eAAe;AACxB;AAAA,IACF;AAEA,UAAM,cAAc,YAAY,QAAQ,IAAI,IAAI,MAAM,GAAG,EAAE,MAAM;AAAA,EACnE;AAAA,EAEQ,aAAa;AACnB,SAAK,OAAO,MAAM,UAAU;AAC5B,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,MAAM,gBAAgB;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,SAAK,OAAO,MAAM,UAAU;AAC5B,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,MAAM,gBAAgB;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,aAAa,EAAE,OAAO,OAAO,GAAsC;AACzE,SAAK,OAAO,MAAM,QAAQ,GAAG,KAAK;AAClC,SAAK,OAAO,MAAM,SAAS,GAAG,MAAM;AAAA,EACtC;AACF;;;AEpOA,SAAS,2BAA2B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/embed.ts","../src/lib/embed-messages.ts","../src/index.ts"],"sourcesContent":["import type {\n AssistantTranscriptMessage,\n SocketConfig,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport { createSocketConfig } from '@humeai/voice';\n\nimport type { ClientToFrameAction } from './embed-messages';\nimport {\n EXPAND_FROM_CLIENT_ACTION,\n FrameToClientActionSchema,\n SEND_WINDOW_SIZE_ACTION,\n UPDATE_CONFIG_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n} from './embed-messages';\n\nexport type EmbeddedVoiceConfig = {\n rendererUrl: string;\n iframeTitle?: string;\n} & SocketConfig;\n\nexport type TranscriptMessageHandler = (\n message: UserTranscriptMessage | AssistantTranscriptMessage,\n) => void;\n\nexport type CloseHandler = () => void;\n\nexport class EmbeddedVoice {\n private iframe: HTMLIFrameElement;\n\n private isMounted: boolean = false;\n\n private managedContainer: HTMLElement | null = null;\n\n private config: EmbeddedVoiceConfig;\n\n private onMessage: TranscriptMessageHandler;\n\n private onClose: CloseHandler;\n\n private openOnMount: boolean;\n\n private constructor({\n onMessage = () => {},\n onClose = () => {},\n openOnMount,\n ...config\n }: {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n openOnMount?: boolean;\n } & EmbeddedVoiceConfig) {\n this.config = config;\n this.iframe = this.createIframe(config);\n this.onMessage = onMessage;\n this.onClose = onClose;\n this.openOnMount = openOnMount ?? false;\n this.messageHandler = this.messageHandler.bind(this);\n this.messageHandler = this.messageHandler.bind(this);\n }\n\n static create({\n rendererUrl,\n onMessage,\n onClose,\n openOnMount,\n ...config\n }: Partial<EmbeddedVoiceConfig> & {\n onMessage?: TranscriptMessageHandler;\n onClose?: CloseHandler;\n openOnMount?: boolean;\n } & NonNullable<Pick<EmbeddedVoiceConfig, 'auth'>>): EmbeddedVoice {\n const parsedConfig = createSocketConfig(config);\n\n return new EmbeddedVoice({\n rendererUrl: rendererUrl ?? 'https://voice-widget.hume.ai',\n onMessage,\n onClose,\n openOnMount,\n ...parsedConfig,\n });\n }\n\n mount(container?: HTMLElement) {\n const messageHandler = (event: MessageEvent<unknown>) => {\n this.messageHandler(event);\n };\n\n const resizeHandler = () => {\n this.sendWindowSize();\n };\n\n const el = container ?? this.createContainer();\n\n this.managedContainer = el;\n\n try {\n window.addEventListener('message', messageHandler);\n window.addEventListener('resize', resizeHandler);\n el.appendChild(this.iframe);\n this.isMounted = true;\n } catch (e) {\n this.isMounted = false;\n }\n\n const unmount = () => {\n try {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('resize', resizeHandler);\n this.iframe.remove();\n this.isMounted = false;\n } catch (e) {\n this.isMounted = true;\n }\n\n if (!container) {\n el.remove();\n }\n };\n\n return unmount;\n }\n\n private createContainer() {\n const div = document.createElement('div');\n\n Object.assign(div.style, {\n background: 'transparent',\n position: 'fixed',\n bottom: '0',\n right: '0',\n margin: '24px',\n zIndex: '999999',\n fontSize: '0px',\n pointerEvents: 'none',\n });\n\n div.id = 'hume-embedded-voice-container';\n\n document.body.appendChild(div);\n\n return div;\n }\n\n private createIframe({ rendererUrl, iframeTitle }: EmbeddedVoiceConfig) {\n const el = document.createElement('iframe');\n\n Object.assign(el.style, {\n backgroundColor: 'transparent',\n backgroundImage: 'none',\n border: 'none',\n height: '0px',\n width: '0px',\n opacity: '0',\n });\n\n el.id = 'hume-embedded-voice';\n el.src = `${rendererUrl}`;\n\n el.setAttribute('title', iframeTitle ?? 'Hume Empathic Voice Widget');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowtransparency', 'true');\n el.setAttribute('scrolling', 'no');\n el.setAttribute('allow', 'microphone');\n\n if (el.contentWindow) {\n el.contentWindow.document.documentElement.style.backgroundColor =\n 'transparent';\n el.contentWindow.document.body.style.backgroundColor = 'transparent';\n }\n\n return el;\n }\n\n private messageHandler(event: MessageEvent<unknown>) {\n if (!this.iframe) {\n return;\n }\n\n if (event.origin !== new URL(this.iframe.src).origin) {\n return;\n }\n\n const action = FrameToClientActionSchema.safeParse(event.data);\n\n if (!action.success) {\n return;\n }\n\n switch (action.data.type) {\n case WIDGET_IFRAME_IS_READY_ACTION.type: {\n this.showIframe();\n this.sendConfigObject();\n this.sendWindowSize();\n if (this.openOnMount) {\n this.openEmbed();\n }\n break;\n }\n case 'resize_frame': {\n this.resizeIframe(action.data.payload);\n break;\n }\n case 'transcript_message': {\n this.onMessage(action.data.payload);\n break;\n }\n case 'collapse_widget': {\n this.onClose();\n break;\n }\n }\n }\n\n openEmbed() {\n const action = EXPAND_FROM_CLIENT_ACTION({\n width: window.screen.availWidth,\n height: window.screen.availHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendConfigObject() {\n const action = UPDATE_CONFIG_ACTION(this.config);\n this.sendMessageToFrame(action);\n }\n\n private sendWindowSize() {\n const action = SEND_WINDOW_SIZE_ACTION({\n width: window.screen.availWidth,\n height: window.screen.availHeight,\n });\n this.sendMessageToFrame(action);\n }\n\n private sendMessageToFrame(action: ClientToFrameAction) {\n const frame = this.iframe;\n\n if (!frame.contentWindow) {\n return;\n }\n\n frame.contentWindow.postMessage(action, new URL(frame.src).origin);\n }\n\n private showIframe() {\n this.iframe.style.opacity = '1';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'all';\n }\n }\n\n private hideIframe() {\n this.iframe.style.opacity = '0';\n if (this.managedContainer) {\n this.managedContainer.style.pointerEvents = 'none';\n }\n }\n\n private resizeIframe({ width, height }: { width: number; height: number }) {\n this.iframe.style.width = `${width}px`;\n this.iframe.style.height = `${height}px`;\n }\n}\n","/** \n \n client frame \n \n ┌───────────────────────────┐ \n │ mount iframe │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ iframe is ready │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ send config │ ───────────▶ \n └───────────────────────────┘ \n ┌───────────────────────────┐\n ◀─────────── │ widget is open │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is collapsed │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ widget is minimized │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ transcript message │\n └───────────────────────────┘\n ┌───────────────────────────┐\n ◀─────────── │ resize window │\n └───────────────────────────┘\n ┌───────────────────────────┐ \n │ unmount iframe │ ───────────▶ \n └───────────────────────────┘ \n */\nimport type {\n AssistantTranscriptMessage,\n SocketConfig,\n UserTranscriptMessage,\n} from '@humeai/voice';\nimport {\n AssistantTranscriptMessageSchema,\n SocketConfigSchema,\n UserTranscriptMessageSchema,\n} from '@humeai/voice';\nimport { z } from 'zod';\n\nconst WindowDimensionsSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport type WindowDimensions = z.infer<typeof WindowDimensionsSchema>;\n\n// ---------------------------------------------------------------------------\n// Client to frame actions\n// ---------------------------------------------------------------------------\nexport const ClientToFrameActionSchema = z.union([\n z.object({\n type: z.literal('update_config'),\n payload: SocketConfigSchema,\n }),\n z.object({\n type: z.literal('cancel'),\n }),\n z.object({\n type: z.literal('expand_widget_from_client'),\n payload: WindowDimensionsSchema,\n }),\n z.object({\n type: z.literal('send_window_size'),\n payload: WindowDimensionsSchema,\n }),\n]);\n\nexport type ClientToFrameAction = z.infer<typeof ClientToFrameActionSchema>;\n\nexport const UPDATE_CONFIG_ACTION = (config: SocketConfig) =>\n ({\n type: 'update_config',\n payload: config,\n }) satisfies ClientToFrameAction;\n\nexport const EXPAND_FROM_CLIENT_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'expand_widget_from_client',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const SEND_WINDOW_SIZE_ACTION = (dimensions: WindowDimensions) =>\n ({\n type: 'send_window_size',\n payload: dimensions,\n }) satisfies ClientToFrameAction;\n\nexport const parseClientToFrameAction = (\n data: unknown,\n): Promise<ClientToFrameAction> => {\n return new Promise((resolve, reject) => {\n try {\n const value = ClientToFrameActionSchema.parse(data);\n resolve(value);\n } catch (error) {\n reject(error);\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// Frame to client actions\n// ---------------------------------------------------------------------------\nexport const FrameToClientActionSchema = z.union([\n z.object({\n type: z.literal('expand_widget'),\n }),\n z.object({\n type: z.literal('collapse_widget'),\n }),\n z.object({\n type: z.literal('minimize_widget'),\n }),\n z.object({\n type: z.literal('widget_iframe_is_ready'),\n }),\n z.object({\n type: z.literal('transcript_message'),\n payload: z.union([\n UserTranscriptMessageSchema,\n AssistantTranscriptMessageSchema,\n ]),\n }),\n z.object({\n type: z.literal('resize_frame'),\n payload: z.object({\n width: z.number(),\n height: z.number(),\n }),\n }),\n]);\n\nexport type FrameToClientAction = z.infer<typeof FrameToClientActionSchema>;\n\nexport const EXPAND_WIDGET_ACTION = {\n type: 'expand_widget',\n} satisfies FrameToClientAction;\n\nexport const COLLAPSE_WIDGET_ACTION = {\n type: 'collapse_widget' as const,\n} satisfies FrameToClientAction;\n\nexport const MINIMIZE_WIDGET_ACTION = {\n type: 'minimize_widget',\n} satisfies FrameToClientAction;\n\nexport const WIDGET_IFRAME_IS_READY_ACTION = {\n type: 'widget_iframe_is_ready',\n} satisfies FrameToClientAction;\n\nexport const TRANSCRIPT_MESSAGE_ACTION = (\n message: UserTranscriptMessage | AssistantTranscriptMessage,\n) => {\n return {\n type: 'transcript_message',\n payload: message,\n } satisfies FrameToClientAction;\n};\n\nexport const RESIZE_FRAME_ACTION = (dimensions: {\n width: number;\n height: number;\n}) => {\n return {\n type: 'resize_frame',\n payload: {\n width: dimensions.width,\n height: dimensions.height,\n },\n } satisfies FrameToClientAction;\n};\n","export * from './lib/embed';\n\nexport {\n COLLAPSE_WIDGET_ACTION,\n EXPAND_WIDGET_ACTION,\n MINIMIZE_WIDGET_ACTION,\n RESIZE_FRAME_ACTION,\n TRANSCRIPT_MESSAGE_ACTION,\n WIDGET_IFRAME_IS_READY_ACTION,\n parseClientToFrameAction,\n type FrameToClientAction,\n type WindowDimensions,\n} from './lib/embed-messages';\n\nexport type {\n AssistantTranscriptMessage,\n SocketConfig,\n JSONMessage,\n UserTranscriptMessage,\n EmotionScores,\n} from '@humeai/voice';\n\nexport { LanguageModelOption } from '@humeai/voice';\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@humeai/voice-embed",
|
|
3
|
-
"version": "0.0.0-beta.
|
|
3
|
+
"version": "0.0.0-beta.21",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
"tsup": "^8.0.2",
|
|
24
24
|
"typescript": "^5.4.3",
|
|
25
25
|
"vitest": "^1.4.0",
|
|
26
|
-
"@humeai/
|
|
27
|
-
"@humeai/
|
|
26
|
+
"@humeai/typescript-config": "0.0.0",
|
|
27
|
+
"@humeai/eslint-config": "0.0.1"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"zod": "^3.22.4",
|
|
31
|
-
"@humeai/voice": "0.0.0-beta.
|
|
31
|
+
"@humeai/voice": "0.0.0-beta.21"
|
|
32
32
|
},
|
|
33
33
|
"browserslist": [
|
|
34
34
|
"last 2 Chrome versions, last 2 iOS major versions, Firefox ESR, not dead"
|