@wysdym/agent 0.1.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 +228 -0
- package/dist/ChatWidget.d.ts +58 -0
- package/dist/index.cjs.js +1824 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.es.js +35567 -0
- package/dist/sdk/WysdymWidget.d.ts +108 -0
- package/dist/types/agent.d.ts +32 -0
- package/dist/types/analytics.d.ts +75 -0
- package/dist/types/api.d.ts +21 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/session.d.ts +55 -0
- package/dist/types/voice.d.ts +33 -0
- package/dist/vite.svg +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Props for the WysdymWidget component.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* <WysdymWidget
|
|
7
|
+
* agentId="your-agent-id"
|
|
8
|
+
* mode="floating"
|
|
9
|
+
* position="bottom-right"
|
|
10
|
+
* />
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export interface WysdymWidgetProps {
|
|
14
|
+
/** The unique agent ID for your Wysdym agent (required) */
|
|
15
|
+
agentId: string;
|
|
16
|
+
/** Display mode: 'floating' (bottom corner) or 'inline' (embedded in container) */
|
|
17
|
+
mode?: 'floating' | 'inline';
|
|
18
|
+
/** Position for floating mode: 'bottom-right' or 'bottom-left' */
|
|
19
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
20
|
+
/** Color theme: 'light' or 'dark' */
|
|
21
|
+
theme?: 'light' | 'dark';
|
|
22
|
+
/** Primary brand color (CSS color value) */
|
|
23
|
+
primaryColor?: string;
|
|
24
|
+
/** Whether the widget can be expanded/collapsed by the user */
|
|
25
|
+
expandable?: boolean;
|
|
26
|
+
/** Defer initialization until manually triggered */
|
|
27
|
+
deferInit?: boolean;
|
|
28
|
+
/** Text shown on the trigger button */
|
|
29
|
+
triggerText?: string;
|
|
30
|
+
/** Override the backend API URL (defaults to auto-detection based on hostname) */
|
|
31
|
+
backendUrl?: string;
|
|
32
|
+
/** Admin preview: tooltip text (overrides API when set) */
|
|
33
|
+
previewTriggerText?: string;
|
|
34
|
+
/** Admin preview: button text (overrides API when set) */
|
|
35
|
+
previewButtonText?: string;
|
|
36
|
+
/** Admin preview: button icon name e.g. ArrowLeft, Home (overrides API when set) */
|
|
37
|
+
previewButtonIcon?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Options for generating widget embed code.
|
|
41
|
+
*/
|
|
42
|
+
export interface GetEmbedCodeOptions {
|
|
43
|
+
/** Company token for authentication (deprecated: no longer required) */
|
|
44
|
+
companyToken?: string;
|
|
45
|
+
/** Display mode: 'floating' (bottom corner) or 'inline' (embedded in container) */
|
|
46
|
+
mode?: 'floating' | 'inline';
|
|
47
|
+
/** Position for floating mode */
|
|
48
|
+
position?: string;
|
|
49
|
+
/** Container element ID for inline mode */
|
|
50
|
+
containerId?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Wysdym Widget - Declarative React component for embedding the Wysdym chat widget.
|
|
54
|
+
*
|
|
55
|
+
* This component renders the `<wysdym-widget>` custom element which displays
|
|
56
|
+
* a pill-shaped trigger button with animated rainbow border. When clicked,
|
|
57
|
+
* it mounts the full chat widget in expanded mode.
|
|
58
|
+
*
|
|
59
|
+
* @example Basic usage
|
|
60
|
+
* ```tsx
|
|
61
|
+
* import { WysdymWidget } from '@wysdym/agent';
|
|
62
|
+
* import '@wysdym/agent/style.css';
|
|
63
|
+
*
|
|
64
|
+
* function App() {
|
|
65
|
+
* return (
|
|
66
|
+
* <WysdymWidget
|
|
67
|
+
* agentId="your-agent-id"
|
|
68
|
+
* mode="floating"
|
|
69
|
+
* />
|
|
70
|
+
* );
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* @example With position
|
|
75
|
+
* ```tsx
|
|
76
|
+
* <WysdymWidget
|
|
77
|
+
* agentId="your-agent-id"
|
|
78
|
+
* mode="floating"
|
|
79
|
+
* position="bottom-left"
|
|
80
|
+
* />
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function WysdymWidget({ agentId, mode, position, theme, primaryColor, expandable, deferInit, backendUrl, previewTriggerText, previewButtonText, previewButtonIcon, }: WysdymWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
84
|
+
/**
|
|
85
|
+
* Generate HTML embed code snippet for the Wysdym widget.
|
|
86
|
+
*
|
|
87
|
+
* This utility generates a `<script>` tag that can be copied and pasted
|
|
88
|
+
* into any website to embed the Wysdym chat widget via CDN.
|
|
89
|
+
*
|
|
90
|
+
* @param agentId - The unique agent ID for your Wysdym agent
|
|
91
|
+
* @param opts - Optional configuration for the embed code
|
|
92
|
+
* @returns HTML script tag string for embedding the widget
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* import { getEmbedCode } from '@wysdym/agent';
|
|
97
|
+
*
|
|
98
|
+
* // Floating widget (default)
|
|
99
|
+
* const floatingCode = getEmbedCode('your-agent-id');
|
|
100
|
+
*
|
|
101
|
+
* // Inline widget in a specific container
|
|
102
|
+
* const inlineCode = getEmbedCode('your-agent-id', {
|
|
103
|
+
* mode: 'inline',
|
|
104
|
+
* containerId: 'widget-container'
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export declare function getEmbedCode(agentId: string, opts?: GetEmbedCodeOptions): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface AgentConfig {
|
|
2
|
+
id: string;
|
|
3
|
+
company_id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string | null;
|
|
6
|
+
agent_first_message: string;
|
|
7
|
+
agent_instructions: string | null;
|
|
8
|
+
elevenlabs_agent_id: string | null;
|
|
9
|
+
elevenlabs_voice_id: string | null;
|
|
10
|
+
require_email: boolean;
|
|
11
|
+
product: string | null;
|
|
12
|
+
template_id: number | null;
|
|
13
|
+
primary_color: string | null;
|
|
14
|
+
secondary_color: string | null;
|
|
15
|
+
widget_trigger_text: string | null;
|
|
16
|
+
widget_trigger_button_text: string | null;
|
|
17
|
+
widget_trigger_button_icon: string | null;
|
|
18
|
+
email_collection_button_text: string | null;
|
|
19
|
+
email_collection_button_icon: string | null;
|
|
20
|
+
force_display_email: boolean;
|
|
21
|
+
}
|
|
22
|
+
export type EmbedMode = 'floating' | 'inline' | 'voice-button';
|
|
23
|
+
export type FloatingPosition = 'bottom-right' | 'bottom-left';
|
|
24
|
+
export type DisplayMode = 'collapsed' | 'expanded' | 'inline' | 'voice-button' | 'fullscreen';
|
|
25
|
+
export interface WidgetAttributes {
|
|
26
|
+
agentId: string;
|
|
27
|
+
mode: EmbedMode;
|
|
28
|
+
position: FloatingPosition;
|
|
29
|
+
theme: string;
|
|
30
|
+
expandable: boolean;
|
|
31
|
+
deferInit: boolean;
|
|
32
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export declare enum EventType {
|
|
2
|
+
WIDGET_OPEN = "widget_open",
|
|
3
|
+
WIDGET_CLOSE = "widget_close",
|
|
4
|
+
WIDGET_EXPAND = "widget_expand",
|
|
5
|
+
WIDGET_COLLAPSE = "widget_collapse",
|
|
6
|
+
SESSION_START = "session_start",
|
|
7
|
+
SESSION_END = "session_end",
|
|
8
|
+
SESSION_ABANDON = "session_abandon",
|
|
9
|
+
WIDGET_SESSION_CREATED = "widget_session_created",
|
|
10
|
+
WIDGET_SESSION_PAUSED = "widget_session_paused",
|
|
11
|
+
WIDGET_SESSION_RESUMED = "widget_session_resumed",
|
|
12
|
+
WIDGET_SESSION_ENDED = "widget_session_ended",
|
|
13
|
+
WIDGET_SESSION_ABANDONED = "widget_session_abandoned",
|
|
14
|
+
WIDGET_PAGE_NAVIGATION = "widget_page_navigation",
|
|
15
|
+
WIDGET_SESSION_TIMEOUT = "widget_session_timeout",
|
|
16
|
+
WIDGET_RESUME_PROMPT_SHOWN = "widget_resume_prompt_shown",
|
|
17
|
+
WIDGET_RESUME_PROMPT_ACCEPTED = "widget_resume_prompt_accepted",
|
|
18
|
+
WIDGET_RESUME_PROMPT_DECLINED = "widget_resume_prompt_declined",
|
|
19
|
+
INPUT_MODE_SWITCH = "input_mode_switch",
|
|
20
|
+
VOICE_MODE_START = "voice_mode_start",
|
|
21
|
+
VOICE_MODE_END = "voice_mode_end",
|
|
22
|
+
TEXT_MODE_START = "text_mode_start",
|
|
23
|
+
MESSAGE_SENT = "message_sent",
|
|
24
|
+
MESSAGE_RECEIVED = "message_received",
|
|
25
|
+
VOICE_START_LISTENING = "voice_start_listening",
|
|
26
|
+
VOICE_STOP_LISTENING = "voice_stop_listening",
|
|
27
|
+
MICROPHONE_REQUEST = "microphone_request",
|
|
28
|
+
MICROPHONE_GRANTED = "microphone_granted",
|
|
29
|
+
MICROPHONE_DENIED = "microphone_denied",
|
|
30
|
+
CALL_START = "call_start",
|
|
31
|
+
CALL_END = "call_end",
|
|
32
|
+
CALL_MUTE = "call_mute",
|
|
33
|
+
CALL_UNMUTE = "call_unmute",
|
|
34
|
+
CALL_HOLD = "call_hold",
|
|
35
|
+
CALL_RESUME = "call_resume",
|
|
36
|
+
CONNECTION_ERROR = "connection_error",
|
|
37
|
+
API_ERROR = "api_error",
|
|
38
|
+
AUDIO_QUALITY_ISSUE = "audio_quality_issue",
|
|
39
|
+
NETWORK_TIMEOUT = "network_timeout",
|
|
40
|
+
RESPONSE_LATENCY = "response_latency",
|
|
41
|
+
PAGE_VISIBLE = "page_visible",
|
|
42
|
+
PAGE_HIDDEN = "page_hidden",
|
|
43
|
+
TAB_SWITCH = "tab_switch",
|
|
44
|
+
WINDOW_FOCUS = "window_focus",
|
|
45
|
+
WINDOW_BLUR = "window_blur",
|
|
46
|
+
CTA_DISPLAY = "cta_display",
|
|
47
|
+
CTA_CLICK = "cta_click",
|
|
48
|
+
CTA_RETURN = "cta_return",
|
|
49
|
+
EMAIL_FORM_SHOW = "email_form_show",
|
|
50
|
+
EMAIL_SUBMIT = "email_submit",
|
|
51
|
+
EMAIL_SUBMIT_SUCCESS = "email_submit_success",
|
|
52
|
+
EMAIL_SUBMIT_ERROR = "email_submit_error",
|
|
53
|
+
AGENT_LOAD_START = "agent_load_start",
|
|
54
|
+
AGENT_LOAD_SUCCESS = "agent_load_success",
|
|
55
|
+
AGENT_LOAD_ERROR = "agent_load_error",
|
|
56
|
+
AGENT_SPEAKING_START = "agent_speaking_start",
|
|
57
|
+
AGENT_SPEAKING_END = "agent_speaking_end"
|
|
58
|
+
}
|
|
59
|
+
export interface AnalyticsEvent {
|
|
60
|
+
event_type: string;
|
|
61
|
+
event_name: string;
|
|
62
|
+
widget_session_id?: string;
|
|
63
|
+
registered_agent_id?: string;
|
|
64
|
+
event_data?: Record<string, any>;
|
|
65
|
+
event_metadata?: Record<string, any>;
|
|
66
|
+
response_time_ms?: number;
|
|
67
|
+
error_code?: string;
|
|
68
|
+
error_message?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface AnalyticsServiceConfig {
|
|
71
|
+
baseUrl: string;
|
|
72
|
+
companyToken: string;
|
|
73
|
+
agentId: string;
|
|
74
|
+
sessionId?: string;
|
|
75
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface BootstrapResponse {
|
|
2
|
+
access_token: string;
|
|
3
|
+
token_type: 'bearer';
|
|
4
|
+
}
|
|
5
|
+
export interface AnalyticsTrackRequest {
|
|
6
|
+
event_type: string;
|
|
7
|
+
event_name: string;
|
|
8
|
+
widget_session_id?: string;
|
|
9
|
+
registered_agent_id?: string;
|
|
10
|
+
event_data?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface PersonalizedPromptResponse {
|
|
13
|
+
prompt: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SignedUrlResponse {
|
|
16
|
+
signed_url: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ApiError {
|
|
19
|
+
detail: string;
|
|
20
|
+
status_code: number;
|
|
21
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type SessionStatus = 'ACTIVE' | 'PAUSED' | 'RESUMED' | 'ENDED' | 'EXPIRED' | 'ABANDONED';
|
|
2
|
+
export interface SessionIntakeRequest {
|
|
3
|
+
email?: string;
|
|
4
|
+
role?: string;
|
|
5
|
+
company?: string;
|
|
6
|
+
pain_points?: string;
|
|
7
|
+
agent_id?: string;
|
|
8
|
+
needs?: string[];
|
|
9
|
+
challenges?: string[];
|
|
10
|
+
anonymous_user_id?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SessionResponse {
|
|
13
|
+
id: string | null;
|
|
14
|
+
session_id: string;
|
|
15
|
+
company_id: string | null;
|
|
16
|
+
registered_agent_id: string | null;
|
|
17
|
+
prospect_id: string | null;
|
|
18
|
+
started_at: string;
|
|
19
|
+
ended_at: string | null;
|
|
20
|
+
prospect_needs: string[] | null;
|
|
21
|
+
pain_points: string[] | null;
|
|
22
|
+
linked_past_sessions: string[] | null;
|
|
23
|
+
widget_jwt: string | null;
|
|
24
|
+
has_email: boolean | null;
|
|
25
|
+
}
|
|
26
|
+
export interface ChatMessage {
|
|
27
|
+
id: string;
|
|
28
|
+
role: 'user' | 'assistant';
|
|
29
|
+
message: string;
|
|
30
|
+
created_at: string;
|
|
31
|
+
tokens_used: number | null;
|
|
32
|
+
latency_ms: number | null;
|
|
33
|
+
model: string | null;
|
|
34
|
+
}
|
|
35
|
+
export interface SessionHistoryResponse {
|
|
36
|
+
session_id: string;
|
|
37
|
+
messages: ChatMessage[];
|
|
38
|
+
total_messages: number;
|
|
39
|
+
started_at: string;
|
|
40
|
+
status: SessionStatus;
|
|
41
|
+
has_email: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface PersistedSession {
|
|
44
|
+
sessionId: string;
|
|
45
|
+
widgetJwt: string;
|
|
46
|
+
agentId: string;
|
|
47
|
+
status: 'active' | 'paused';
|
|
48
|
+
lastActivityAt: number;
|
|
49
|
+
pageUrl: string;
|
|
50
|
+
conversationState: {
|
|
51
|
+
messageCount: number;
|
|
52
|
+
lastMessage: string;
|
|
53
|
+
};
|
|
54
|
+
expiresAt: number;
|
|
55
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type VoiceState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
|
|
2
|
+
export interface VoiceConfig {
|
|
3
|
+
signedUrl: string;
|
|
4
|
+
agentId: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
personalizedPrompt?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TranscriptEntry {
|
|
9
|
+
role: 'user' | 'agent';
|
|
10
|
+
text: string;
|
|
11
|
+
source: 'voice' | 'text';
|
|
12
|
+
timestamp: number;
|
|
13
|
+
isFinal: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ConnectionHealth {
|
|
16
|
+
isConnected: boolean;
|
|
17
|
+
latencyMs: number | null;
|
|
18
|
+
lastHeartbeat: number | null;
|
|
19
|
+
}
|
|
20
|
+
export type AgentStatus = 'idle' | 'listening' | 'thinking' | 'speaking' | 'calling_tool' | 'using_skill';
|
|
21
|
+
export type Unsubscribe = () => void;
|
|
22
|
+
export interface VoiceProvider {
|
|
23
|
+
connect(config: VoiceConfig): Promise<void>;
|
|
24
|
+
disconnect(): void;
|
|
25
|
+
sendMessage(text: string): void;
|
|
26
|
+
mute(): void;
|
|
27
|
+
unmute(): void;
|
|
28
|
+
isMuted(): boolean;
|
|
29
|
+
onStateChange(cb: (state: VoiceState) => void): Unsubscribe;
|
|
30
|
+
onTranscript(cb: (entry: TranscriptEntry) => void): Unsubscribe;
|
|
31
|
+
onAudioData(cb: (data: Uint8Array) => void): Unsubscribe;
|
|
32
|
+
getConnectionHealth(): ConnectionHealth;
|
|
33
|
+
}
|
package/dist/vite.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wysdym/agent",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.cjs.js",
|
|
6
|
+
"module": "./dist/index.es.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.es.js",
|
|
12
|
+
"require": "./dist/index.cjs.js"
|
|
13
|
+
},
|
|
14
|
+
"./style.css": "./dist/index.css",
|
|
15
|
+
"./dist/index.css": "./dist/index.css"
|
|
16
|
+
},
|
|
17
|
+
"style": "./dist/index.css",
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"dev": "vite",
|
|
27
|
+
"dev:host": "vite --host",
|
|
28
|
+
"compile:css": "node scripts/compile-css.mjs",
|
|
29
|
+
"prebuild": "npm run compile:css",
|
|
30
|
+
"build": "npm run build:cdn && npm run build:lib",
|
|
31
|
+
"build:cdn": "vite build && node scripts/generate-manifest.js && node scripts/generate-loader.js",
|
|
32
|
+
"build:lib": "npm run compile:css && vite build --config vite.config.lib.ts",
|
|
33
|
+
"prepublishOnly": "rm -rf dist && npm run build:lib",
|
|
34
|
+
"preview": "vite preview",
|
|
35
|
+
"test": "vitest run src/__tests__/",
|
|
36
|
+
"test:all": "vitest run",
|
|
37
|
+
"test:watch": "vitest src/__tests__/",
|
|
38
|
+
"test:coverage": "vitest run --coverage src/__tests__/",
|
|
39
|
+
"test:e2e": "playwright test",
|
|
40
|
+
"test:e2e:ui": "playwright test --ui",
|
|
41
|
+
"test:e2e:headed": "playwright test --headed",
|
|
42
|
+
"test:e2e:staging": "E2E_ENV=staging playwright test",
|
|
43
|
+
"test:e2e:report": "playwright show-report",
|
|
44
|
+
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
45
|
+
"lint:fix": "eslint . --fix",
|
|
46
|
+
"type-check": "tsc --noEmit"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@elevenlabs/elevenlabs-js": "^2.8.0",
|
|
50
|
+
"@elevenlabs/react": "^0.6.2",
|
|
51
|
+
"@radix-ui/react-dialog": "^1.1.14",
|
|
52
|
+
"@radix-ui/react-icons": "^1.3.2",
|
|
53
|
+
"@radix-ui/react-popover": "^1.1.14",
|
|
54
|
+
"clsx": "^2.1.1",
|
|
55
|
+
"lottie-react": "^2.4.1",
|
|
56
|
+
"lucide-react": "^0.539.0",
|
|
57
|
+
"socket.io-client": "^4.8.1",
|
|
58
|
+
"tailwind-merge": "^3.3.1",
|
|
59
|
+
"zustand": "^5.0.11"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@eslint/js": "^9.30.1",
|
|
63
|
+
"@playwright/test": "^1.58.2",
|
|
64
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
65
|
+
"@testing-library/react": "^16.3.0",
|
|
66
|
+
"@types/node": "^24.0.14",
|
|
67
|
+
"@types/react": "^19.1.8",
|
|
68
|
+
"@types/react-dom": "^19.1.6",
|
|
69
|
+
"@vitejs/plugin-react": "^4.6.0",
|
|
70
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
71
|
+
"autoprefixer": "^10.4.19",
|
|
72
|
+
"eslint": "^9.30.1",
|
|
73
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
74
|
+
"eslint-plugin-react-refresh": "^0.4.20",
|
|
75
|
+
"globals": "^16.3.0",
|
|
76
|
+
"jsdom": "^28.1.0",
|
|
77
|
+
"msw": "^2.12.10",
|
|
78
|
+
"postcss": "^8.4.38",
|
|
79
|
+
"tailwindcss": "^3.4.3",
|
|
80
|
+
"terser": "^5.43.1",
|
|
81
|
+
"typescript": "~5.8.3",
|
|
82
|
+
"typescript-eslint": "^8.35.1",
|
|
83
|
+
"vite": "^7.0.5",
|
|
84
|
+
"vite-plugin-dts": "^4.5.4",
|
|
85
|
+
"vitest": "^4.0.18"
|
|
86
|
+
},
|
|
87
|
+
"peerDependencies": {
|
|
88
|
+
"react": ">=18.0.0",
|
|
89
|
+
"react-dom": ">=18.0.0"
|
|
90
|
+
},
|
|
91
|
+
"peerDependenciesMeta": {
|
|
92
|
+
"react": {
|
|
93
|
+
"optional": false
|
|
94
|
+
},
|
|
95
|
+
"react-dom": {
|
|
96
|
+
"optional": false
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|