@connekz/connekz-agent 0.6.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/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ All notable changes to @connekz/connekz-agent will be documented in this file.
4
+
5
+ ## [1.0.0] - 2026-01-26
6
+ ### Added
7
+ - Initial release.
package/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Connekz NPM Package License Agreement
2
+
3
+ Copyright (c) 2026 Connekz Limited. All rights reserved.
4
+
5
+ This software is proprietary to Connekz Limited. It is provided as a developer toolkit for integrating Connekz AI capabilities into your own projects, using valid Connekz instance credentials.
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software via NPM to:
8
+
9
+ 1. Use, copy, and integrate it into your own software projects, including commercial and resellable applications.
10
+ 2. Distribute the integrated software (e.g., as part of your bundled product), provided the Connekz NPM package is not redistributed standalone or in unmodified form.
11
+
12
+ Subject to the following conditions:
13
+
14
+ - The software may not be modified, reverse-engineered, decompiled, or disassembled.
15
+ - Standalone redistribution, sublicensing, renting, leasing, or creation of derivative works (beyond integration) requires explicit written permission from Connekz Limited.
16
+ - Use is limited to projects connecting to authorized Connekz instances with valid credentials. Unauthorized use is prohibited.
17
+ - This software is provided "AS IS" without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement.
18
+
19
+ Connekz Limited reserves the right to terminate this license at any time for any reason.
20
+
21
+ Governing Law: This license shall be governed by the laws of New Zealand.
22
+
23
+ For inquiries, contact: contact@connekz.com
24
+
25
+ By using this software, you agree to these terms.
package/README.md ADDED
@@ -0,0 +1,335 @@
1
+ # Connekz Agent
2
+
3
+ ![Connekz Logo](https://storage.connekz.com/common/logos/full-logo-420.webp)
4
+
5
+ Human-like AI agent for seamless integration into websites, apps, and automations. This npm package allows developers to embed the Connekz agent as a customer assistant, task runner, and more.
6
+
7
+ ## Description
8
+
9
+ Connekz Agent is part of the Connekz developer toolkit, enabling AI-driven interactions in your projects. It supports natural conversations, built-in tools for tasks like bookings and website navigation, and easy integration via npm.
10
+
11
+ - **Key Capabilities**:
12
+ - Customer support via chat or voice-like interactions.
13
+ - Task automation: Handle bookings, navigate sites, run custom actions.
14
+ - Compatible with web, mobile, and backend setups.
15
+ - Stateful memory for personalized, context-aware responses.
16
+ - Realtime voice and text interfaces with transcription support.
17
+ - Tool calls for extending functionality (e.g., navigation, API integrations).
18
+
19
+ ## Installation
20
+
21
+ Install via npm:
22
+
23
+ ```bash
24
+ npm install @connekz/chat
25
+ ```
26
+
27
+ ## Usage
28
+ Import and initialize the agent in your Vue.js project (compatible with Vue 3). The package provides headless APIs for socket and agent management, plus mountable components for UI elements.
29
+
30
+ ## Initialization Example
31
+
32
+ ```typescript
33
+ import init, { type ConnekzInstance, type ConnekzAgentStatus, type ConnekzToolCallPayload } from '@connekz/chat';
34
+
35
+ const connekzInstance: ConnekzInstance = init({
36
+ clientId: 'your-client-id', // Required
37
+ clientSecret: 'your-client-secret', // Required
38
+ userIdentity: 'optional-user-id', // (optional: Will be generated if not provided. This helps to identify users across multiple sessions.)
39
+ aiSphere: { // Optional: Mount AI visualization sphere
40
+ mountElementId: 'ai-sphere-container',
41
+ themeColor: '#your-color', // Hex color code
42
+ },
43
+ transcription: { // Optional: Mount transcription display
44
+ mountElementId: 'transcript-container',
45
+ },
46
+ chatWindow: { // Optional: Mount full chat window
47
+ mountElementId: 'chat-window-container',
48
+ disableTalkMode: false, // Optional
49
+ disableChatMode: false, // Optional
50
+ },
51
+ connekzControls: { // Optional: Mount AI controls UI
52
+ mountElementId: 'controls-container',
53
+ },
54
+ });
55
+
56
+ // Access APIs
57
+ const { connekzSocket, connekzAgent, unmount } = connekzInstance;
58
+ ```
59
+
60
+ ### Unmounting Call
61
+ ```typescript
62
+ connekzInstance.unmount()
63
+ ```
64
+ to clean up resources and unmount components.
65
+
66
+ ## Agent Management
67
+ - Start/Stop Agent:
68
+ ````typescript
69
+ connekzAgent.startAgent(); // Initiates voice agent
70
+ connekzAgent.stopAgent(); // Stops and cleans up
71
+ ````
72
+ - Manually Inject Text Message:
73
+ ````typescript
74
+ connekzAgent.injectMessage('User query text');
75
+ ````
76
+ - Toggle Microphone
77
+ ````typescript
78
+ connekzAgent.toggleMic();
79
+ ````
80
+ - Testing Helpers (for development):
81
+ ````typescript
82
+ connekzAgent.startCaptureTest(); // Start audio capture test
83
+ connekzAgent.stopCaptureTest(); // Stop audio capture test
84
+ connekzAgent.playCapturedAudio(); // Playback captured audio test
85
+ ````
86
+
87
+ ## Subscriptions
88
+ Subscribe to events for realtime updates:
89
+ ````typescript
90
+ // Agent Subscriptions
91
+ const unsubStatus = connekzAgent.subscribe.onAgentStatusChange((status: ConnekzAgentStatus) => {
92
+ console.log('Agent status:', status);
93
+ });
94
+
95
+ const unsubMic = connekzAgent.subscribe.onMicStatusChange((status: 'active' | 'muted') => {
96
+ console.log('Mic status:', status);
97
+ });
98
+
99
+ const unsubUserWave = connekzAgent.subscribe.onUserWaveformUpdate((volume: number) => {
100
+ console.log('User volume:', volume);
101
+ });
102
+
103
+ const unsubAgentWave = connekzAgent.subscribe.onAgentWaveformUpdate((volume: number) => {
104
+ console.log('Agent volume:', volume);
105
+ });
106
+
107
+ const unsubTranscript = connekzAgent.subscribe.onTranscriptUpdate((transcript: readonly ConnekzConversation[]) => {
108
+ console.log('Transcript:', transcript);
109
+ });
110
+
111
+ // Tool Call Handling
112
+ const unsubTool = connekzAgent.subscribe.onToolCall(async (tool: ConnekzToolCallPayload): Promise<string> => {
113
+ console.log('Tool call:', tool.name, tool.arguments);
114
+ // Execute tool logic
115
+ if (tool.name === 'your-tool') {
116
+ // Process arguments and return result as string
117
+ return 'Success: Action completed.';
118
+ }
119
+ return 'Error: Unknown tool.';
120
+ });
121
+
122
+ // Unsubscribe when done
123
+ unsubStatus();
124
+ unsubTool(); // etc.
125
+ ````
126
+
127
+ ## Socket Management
128
+ Socket is automatically managed with agent start/stop. The following methods available for manual control:
129
+ ````typescript
130
+ connekzSocket.connect(); // Force optional
131
+ connekzSocket.disconnect();
132
+ connekzSocket.cleanup(); // Remove listeners
133
+ ````
134
+
135
+ ## Integration Tips
136
+ - Frontend Embedding: Mount built-in UI or use headless APIs to integrate into existing apps.
137
+ - Backend/Automations: Use headless APIs for server-side task running or integrations.
138
+ - Custom Tools: Subscribe to onToolCall for handling AI-triggered actions (e.g., site navigation, API calls). Ensure the tools are defined in the connekz instance Memory & Tools section on the developer portal.
139
+ - Error Handling: Monitor agent status for 'ERROR' or 'DISCONNECTED' and also your app console logs.
140
+ - Privacy/Security: Provide clientId/secret securely; userIdentity for isolated sessions.
141
+
142
+ ## Examples
143
+ ### Basic Voice Agent on a React website
144
+ ```jsx
145
+ import React, { useEffect, useState } from 'react';
146
+ import init from '@connekz/chat';
147
+
148
+ function App() {
149
+ const [instance, setInstance] = useState(null);
150
+ const [isActive, setIsActive] = useState(false);
151
+
152
+ useEffect(() => {
153
+ const connekz = init({
154
+ clientId: 'your-client-id',
155
+ clientSecret: 'your-client-secret',
156
+ chatWindow: { mountElementId: 'chat-window-container' }, // This will mount a full chat window (optional)
157
+ // Mount Modules
158
+ // aiSphere: { mountElementId: 'ai-sphere-container' }, // This will mount the AI visualization sphere (optional)
159
+ // transcription: { mountElementId: 'transcript-container' }, // This will mount the transcription display (optional)
160
+ });
161
+ setInstance(connekz);
162
+
163
+ const unsubStatus = connekz.connekzAgent.subscribe.onAgentStatusChange((status) => {
164
+ setIsActive(status !== 'STOPPED');
165
+ });
166
+
167
+ const unsubTool = connekz.connekzAgent.subscribe.onToolCall(async (tool) => {
168
+ console.log('Tool call:', tool);
169
+ // Handle tool logic
170
+ return 'Result string';
171
+ });
172
+
173
+ return () => {
174
+ unsubStatus();
175
+ unsubTool();
176
+ connekz.unmount();
177
+ };
178
+ }, []);
179
+
180
+ const toggleAgent = () => {
181
+ if (isActive) {
182
+ instance.connekzAgent.stopAgent();
183
+ } else {
184
+ instance.connekzAgent.startAgent();
185
+ }
186
+ };
187
+
188
+ return (
189
+ <div>
190
+ <div id="chat-window-container"></div>
191
+ {/*<div id="ai-sphere-container"></div>*/}
192
+ {/*<div id="transcript-container"></div>*/}
193
+ <button onClick={toggleAgent}>
194
+ {isActive ? 'Stop' : 'Start'} Agent
195
+ </button>
196
+ </div>
197
+ );
198
+ }
199
+
200
+ export default App;
201
+ ```
202
+
203
+ ### Basic Voice Agent on a Vue Website
204
+ ```vue
205
+ <template>
206
+ <div>
207
+ <div id="chat-window-container"></div>
208
+ <!-- <div id="ai-sphere-container"></div>-->
209
+ <!-- <div id="transcript-container"></div>-->
210
+ <button @click="toggleAgent">{{ isActive ? 'Stop' : 'Start' }} Agent</button>
211
+ </div>
212
+ </template>
213
+
214
+ <script setup>
215
+ import { ref, onMounted } from 'vue';
216
+ import init from '@connekz/chat';
217
+
218
+ const instance = ref(null);
219
+ const isActive = ref(false);
220
+
221
+ onMounted(() => {
222
+ instance.value = init({
223
+ clientId: 'your-client-id',
224
+ clientSecret: 'your-client-secret',
225
+ chatWindow: { mountElementId: 'chat-window-container' }, // This will mount a full chat window (optional)
226
+ // Mount Modules
227
+ // aiSphere: { mountElementId: 'ai-sphere-container' }, // This will mount the AI visualization sphere (optional)
228
+ // transcription: { mountElementId: 'transcript-container' }, // This will mount the transcription display (optional)
229
+ });
230
+ instance.value.connekzAgent.subscribe.onAgentStatusChange(status => {
231
+ isActive.value = status !== 'STOPPED';
232
+ });
233
+ instance.value.connekzAgent.subscribe.onToolCall(async tool => {
234
+ // Handle tool
235
+ return 'Result';
236
+ });
237
+ });
238
+
239
+ const toggleAgent = () => {
240
+ if (isActive.value) {
241
+ instance.value.connekzAgent.stopAgent();
242
+ } else {
243
+ instance.value.connekzAgent.startAgent();
244
+ }
245
+ };
246
+ </script>
247
+ ```
248
+
249
+ ### Plain JavaScript Example
250
+ ```javascript
251
+ // Initialize in a script tag or main.js
252
+ import init from '@connekz/chat';
253
+
254
+ const connekzInstance = init({
255
+ clientId: 'your-client-id',
256
+ clientSecret: 'your-client-secret',
257
+ chatWindow: { mountElementId: 'chat-window-container' }, // This will mount a full chat window (optional)
258
+ // Mount Modules
259
+ // aiSphere: { mountElementId: 'ai-sphere-container' }, // This will mount the AI visualization sphere (optional)
260
+ // transcription: { mountElementId: 'transcript-container' }, // This will mount the transcription display (optional)
261
+ });
262
+
263
+ // Subscriptions
264
+ const unsubStatus = connekzInstance.connekzAgent.subscribe.onAgentStatusChange((status) => {
265
+ console.log('Agent status:', status);
266
+ // Update UI, e.g., button text
267
+ const button = document.getElementById('toggle-button');
268
+ button.textContent = status !== 'STOPPED' ? 'Stop Agent' : 'Start Agent';
269
+ });
270
+
271
+ const unsubTool = connekzInstance.connekzAgent.subscribe.onToolCall(async (tool) => {
272
+ console.log('Tool call:', tool);
273
+ // Handle tool logic
274
+ return 'Result string';
275
+ });
276
+
277
+ // Toggle agent on button click
278
+ document.getElementById('toggle-button').addEventListener('click', () => {
279
+ const isActive = connekzInstance.connekzAgent.subscribe.onAgentStatusChange(); // Get current status if needed
280
+ if (isActive !== 'STOPPED') {
281
+ connekzInstance.connekzAgent.stopAgent();
282
+ } else {
283
+ connekzInstance.connekzAgent.startAgent();
284
+ }
285
+ });
286
+
287
+ // Cleanup on unload
288
+ window.addEventListener('beforeunload', () => {
289
+ unsubStatus();
290
+ unsubTool();
291
+ connekzInstance.unmount();
292
+ });
293
+ ```
294
+ ```html
295
+ <!-- HTML Structure -->
296
+ <div id="chat-window-container"></div>
297
+ <!--<div id="ai-sphere-container"></div>-->
298
+ <!--<div id="transcript-container"></div>-->
299
+ <button id="toggle-button">Start Agent</button>
300
+ ```
301
+
302
+
303
+ ### Tool Call Payload:
304
+ ````typescript
305
+ {
306
+ name: string;
307
+ arguments: Record<string, any>;
308
+ }
309
+ ````
310
+
311
+ ### Tool Call Handler Example
312
+ ````typescript
313
+ connekzInstance.value.connekzAgent.subscribe.onToolCall(handleToolCall);
314
+
315
+ const acceptedPaths = ['/home', '/about', '/contact'];
316
+ async function handleToolCall(tool: ConnekzToolCallPayload): Promise<string> {
317
+ switch (tool.name) {
318
+ case 'navigate_to': {
319
+ const path = (tool.arguments)?.path || null;
320
+ if (path && acceptedPaths.includes(path)) {
321
+ router.push(path);
322
+ return `Navigation Success. Now user on ${path}.`;
323
+ } else {
324
+ return !path ? 'Navigation Error: Destination path parameter must be provided to navigate.' : `Navigation Error: Path must be one of the following enums ${acceptedPaths.join(', ')}`
325
+ }
326
+ }
327
+ default:
328
+ return 'Error: Unknown tool name.';
329
+ }
330
+ }
331
+ ````
332
+
333
+ ### Tool Call Response:
334
+ Always return a string (plain text or JSON.stringify for structured data).
335
+
@@ -0,0 +1 @@
1
+ :root{--connekz-primary: #008fd7;--connekz-secondary: #00D0EF;--connekz-content: #404040}@media (prefers-color-scheme: dark){:root{--connekz-primary: #008fd7;--connekz-secondary: #00D0EF;--connekz-content: #f8f8f8}}.connekz_glass-panel{background:linear-gradient(to bottom,#051b270d,#18364c78);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);box-shadow:0 4px 12px #0003}.connekz_glass-panel.selectable{cursor:pointer}.connekz_glass-panel.selectable:hover{background:linear-gradient(to bottom,#051b271a,#18364c7a);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);box-shadow:0 6px 16px #00000026;transform:scale(1.02);transition:all .2s ease}.connekz_clickable-scale{cursor:pointer;transition:transform .2s ease;scale:1}.connekz_clickable-scale:hover{scale:1.02}.connekz_btn-ghost:hover{background-color:transparent;box-shadow:none;outline:none;border:none}.connekz_btn{border:unset;transition:all .2s ease;cursor:pointer;color:var(--connekz-content)}.connekz_btn:hover,.connekz_btn.--active{color:var(--connekz-primary)}.connekz_btn:disabled{cursor:not-allowed;opacity:.6}.connekz_btn:disabled:hover{color:var(--connekz-content)}.connekz_btn.connekz_btn-ghost{background:transparent;border:none}.connekz_rounded{border-radius:50%}.connekz_color-primary{color:var(--connekz-primary)}.connekz_color-secondary{color:var(--connekz-secondary)}.connekz_bg-primary{background-color:var(--connekz-primary)}.connekz_bg-secondary{background-color:var(--connekz-secondary)}svg[data-v-8994aa1e]{display:inline-block}svg[data-v-8994aa1e] *{fill:currentColor}.connekz_switch[data-v-a7848b10]{width:fit-content;border-radius:10px;padding:4px 12px;display:flex;gap:8px;justify-content:space-between}.dot-animation-wrapper .dot[data-v-0d55de5f]{font-size:18px;opacity:0;animation:fadeInOut-0d55de5f 1.5s infinite}.dot-animation-wrapper .dot[data-v-0d55de5f]:nth-child(1){animation-delay:0s}.dot-animation-wrapper .dot[data-v-0d55de5f]:nth-child(2){animation-delay:.3s}.dot-animation-wrapper .dot[data-v-0d55de5f]:nth-child(3){animation-delay:.6s}@keyframes fadeInOut-0d55de5f{0%,to{opacity:0}50%{opacity:1}}.text-message-input[data-v-5d23ab16]{padding-left:8px}.text-message-input .textarea[data-v-5d23ab16]{width:100%;max-height:4.5rem;line-height:22px;font-size:16px;font-family:Inter,sans-serif;color:var(--connekz-content);padding:0 8px 0 2px;min-height:unset;background-color:transparent;outline:none;resize:none;border:none;overflow-x:hidden;overflow-y:auto;height:fit-content;box-shadow:unset}.text-message-input .textarea[data-v-5d23ab16]:hover,.text-message-input .textarea[data-v-5d23ab16]:focus,.text-message-input .textarea[data-v-5d23ab16]:active{background-color:transparent;outline:none;border:none;box-shadow:unset}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart{font-family:-apple-system,BlinkMacSystemFont,Helvetica Neue,sans-serif;font-size:16px;display:flex;flex-direction:column;height:420px;color:#222427;border:1px solid #d9d9d9;border-radius:5px;background:#fff}.emoji-mart-emoji{padding:6px;position:relative;display:inline-block;font-size:0;border:none;background:none;box-shadow:none}.emoji-mart-emoji span{display:inline-block}.emoji-mart-preview-emoji .emoji-mart-emoji span{width:38px;height:38px;font-size:32px}.emoji-type-native{font-family:"Segoe UI Emoji",Segoe UI Symbol,Segoe UI,"Apple Color Emoji",Twemoji Mozilla,"Noto Color Emoji",EmojiOne Color,"Android Emoji";word-break:keep-all}.emoji-type-image{background-size:6100%}.emoji-type-image.emoji-set-apple{background-image:url(https://unpkg.com/emoji-datasource-apple@15.0.1/img/apple/sheets-256/64.png)}.emoji-type-image.emoji-set-facebook{background-image:url(https://unpkg.com/emoji-datasource-facebook@15.0.1/img/facebook/sheets-256/64.png)}.emoji-type-image.emoji-set-google{background-image:url(https://unpkg.com/emoji-datasource-google@15.0.1/img/google/sheets-256/64.png)}.emoji-type-image.emoji-set-twitter{background-image:url(https://unpkg.com/emoji-datasource-twitter@15.0.1/img/twitter/sheets-256/64.png)}.emoji-mart-bar{border:0 solid #d9d9d9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.emoji-mart-scroll{position:relative;overflow-y:scroll;flex:1;padding:0 6px 6px;z-index:0;will-change:transform;-webkit-overflow-scrolling:touch}.emoji-mart-anchors{display:flex;flex-direction:row;justify-content:space-between;padding:0 6px;color:#858585;line-height:0}.emoji-mart-anchor{position:relative;display:block;flex:1 1 auto;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;border:none;background:none;box-shadow:none}.emoji-mart-anchor:hover,.emoji-mart-anchor-selected{color:#464646}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#464646}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart .scroller{height:250px;position:relative;flex:1;padding:0 6px 6px;z-index:0;will-change:transform;-webkit-overflow-scrolling:touch}.emoji-mart-search{margin-top:6px;padding:0 6px}.emoji-mart-search input{font-size:16px;display:block;width:100%;padding:.2em .6em;border-radius:25px;border:1px solid #d9d9d9;outline:0}.emoji-mart-search-results{height:250px;overflow-y:scroll}.emoji-mart-category{position:relative}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center;cursor:default}.emoji-mart-category .emoji-mart-emoji:hover:before,.emoji-mart-emoji-selected:before{z-index:0;content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:#f4f4f4;border-radius:100%;opacity:0}.emoji-mart-category .emoji-mart-emoji:hover:before,.emoji-mart-emoji-selected:before{opacity:1}.emoji-mart-category-label{position:sticky;top:0}.emoji-mart-static .emoji-mart-category-label{z-index:2;position:relative}.emoji-mart-category-label h3{display:block;font-size:16px;width:100%;font-weight:500;padding:5px 6px;background-color:#fff;background-color:#fffffff2}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#858585}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover:before{content:none}.emoji-mart-preview{position:relative;height:70px}.emoji-mart-preview-emoji,.emoji-mart-preview-data,.emoji-mart-preview-skins{position:absolute;top:50%;transform:translateY(-50%)}.emoji-mart-preview-emoji{left:12px}.emoji-mart-preview-data{left:68px;right:12px;word-break:break-all}.emoji-mart-preview-skins{right:30px;text-align:right}.emoji-mart-preview-name{font-size:14px}.emoji-mart-preview-shortname{font-size:12px;color:#888}.emoji-mart-preview-shortname+.emoji-mart-preview-shortname,.emoji-mart-preview-shortname+.emoji-mart-preview-emoticon,.emoji-mart-preview-emoticon+.emoji-mart-preview-emoticon{margin-left:.5em}.emoji-mart-preview-emoticon{font-size:11px;color:#bbb}.emoji-mart-title span{display:inline-block;vertical-align:middle}.emoji-mart-title .emoji-mart-emoji{padding:0}.emoji-mart-title-label{color:#999a9c;font-size:21px;font-weight:300}.emoji-mart-skin-swatches{font-size:0;padding:2px 0;border:1px solid #d9d9d9;border-radius:12px;background-color:#fff}.emoji-mart-skin-swatches-opened .emoji-mart-skin-swatch{width:16px;padding:0 2px}.emoji-mart-skin-swatches-opened .emoji-mart-skin-swatch-selected:after{opacity:.75}.emoji-mart-skin-swatch{display:inline-block;width:0;vertical-align:middle;transition-property:width,padding;transition-duration:.125s;transition-timing-function:ease-out}.emoji-mart-skin-swatch:nth-child(1){transition-delay:0s}.emoji-mart-skin-swatch:nth-child(2){transition-delay:.03s}.emoji-mart-skin-swatch:nth-child(3){transition-delay:.06s}.emoji-mart-skin-swatch:nth-child(4){transition-delay:.09s}.emoji-mart-skin-swatch:nth-child(5){transition-delay:.12s}.emoji-mart-skin-swatch:nth-child(6){transition-delay:.15s}.emoji-mart-skin-swatch-selected{position:relative;width:16px;padding:0 2px}.emoji-mart-skin-swatch-selected:after{content:"";position:absolute;top:50%;left:50%;width:4px;height:4px;margin:-2px 0 0 -2px;background-color:#fff;border-radius:100%;pointer-events:none;opacity:0;transition:opacity .2s ease-out}.emoji-mart-skin{display:inline-block;width:100%;padding-top:100%;max-width:12px;border-radius:100%}.emoji-mart-skin-tone-1{background-color:#ffc93a}.emoji-mart-skin-tone-2{background-color:#fadcbc}.emoji-mart-skin-tone-3{background-color:#e0bb95}.emoji-mart-skin-tone-4{background-color:#bf8f68}.emoji-mart-skin-tone-5{background-color:#9b643d}.emoji-mart-skin-tone-6{background-color:#594539}.emoji-mart .vue-recycle-scroller{position:relative}.emoji-mart .vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.emoji-mart .vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.emoji-mart .vue-recycle-scroller.direction-horizontal{display:flex}.emoji-mart .vue-recycle-scroller__slot{flex:auto 0 0}.emoji-mart .vue-recycle-scroller__item-wrapper{flex:1;box-sizing:border-box;overflow:hidden;position:relative}.emoji-mart .vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.emoji-mart .vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.emoji-mart .vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.emoji-mart .vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.emoji-mart .vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.emoji-mart .resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.emoji-mart .resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.emoji-mart-search .hidden{display:none;visibility:hidden}.emoji-message-input .emoji-picker[data-v-e5162b25]{position:absolute;opacity:0;overflow:hidden;width:0;height:0;transform:translate(-16px,24px);transition:all .2s ease;z-index:99}.emoji-message-input .emoji-picker.--open[data-v-e5162b25]{width:338px;height:420px;transform:translate(0);opacity:1}.emoji-mart-preview,.emoji-mart-bar.emoji-mart-bar-preview,.emoji-mart-search{display:none!important}.emoji-mart.emoji-mart-static{background:linear-gradient(to bottom,#051b27cc,#18364c);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:4px;box-shadow:0 4px 12px #0003;border:1px solid rgba(255,255,255,.2);border-top:1px solid rgba(255,255,255,.1);border-bottom:2px solid rgba(255,255,255,.4);border-radius:12px}.emoji-btn-icon{margin-top:2px}.emoji-mart-anchor{color:#fff!important}.emoji-mart-category-label{background-color:transparent!important;color:#fff!important}.message-input-wrapper[data-v-08883d50]{display:flex;align-items:center;border-radius:16px;gap:0;padding:2px 4px}.message-input-wrapper>div[data-v-08883d50]:first-child{flex:1}.message-input-wrapper .message-send-button[data-v-08883d50]{display:flex;justify-content:center;align-items:center;background-color:var(--connekz-primary);color:#fff;width:32px;height:32px}.connekz-controls-container[data-v-effcc795]{width:100%;height:80px;display:flex;justify-content:space-between;gap:12px;align-items:center}.connekz-controls-container .control-btn[data-v-effcc795]{width:40px;height:40px;padding:0}.connekz-controls-container .control-btn-large[data-v-effcc795]{width:60px;height:60px}.ai-keyboard-input[data-v-effcc795]{position:absolute;right:16px;opacity:1;width:calc(100% - 88px);transition:all .2s ease-out}.ai-keyboard-input.--hidden[data-v-effcc795]{opacity:0;width:0}.connekz-message-item-wrapper[data-v-797e7322]{width:100%;display:flex}.connekz-message-item-wrapper.failed-message[data-v-797e7322]{padding-bottom:20px}.connekz-message-item-wrapper.align-right[data-v-797e7322]{justify-content:flex-end}.connekz-message-item-wrapper.align-right .message-item[data-v-797e7322]{margin-right:12px}.connekz-message-item-wrapper.align-left[data-v-797e7322]{margin-left:12px}.connekz-message-item-wrapper.last-message[data-v-797e7322]{margin-bottom:72px}.connekz-message-item-wrapper .message-item[data-v-797e7322]{border-radius:20px;margin-top:5px;margin-bottom:5px;display:inline-block;position:relative}.connekz-message-item-wrapper .message-item.yours[data-v-797e7322]{margin-right:25%}.connekz-message-item-wrapper .message-item.yours .message-bubble[data-v-797e7322]{background-color:#eee}.connekz-message-item-wrapper .message-item.yours.last[data-v-797e7322]:before{content:"";position:absolute;z-index:-1;bottom:0;left:-7px;height:20px;width:20px;background:#eee;border-bottom-right-radius:15px}.connekz-message-item-wrapper .message-item.yours.last[data-v-797e7322]:after{content:"";position:absolute;z-index:0;bottom:0;left:-10px;width:10px;height:20px;background:#fff;border-bottom-right-radius:10px}.connekz-message-item-wrapper .message-item.mine[data-v-797e7322]{color:#fff;margin-left:25%}.connekz-message-item-wrapper .message-item.mine .message-bubble[data-v-797e7322]{background:linear-gradient(to bottom,#00d0ea,#0085d1);background-attachment:fixed;color:#fff}.connekz-message-item-wrapper .message-item.mine.last[data-v-797e7322]:before{content:"";position:absolute;z-index:-1;bottom:0;right:-8px;height:20px;width:20px;background:linear-gradient(to bottom,#00d0ea,#0085d1);background-attachment:fixed;border-bottom-left-radius:15px}.connekz-message-item-wrapper .message-item.mine.last[data-v-797e7322]:after{content:"";position:absolute;z-index:0;bottom:0;right:-10px;width:10px;height:20px;background:#fff;border-bottom-left-radius:10px}.connekz-message-item-wrapper .message-item .message-bubble[data-v-797e7322]{padding:8px 15px;border-radius:20px;position:relative;z-index:1}.connekz-message-item-wrapper .message-item .message-bubble .message-at[data-v-797e7322]{width:100%;text-align:right;font-size:10px;margin-top:4px;opacity:.5}.connekz-message-item-wrapper .message-item .message-bubble .send-failed[data-v-797e7322]{position:absolute;color:red;bottom:-20px;right:12px;width:fit-content;display:flex;justify-content:flex-end;text-wrap:nowrap;cursor:pointer}.connekz-message-item-wrapper .message-item .message-bubble .send-failed[data-v-797e7322]:hover{text-decoration:underline}.bot-enter-active,.bot-leave-active{transition:opacity .3s ease,scale .6s ease}.bot-enter-from,.bot-leave-to{opacity:0;scale:0}.ai-bot-visualization{position:relative;display:flex;justify-content:center;align-items:center}.ai-bot-visualization.--disabled{opacity:.7;filter:grayscale(100%)}.ai-bot-visualization .inner-avatar{position:absolute;display:flex;justify-content:center;align-items:center;border-radius:50%}.ai-bot-visualization img.bot-image{cursor:pointer;scale:1;object-fit:cover;border-radius:50%;width:100%;height:100%}.ai-bot-visualization img.bot-image.grayscale{filter:grayscale(100%)}.ai-bot-visualization img.bot-image.--heart-beat{animation:animateHeart 1.5s infinite}.ai-bot-visualization img.bot-image.--spinning{animation-name:spin;animation-duration:6s;animation-iteration-count:infinite;animation-timing-function:ease-in-out}.ai-bot-visualization img.bot-image.--pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.ai-bot-visualization img.bot-image.--bounce{animation:bounce 1s ease infinite;transform-origin:center bottom}.ai-bot-visualization img.bot-image.--greyscale{transition:filter .5s ease-in-out;filter:grayscale(100%)}.ai-bot-visualization img.bot-image.--shake{animation:shake .82s cubic-bezier(.36,.07,.19,.97) infinite;transform:translateZ(0);backface-visibility:hidden;perspective:1000px}.ai-bot-visualization img.bot-image.--glow{animation:glow 2s ease-in-out infinite alternate;filter:drop-shadow(0 0 4px rgba(0,119,255,.7))}.ai-bot-visualization img.bot-image.--float{animation:float 3s ease-in-out infinite}.ai-bot-visualization img.bot-image.--wiggle{animation:wiggle 1s ease-in-out infinite}.ai-bot-visualization img.bot-image.--fade{animation:fade 2.5s ease-in-out infinite}.ai-bot-visualization img.bot-image.--zoom{animation:zoom 1.8s ease-in-out infinite}.ai-bot-visualization.size-2xs,.ai-bot-visualization .inner-avatar.size-2xs{width:18px;height:18px}.ai-bot-visualization.size-xs,.ai-bot-visualization .inner-avatar.size-xs{width:36px;height:36px}.ai-bot-visualization.size-sm,.ai-bot-visualization .inner-avatar.size-sm{width:42px;height:42px}.ai-bot-visualization.size-md,.ai-bot-visualization .inner-avatar.size-md{width:58px;height:58px}.ai-bot-visualization.size-lg,.ai-bot-visualization .inner-avatar.size-lg{width:72px;height:72px}.ai-bot-visualization.size-xl,.ai-bot-visualization .inner-avatar.size-xl{width:96px;height:96px}.ai-bot-visualization.size-2xl,.ai-bot-visualization .inner-avatar.size-2xl{width:120px;height:120px}.ai-bot-visualization.size-3xl,.ai-bot-visualization .inner-avatar.size-3xl{width:160px;height:160px}.ai-bot-visualization.size-4xl,.ai-bot-visualization .inner-avatar.size-4xl{width:200px;height:200px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes animateHeart{0%{transform:scale(.9)}5%{transform:scale(1.1)}10%{transform:scale(.9)}15%{transform:scale(1.2)}50%{transform:scale(.9)}to{transform:scale(.9)}}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.95)}}@keyframes bounce{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-10px)}60%{transform:translateY(-5px)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-3px,0,0)}40%,60%{transform:translate3d(3px,0,0)}}@keyframes glow{0%{filter:drop-shadow(0 0 2px rgba(0,119,255,.3))}to{filter:drop-shadow(0 0 10px rgba(0,119,255,.8))}}@keyframes float{0%{transform:translateY(0)}50%{transform:translateY(-8px)}to{transform:translateY(0)}}@keyframes wiggle{0%,to{transform:rotate(0)}25%{transform:rotate(-5deg)}75%{transform:rotate(5deg)}}@keyframes fade{0%,to{opacity:1}50%{opacity:.5}}@keyframes zoom{0%,to{transform:scale(1)}50%{transform:scale(1.2)}}.user-inputting-indicator .inputting-indicator-inner[data-v-bdcc33e1]{display:flex;gap:2px}.connekz-message-log[data-v-066f5474]{max-height:100%;height:100%;position:relative;overflow:hidden}.connekz-message-log .chat-messages[data-v-066f5474]{z-index:0;width:100%;max-height:100%;overflow-y:auto;overflow-x:hidden;position:relative;display:flex;flex-direction:column-reverse;align-items:flex-start}.connekz-message-log .chat-messages .connekz-inputting-indicator[data-v-066f5474]{position:absolute;bottom:12px;left:12px;z-index:1}.new-message[data-v-066f5474]{animation:slideIn-066f5474 .2s ease forwards}@keyframes slideIn-066f5474{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.connekz-transcriptions-container[data-v-4dd0de6e]{padding:12px 16px;overflow-y:auto;-webkit-mask-image:linear-gradient(to bottom,transparent 0%,black 10%);mask-image:linear-gradient(to bottom,transparent 0%,black 10%);display:flex;flex-direction:column}.connekz-transcriptions-container .message-group[data-v-4dd0de6e]{display:flex;flex-direction:column;justify-content:flex-end;gap:8px;height:100%;font-size:16px;line-height:1.4;overflow:hidden}.connekz-transcriptions-container .message-group .text-primary[data-v-4dd0de6e]{color:var(--connekz-primary)}.connekz-transcriptions-container .message-group .text-right[data-v-4dd0de6e]{text-align:right}.connekz-transcriptions-container .message-group .text-left[data-v-4dd0de6e]{text-align:left}.chat-item-enter-active[data-v-4dd0de6e],.chat-item-leave-active[data-v-4dd0de6e]{transition:all .3s ease}.chat-item-enter-from[data-v-4dd0de6e],.chat-item-leave-to[data-v-4dd0de6e]{opacity:0;transform:translateY(10px)}.chat-item-enter-to[data-v-4dd0de6e],.chat-item-leave-from[data-v-4dd0de6e]{opacity:1;transform:translateY(0)}.scrollbar-hidden[data-v-4dd0de6e]::-webkit-scrollbar{display:none}.scrollbar-hidden[data-v-4dd0de6e]{-ms-overflow-style:none;scrollbar-width:none}.globe[data-v-0acd2811]{width:100%;height:100%;padding:16px;position:relative}.glow[data-v-0acd2811]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;border-radius:50%}.sphere-wrapper[data-v-0acd2811]{position:absolute;border-radius:50%;overflow:hidden;transition:opacity .3s ease;opacity:1}.sphere[data-v-0acd2811]{-webkit-user-drag:none!important;position:absolute;object-fit:cover}.connekz-window[data-v-24ea1727]{font-family:Inter,sans-serif;font-size:14px;color:var(--connekz-content);width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}.connekz-window .connekz-loader[data-v-24ea1727]{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.connekz-window .connekz-loader .skeleton[data-v-24ea1727]{width:100%;height:100%;background:var(--connekz-content);opacity:.1;animation:shimmer-24ea1727 2s infinite ease-in-out}@keyframes shimmer-24ea1727{0%,to{opacity:.1}50%{opacity:0}}.connekz-window .connekz-init-error[data-v-24ea1727]{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.connekz-window .connekz-init-error span[data-v-24ea1727]{width:fit-content;height:24px;background:#ff00001a;display:flex;align-items:center;justify-content:center;padding:4px 12px;border-radius:8px;color:#f00c}.connekz-window .connekz-loaded-window[data-v-24ea1727]{width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}.connekz-window .connekz-loaded-window .conversation-type-switcher[data-v-24ea1727]{width:100%;height:fit-content;display:flex;justify-content:center;align-items:center}.connekz-window .connekz-loaded-window .reconnecting-message-wrapper[data-v-24ea1727]{height:32px;overflow:hidden}.connekz-window .connekz-loaded-window .reconnecting-message-wrapper .reconnecting-message[data-v-24ea1727]{display:flex;width:100%;justify-content:center;align-items:center;margin-top:12px;font-style:italic;opacity:.7;color:red}.connekz-window .connekz-loaded-window .connekz-main[data-v-24ea1727]{overflow:hidden;max-height:100%;display:flex;flex-direction:row;width:200%;height:calc(100% - (78px + env(safe-area-inset-top) + env(safe-area-inset-bottom)));transition:transform .3s ease}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper[data-v-24ea1727],.connekz-window .connekz-loaded-window .connekz-main .connekz-chat-wrapper[data-v-24ea1727]{width:50%;min-width:50%;max-width:50%;max-height:100%;position:relative;overflow:hidden}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper[data-v-24ea1727]{display:flex;flex-direction:column;height:100%;overflow:hidden}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper .connekz-sphere-wrapper[data-v-24ea1727]{width:100%;padding:12px 0;height:fit-content;display:flex;flex-direction:column;justify-content:center;align-items:center;flex-shrink:0}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper .connekz-sphere-wrapper .connekz-sphere[data-v-24ea1727]{width:72px;height:72px}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper .connekz-status-wrapper[data-v-24ea1727]{margin-top:8px;width:100%;height:32px;display:flex;justify-content:center;align-items:center;flex-shrink:0}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper .connekz-status-wrapper .connekz-status[data-v-24ea1727]{opacity:.7;display:flex;justify-content:center;align-items:center}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper .connekz-transcriptions[data-v-24ea1727]{flex:1;overflow-y:auto;overflow-x:hidden}.connekz-window .connekz-loaded-window .connekz-main .connekz-voice-wrapper .connekz-controls-wrapper[data-v-24ea1727]{max-width:100%;display:flex;justify-content:center;align-items:center;margin-top:12px;padding:0 12px;flex-shrink:0}.connekz-window .connekz-loaded-window .connekz-main .connekz-chat-wrapper[data-v-24ea1727]{display:flex;flex-direction:column;height:100%}.connekz-window .connekz-loaded-window .connekz-main .connekz-chat-wrapper .message-log[data-v-24ea1727]{flex:1;overflow-y:auto;overflow-x:hidden}.connekz-window .connekz-loaded-window .connekz-main .connekz-chat-wrapper .message-inputs[data-v-24ea1727]{flex-shrink:0}