@cossistant/react 0.0.32 → 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 +3 -3
- package/hooks/index.d.ts +2 -2
- package/hooks/index.js +2 -2
- package/hooks/private/store/use-store-selector.d.ts.map +1 -1
- package/hooks/private/store/use-store-selector.js +8 -4
- package/hooks/private/store/use-store-selector.js.map +1 -1
- package/hooks/private/use-client-query.js +5 -2
- package/hooks/private/use-client-query.js.map +1 -1
- package/hooks/private/use-grouped-messages.d.ts +27 -2
- package/hooks/private/use-grouped-messages.d.ts.map +1 -1
- package/hooks/private/use-grouped-messages.js +154 -106
- package/hooks/private/use-grouped-messages.js.map +1 -1
- package/hooks/private/use-rest-client.js +2 -1
- package/hooks/private/use-rest-client.js.map +1 -1
- package/hooks/use-conversation-auto-seen.d.ts.map +1 -1
- package/hooks/use-conversation-auto-seen.js +9 -3
- package/hooks/use-conversation-auto-seen.js.map +1 -1
- package/hooks/use-conversation-page.d.ts.map +1 -1
- package/hooks/use-conversation-page.js +13 -3
- package/hooks/use-conversation-page.js.map +1 -1
- package/hooks/use-new-message-sound.d.ts.map +1 -1
- package/hooks/use-new-message-sound.js +2 -2
- package/hooks/use-new-message-sound.js.map +1 -1
- package/hooks/use-typing-sound.d.ts.map +1 -1
- package/hooks/use-typing-sound.js +2 -2
- package/hooks/use-typing-sound.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +3 -3
- package/package.json +6 -12
- package/packages/tiny-markdown/src/context/index.d.ts +1 -0
- package/packages/tiny-markdown/src/context/tiny-markdown-context.d.ts +3 -0
- package/packages/tiny-markdown/src/hooks/index.d.ts +4 -0
- package/packages/tiny-markdown/src/hooks/use-caret-position.d.ts +1 -0
- package/packages/tiny-markdown/src/hooks/use-tiny-markdown.d.ts +1 -0
- package/packages/tiny-markdown/src/hooks/use-tiny-mention.d.ts +1 -0
- package/packages/tiny-markdown/src/hooks/use-tiny-shortcuts.d.ts +1 -0
- package/packages/tiny-markdown/src/index.d.ts +4 -0
- package/packages/tiny-markdown/src/types.d.ts +75 -0
- package/packages/tiny-markdown/src/types.d.ts.map +1 -0
- package/packages/tiny-markdown/src/utils/index.d.ts +3 -0
- package/packages/tiny-markdown/src/utils/markdown-parser.d.ts +1 -0
- package/packages/tiny-markdown/src/utils/mention-parser.d.ts +1 -0
- package/packages/tiny-markdown/src/utils/merge-refs.d.ts +1 -0
- package/packages/types/src/api/conversation.d.ts +300 -0
- package/packages/types/src/api/conversation.d.ts.map +1 -1
- package/packages/types/src/api/timeline-item.d.ts +225 -0
- package/packages/types/src/api/timeline-item.d.ts.map +1 -1
- package/packages/types/src/realtime-events.d.ts +228 -3
- package/packages/types/src/realtime-events.d.ts.map +1 -1
- package/packages/types/src/schemas.d.ts +75 -0
- package/packages/types/src/schemas.d.ts.map +1 -1
- package/primitives/avatar/image.d.ts +1 -1
- package/primitives/command-block-utils.d.ts +26 -0
- package/primitives/command-block-utils.d.ts.map +1 -0
- package/primitives/command-block-utils.js +310 -0
- package/primitives/command-block-utils.js.map +1 -0
- package/primitives/index.d.ts +7 -3
- package/primitives/index.js +11 -2
- package/primitives/index.parts.d.ts +6 -2
- package/primitives/index.parts.js +5 -1
- package/primitives/timeline-code-block.d.ts +32 -0
- package/primitives/timeline-code-block.d.ts.map +1 -0
- package/primitives/timeline-code-block.js +66 -0
- package/primitives/timeline-code-block.js.map +1 -0
- package/primitives/timeline-command-block.d.ts +29 -0
- package/primitives/timeline-command-block.d.ts.map +1 -0
- package/primitives/timeline-command-block.js +97 -0
- package/primitives/timeline-command-block.js.map +1 -0
- package/primitives/timeline-item-group.d.ts.map +1 -1
- package/primitives/timeline-item-group.js +5 -15
- package/primitives/timeline-item-group.js.map +1 -1
- package/primitives/timeline-item.d.ts +21 -1
- package/primitives/timeline-item.d.ts.map +1 -1
- package/primitives/timeline-item.js +148 -83
- package/primitives/timeline-item.js.map +1 -1
- package/primitives/timeline-message-layout.d.ts +9 -0
- package/primitives/timeline-message-layout.d.ts.map +1 -0
- package/primitives/timeline-message-layout.js +20 -0
- package/primitives/timeline-message-layout.js.map +1 -0
- package/provider.d.ts.map +1 -1
- package/provider.js +1 -7
- package/provider.js.map +1 -1
- package/realtime/event-filter.js +4 -3
- package/realtime/event-filter.js.map +1 -1
- package/realtime/provider.d.ts +0 -1
- package/realtime/provider.d.ts.map +1 -1
- package/realtime/provider.js +29 -34
- package/realtime/provider.js.map +1 -1
- package/sounds/sound-data.d.ts +6 -0
- package/sounds/sound-data.d.ts.map +1 -0
- package/sounds/sound-data.js +7 -0
- package/sounds/sound-data.js.map +1 -0
- package/styles.css +2 -0
- package/support/components/avatar.js +3 -3
- package/support/components/avatar.js.map +1 -1
- package/support/components/button.d.ts +2 -2
- package/support/components/button.d.ts.map +1 -1
- package/support/components/button.js +1 -0
- package/support/components/button.js.map +1 -1
- package/support/components/conversation-event.d.ts +3 -0
- package/support/components/conversation-event.d.ts.map +1 -1
- package/support/components/conversation-event.js +47 -16
- package/support/components/conversation-event.js.map +1 -1
- package/support/components/conversation-timeline.d.ts.map +1 -1
- package/support/components/conversation-timeline.js +12 -0
- package/support/components/conversation-timeline.js.map +1 -1
- package/support/components/index.d.ts +2 -1
- package/support/components/index.js +2 -1
- package/support/components/timeline-activity-group.d.ts +25 -0
- package/support/components/timeline-activity-group.d.ts.map +1 -0
- package/support/components/timeline-activity-group.js +104 -0
- package/support/components/timeline-activity-group.js.map +1 -0
- package/support/components/timeline-code-block.d.ts +14 -0
- package/support/components/timeline-code-block.d.ts.map +1 -0
- package/support/components/timeline-code-block.js +44 -0
- package/support/components/timeline-code-block.js.map +1 -0
- package/support/components/timeline-command-block.d.ts +12 -0
- package/support/components/timeline-command-block.d.ts.map +1 -0
- package/support/components/timeline-command-block.js +42 -0
- package/support/components/timeline-command-block.js.map +1 -0
- package/support/components/timeline-message-item.d.ts +2 -1
- package/support/components/timeline-message-item.d.ts.map +1 -1
- package/support/components/timeline-message-item.js +23 -3
- package/support/components/timeline-message-item.js.map +1 -1
- package/support/pages/home.js +1 -1
- package/support/pages/home.js.map +1 -1
- package/support/store/support-store.d.ts.map +1 -1
- package/support/store/support-store.js +4 -4
- package/support/store/support-store.js.map +1 -1
- package/support/{support-DmViRaga.css → support-Dc5L__HC.css} +15 -15
- package/support/{support-DmViRaga.css.map → support-Dc5L__HC.css.map} +1 -1
- package/{tailwind.css → support/support.css} +14 -14
- package/support-config.d.ts +31 -4
- package/support-config.d.ts.map +1 -1
- package/support-config.js +52 -4
- package/support-config.js.map +1 -1
- package/support.css +1 -2
- package/utils/metadata-hash.d.ts +1 -1
- package/utils/metadata-hash.js +9 -4
- package/utils/metadata-hash.js.map +1 -1
- package/utils/timeline-item-sender.d.ts +17 -0
- package/utils/timeline-item-sender.d.ts.map +1 -0
- package/utils/timeline-item-sender.js +43 -0
- package/utils/timeline-item-sender.js.map +1 -0
- package/utils/use-render-element.d.ts.map +1 -1
package/realtime/provider.js
CHANGED
|
@@ -135,7 +135,8 @@ function isHeartbeatTimedOut(lastHeartbeat, timeoutMs) {
|
|
|
135
135
|
function resolvePublicKey(explicit) {
|
|
136
136
|
const trimmed = explicit?.trim();
|
|
137
137
|
if (trimmed) return trimmed;
|
|
138
|
-
const
|
|
138
|
+
const processEnv = typeof process !== "undefined" ? process.env : void 0;
|
|
139
|
+
const normalized = (processEnv?.NEXT_PUBLIC_COSSISTANT_API_KEY || processEnv?.COSSISTANT_API_KEY || null)?.trim();
|
|
139
140
|
return normalized && normalized.length > 0 ? normalized : null;
|
|
140
141
|
}
|
|
141
142
|
function normalizeAuth(auth) {
|
|
@@ -163,6 +164,16 @@ function normalizeAuth(auth) {
|
|
|
163
164
|
publicKey: null
|
|
164
165
|
};
|
|
165
166
|
}
|
|
167
|
+
function toRealtimeAuthIdentity(auth) {
|
|
168
|
+
return {
|
|
169
|
+
visitorId: auth?.visitorId ?? null,
|
|
170
|
+
websiteId: auth?.websiteId ?? null,
|
|
171
|
+
userId: auth?.userId ?? null
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function hasRealtimeAuthIdentityChanged(previous, next) {
|
|
175
|
+
return previous.visitorId !== next.visitorId || previous.websiteId !== next.websiteId || previous.userId !== next.userId;
|
|
176
|
+
}
|
|
166
177
|
function buildSocketUrl(baseUrl, auth) {
|
|
167
178
|
if (!auth) return null;
|
|
168
179
|
try {
|
|
@@ -183,14 +194,19 @@ function buildSocketUrl(baseUrl, auth) {
|
|
|
183
194
|
}
|
|
184
195
|
/**
|
|
185
196
|
* Internal component that handles the WebSocket connection.
|
|
186
|
-
* Only rendered in the browser to avoid SSR issues with react-use-websocket.
|
|
187
197
|
*/
|
|
188
198
|
function RealtimeProviderInternal({ children, wsUrl = DEFAULT_WS_URL, auth, autoConnect, onConnect, onDisconnect, onError }) {
|
|
189
199
|
const normalizedAuth = normalizeAuth(auth);
|
|
200
|
+
const authIdentity = useMemo(() => toRealtimeAuthIdentity(normalizedAuth), [
|
|
201
|
+
normalizedAuth?.visitorId,
|
|
202
|
+
normalizedAuth?.websiteId,
|
|
203
|
+
normalizedAuth?.userId
|
|
204
|
+
]);
|
|
190
205
|
const socketUrl = buildSocketUrl(wsUrl, normalizedAuth);
|
|
191
206
|
const eventHandlersRef = useRef(/* @__PURE__ */ new Set());
|
|
192
207
|
const lastHeartbeatRef = useRef(0);
|
|
193
208
|
const hasOpenedRef = useRef(false);
|
|
209
|
+
const previousAuthIdentityRef = useRef(authIdentity);
|
|
194
210
|
const previousUrlRef = useRef(null);
|
|
195
211
|
const [connectionError, setConnectionError] = useState(null);
|
|
196
212
|
const [lastEvent, setLastEvent] = useState(null);
|
|
@@ -199,6 +215,17 @@ function RealtimeProviderInternal({ children, wsUrl = DEFAULT_WS_URL, auth, auto
|
|
|
199
215
|
const heartbeatTimeoutMs = DEFAULT_HEARTBEAT_TIMEOUT_MS;
|
|
200
216
|
const canConnect = Boolean(autoConnect && socketUrl);
|
|
201
217
|
const connectionUrl = canConnect ? socketUrl : null;
|
|
218
|
+
useEffect(() => {
|
|
219
|
+
const previous = previousAuthIdentityRef.current;
|
|
220
|
+
if (hasRealtimeAuthIdentityChanged(previous, authIdentity)) {
|
|
221
|
+
hasOpenedRef.current = false;
|
|
222
|
+
lastHeartbeatRef.current = 0;
|
|
223
|
+
setConnectionId(null);
|
|
224
|
+
setLastEvent(null);
|
|
225
|
+
setConnectionError(null);
|
|
226
|
+
}
|
|
227
|
+
previousAuthIdentityRef.current = authIdentity;
|
|
228
|
+
}, [authIdentity]);
|
|
202
229
|
useEffect(() => {
|
|
203
230
|
if (connectionUrl !== previousUrlRef.current) {
|
|
204
231
|
previousUrlRef.current = connectionUrl;
|
|
@@ -363,40 +390,8 @@ function RealtimeProviderInternal({ children, wsUrl = DEFAULT_WS_URL, auth, auto
|
|
|
363
390
|
}
|
|
364
391
|
/**
|
|
365
392
|
* Provides websocket connectivity and heartbeating logic for realtime events.
|
|
366
|
-
* Handles SSR by only initializing the WebSocket connection in the browser.
|
|
367
393
|
*/
|
|
368
394
|
function RealtimeProvider({ children, wsUrl = DEFAULT_WS_URL, auth, autoConnect = true, onConnect, onDisconnect, onError }) {
|
|
369
|
-
const [isBrowser, setIsBrowser] = useState(false);
|
|
370
|
-
useEffect(() => {
|
|
371
|
-
setIsBrowser(true);
|
|
372
|
-
}, []);
|
|
373
|
-
const normalizedAuth = normalizeAuth(auth);
|
|
374
|
-
const defaultValue = useMemo(() => ({
|
|
375
|
-
isConnected: false,
|
|
376
|
-
isConnecting: false,
|
|
377
|
-
error: null,
|
|
378
|
-
send: () => {
|
|
379
|
-
throw new Error("Realtime connection is not available during SSR");
|
|
380
|
-
},
|
|
381
|
-
sendRaw: () => {
|
|
382
|
-
throw new Error("Realtime connection is not available during SSR");
|
|
383
|
-
},
|
|
384
|
-
subscribe: () => () => {},
|
|
385
|
-
lastEvent: null,
|
|
386
|
-
connectionId: null,
|
|
387
|
-
reconnect: () => {},
|
|
388
|
-
visitorId: normalizedAuth?.visitorId ?? null,
|
|
389
|
-
websiteId: normalizedAuth?.websiteId ?? null,
|
|
390
|
-
userId: normalizedAuth?.userId ?? null
|
|
391
|
-
}), [
|
|
392
|
-
normalizedAuth?.visitorId,
|
|
393
|
-
normalizedAuth?.websiteId,
|
|
394
|
-
normalizedAuth?.userId
|
|
395
|
-
]);
|
|
396
|
-
if (!isBrowser) return /* @__PURE__ */ jsx(RealtimeContext.Provider, {
|
|
397
|
-
value: defaultValue,
|
|
398
|
-
children
|
|
399
|
-
});
|
|
400
395
|
return /* @__PURE__ */ jsx(RealtimeProviderInternal, {
|
|
401
396
|
auth,
|
|
402
397
|
autoConnect,
|
package/realtime/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","names":["payload: unknown"],"sources":["../../src/realtime/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n\ttype AnyRealtimeEvent,\n\tisValidEventType,\n\ttype RealtimeEvent,\n\tvalidateRealtimeEvent,\n} from \"@cossistant/types/realtime-events\";\nimport type React from \"react\";\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport useWebSocket, { ReadyState } from \"react-use-websocket\";\n\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;\nconst DEFAULT_HEARTBEAT_TIMEOUT_MS = 45_000;\n\ntype SubscribeHandler = (event: AnyRealtimeEvent) => void;\n\ntype MessageDecodeResult =\n\t| {\n\t\t\ttype: \"raw-text\";\n\t\t\tdata: string;\n\t }\n\t| {\n\t\t\ttype: \"unsupported\";\n\t };\n\ntype ParsedMessage =\n\t| {\n\t\t\ttype: \"pong\";\n\t }\n\t| {\n\t\t\ttype: \"connection-established\";\n\t\t\tconnectionId: string | null;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\tmessage: string;\n\t }\n\t| {\n\t\t\ttype: \"event\";\n\t\t\tevent: AnyRealtimeEvent;\n\t }\n\t| {\n\t\t\ttype: \"invalid\";\n\t };\n\ntype VisitorAuthConfig = {\n\tkind: \"visitor\";\n\tvisitorId: string | null;\n\twebsiteId?: string | null;\n\tpublicKey?: string | null;\n};\n\ntype SessionAuthConfig = {\n\tkind: \"session\";\n\tsessionToken: string | null;\n\twebsiteId?: string | null;\n\tuserId?: string | null;\n};\n\ntype RealtimeAuthConfig = VisitorAuthConfig | SessionAuthConfig;\n\ntype ResolvedAuthConfig = {\n\ttype: \"visitor\" | \"session\";\n\tvisitorId: string | null;\n\twebsiteId: string | null;\n\tuserId: string | null;\n\tsessionToken: string | null;\n\tpublicKey: string | null;\n};\n\ntype RealtimeProviderProps = {\n\tchildren: React.ReactNode;\n\twsUrl?: string;\n\tauth: RealtimeAuthConfig | null;\n\tautoConnect?: boolean;\n\tonConnect?: () => void;\n\tonDisconnect?: () => void;\n\tonError?: (error: Error) => void;\n};\n\ntype RealtimeConnectionState = {\n\tisConnected: boolean;\n\tisConnecting: boolean;\n\terror: Error | null;\n\tsend: (event: AnyRealtimeEvent) => void;\n\tsendRaw: (data: string) => void;\n\tsubscribe: (handler: SubscribeHandler) => () => void;\n\tlastEvent: AnyRealtimeEvent | null;\n\tconnectionId: string | null;\n\treconnect: () => void;\n};\n\ntype RealtimeContextValue = RealtimeConnectionState & {\n\tvisitorId: string | null;\n\twebsiteId: string | null;\n\tuserId: string | null;\n};\n\nconst DEFAULT_WS_URL = \"wss://api.cossistant.com/ws\";\n\nconst RealtimeContext = createContext<RealtimeContextValue | null>(null);\n\n/**\n * Decodes WebSocket message data into a string.\n * Handles string, ArrayBuffer, and ArrayBufferView formats.\n */\nfunction decodeMessageData(data: unknown): MessageDecodeResult {\n\tif (typeof data === \"string\") {\n\t\treturn { type: \"raw-text\", data };\n\t}\n\n\tif (data instanceof ArrayBuffer) {\n\t\ttry {\n\t\t\treturn { type: \"raw-text\", data: new TextDecoder().decode(data) };\n\t\t} catch {\n\t\t\treturn { type: \"unsupported\" };\n\t\t}\n\t}\n\n\tif (ArrayBuffer.isView(data)) {\n\t\ttry {\n\t\t\treturn { type: \"raw-text\", data: new TextDecoder().decode(data.buffer) };\n\t\t} catch {\n\t\t\treturn { type: \"unsupported\" };\n\t\t}\n\t}\n\n\treturn { type: \"unsupported\" };\n}\n\n/**\n * Safely parses JSON string, returning null if invalid.\n */\nfunction parseJson(raw: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Extracts a string field from an unknown object, with optional validation.\n */\nfunction extractStringField(\n\tobj: unknown,\n\tfield: string,\n\trequired = false\n): string | null {\n\tif (!obj || typeof obj !== \"object\" || !(field in obj)) {\n\t\treturn required ? null : null;\n\t}\n\tconst value = (obj as Record<string, unknown>)[field];\n\tif (typeof value === \"string\" && value.length > 0) {\n\t\treturn value;\n\t}\n\treturn required ? null : null;\n}\n\n/**\n * Parses a WebSocket message and determines its type and content.\n */\nfunction parseWebSocketMessage(rawText: string): ParsedMessage {\n\t// Handle pong heartbeat\n\tif (rawText === \"pong\") {\n\t\treturn { type: \"pong\" };\n\t}\n\n\t// Try to parse as JSON\n\tconst parsed = parseJson(rawText);\n\tif (!parsed || typeof parsed !== \"object\") {\n\t\treturn { type: \"invalid\" };\n\t}\n\n\tconst messageType = extractStringField(parsed, \"type\");\n\n\t// Handle CONNECTION_ESTABLISHED\n\tif (messageType === \"CONNECTION_ESTABLISHED\") {\n\t\tconst payload = (parsed as { payload?: unknown }).payload;\n\t\tconst connectionId = extractStringField(payload, \"connectionId\");\n\t\treturn { type: \"connection-established\", connectionId };\n\t}\n\n\t// Handle error messages\n\tif (\"error\" in parsed && \"message\" in parsed) {\n\t\tconst message =\n\t\t\textractStringField(parsed, \"message\") || \"Realtime connection error\";\n\t\treturn { type: \"error\", message };\n\t}\n\n\t// Handle realtime events\n\tif (messageType && isValidEventType(messageType)) {\n\t\ttry {\n\t\t\tconst event = constructRealtimeEvent(parsed);\n\t\t\tif (!event) {\n\t\t\t\treturn { type: \"invalid\" };\n\t\t\t}\n\t\t\treturn { type: \"event\", event };\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Realtime] Failed to construct event\", error);\n\t\t\treturn { type: \"invalid\" };\n\t\t}\n\t}\n\n\treturn { type: \"invalid\" };\n}\n\n/**\n * Constructs a RealtimeEvent from parsed JSON data.\n * Returns null if required fields are missing or validation fails.\n */\nfunction constructRealtimeEvent(parsed: unknown): AnyRealtimeEvent | null {\n\tif (!parsed || typeof parsed !== \"object\" || !(\"type\" in parsed)) {\n\t\treturn null;\n\t}\n\n\tconst type = (parsed as { type: unknown }).type;\n\tif (!isValidEventType(type)) {\n\t\treturn null;\n\t}\n\n\tconst eventType = type;\n\n\t// Extract payload directly\n\tconst payloadSource = (parsed as { payload?: unknown }).payload;\n\n\tlet payload: unknown;\n\ttry {\n\t\tpayload = validateRealtimeEvent(eventType, payloadSource);\n\t} catch (error) {\n\t\tconsole.error(\"[Realtime] Received invalid event payload\", error);\n\t\treturn null;\n\t}\n\n\tconst organizationId = extractStringField(\n\t\tpayloadSource,\n\t\t\"organizationId\",\n\t\ttrue\n\t);\n\tconst websiteId = extractStringField(payloadSource, \"websiteId\", true);\n\n\tif (!organizationId) {\n\t\tconsole.error(\"[Realtime] Received event without organizationId\", parsed);\n\t\treturn null;\n\t}\n\n\tif (!websiteId) {\n\t\tconsole.error(\"[Realtime] Received event without websiteId\", parsed);\n\t\treturn null;\n\t}\n\n\tconst visitorId = extractStringField(parsed, \"visitorId\");\n\n\treturn {\n\t\ttype: eventType,\n\t\tpayload,\n\t\torganizationId,\n\t\twebsiteId,\n\t\tvisitorId,\n\t} as AnyRealtimeEvent;\n}\n\n/**\n * Checks if heartbeat has timed out.\n * Only call this function in browser context (inside effects or event handlers).\n */\nfunction isHeartbeatTimedOut(\n\tlastHeartbeat: number,\n\ttimeoutMs: number\n): boolean {\n\tif (typeof window === \"undefined\") {\n\t\treturn false;\n\t}\n\tconst elapsed = Date.now() - lastHeartbeat;\n\treturn elapsed > timeoutMs;\n}\n\nfunction resolvePublicKey(explicit?: string | null): string | null {\n\tconst trimmed = explicit?.trim();\n\tif (trimmed) {\n\t\treturn trimmed;\n\t}\n\n\t// Next.js: NEXT_PUBLIC_COSSISTANT_API_KEY\n\t// React/other: COSSISTANT_API_KEY\n\tconst fromEnv =\n\t\tprocess.env.NEXT_PUBLIC_COSSISTANT_API_KEY ||\n\t\tprocess.env.COSSISTANT_API_KEY ||\n\t\tnull;\n\n\tconst normalized = fromEnv?.trim();\n\treturn normalized && normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeAuth(\n\tauth: RealtimeAuthConfig | null\n): ResolvedAuthConfig | null {\n\tif (!auth) {\n\t\treturn null;\n\t}\n\n\tif (auth.kind === \"visitor\") {\n\t\tconst visitorId = auth.visitorId?.trim() || null;\n\n\t\tif (!visitorId) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"visitor\",\n\t\t\tvisitorId,\n\t\t\twebsiteId: auth.websiteId?.trim() || null,\n\t\t\tuserId: null,\n\t\t\tsessionToken: null,\n\t\t\tpublicKey: resolvePublicKey(auth.publicKey ?? null),\n\t\t} satisfies ResolvedAuthConfig;\n\t}\n\n\tconst sessionToken = auth.sessionToken?.trim() || null;\n\n\tif (!sessionToken) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\ttype: \"session\",\n\t\tvisitorId: null,\n\t\twebsiteId: auth.websiteId?.trim() || null,\n\t\tuserId: auth.userId?.trim() || null,\n\t\tsessionToken,\n\t\tpublicKey: null,\n\t} satisfies ResolvedAuthConfig;\n}\n\nfunction buildSocketUrl(\n\tbaseUrl: string,\n\tauth: ResolvedAuthConfig | null\n): string | null {\n\tif (!auth) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst url = new URL(baseUrl);\n\n\t\tif (auth.type === \"visitor\") {\n\t\t\turl.searchParams.set(\"visitorId\", auth.visitorId ?? \"\");\n\t\t\tconst publicKey = auth.publicKey;\n\t\t\tif (publicKey) {\n\t\t\t\turl.searchParams.set(\"publicKey\", publicKey);\n\t\t\t}\n\t\t} else {\n\t\t\turl.searchParams.set(\"sessionToken\", auth.sessionToken ?? \"\");\n\t\t\tif (auth.websiteId) {\n\t\t\t\turl.searchParams.set(\"websiteId\", auth.websiteId);\n\t\t\t}\n\t\t}\n\n\t\treturn url.toString();\n\t} catch (error) {\n\t\tconsole.error(\"[Realtime] Failed to build WebSocket URL\", error);\n\t\treturn null;\n\t}\n}\n\n/**\n * Internal component that handles the WebSocket connection.\n * Only rendered in the browser to avoid SSR issues with react-use-websocket.\n */\nfunction RealtimeProviderInternal({\n\tchildren,\n\twsUrl = DEFAULT_WS_URL,\n\tauth,\n\tautoConnect,\n\tonConnect,\n\tonDisconnect,\n\tonError,\n}: RealtimeProviderProps): React.ReactElement {\n\tconst normalizedAuth = normalizeAuth(auth);\n\n\tconst socketUrl = buildSocketUrl(wsUrl, normalizedAuth);\n\tconst eventHandlersRef = useRef<Set<SubscribeHandler>>(new Set());\n\tconst lastHeartbeatRef = useRef<number>(0);\n\tconst hasOpenedRef = useRef(false);\n\tconst previousUrlRef = useRef<string | null>(null);\n\tconst [connectionError, setConnectionError] = useState<Error | null>(null);\n\tconst [lastEvent, setLastEvent] = useState<AnyRealtimeEvent | null>(null);\n\tconst [connectionId, setConnectionId] = useState<string | null>(null);\n\n\tconst heartbeatIntervalMs = DEFAULT_HEARTBEAT_INTERVAL_MS;\n\tconst heartbeatTimeoutMs = DEFAULT_HEARTBEAT_TIMEOUT_MS;\n\n\tconst canConnect = Boolean(autoConnect && socketUrl);\n\tconst connectionUrl = canConnect ? socketUrl : null;\n\n\t// Track URL changes to detect when connection is being replaced\n\tuseEffect(() => {\n\t\tif (connectionUrl !== previousUrlRef.current) {\n\t\t\tpreviousUrlRef.current = connectionUrl;\n\t\t\t// Reset hasOpenedRef when URL changes so we know a new connection is starting\n\t\t\thasOpenedRef.current = false;\n\t\t}\n\t}, [connectionUrl]);\n\n\tconst {\n\t\tsendMessage,\n\t\tsendJsonMessage,\n\t\tlastMessage,\n\t\treadyState,\n\t\tgetWebSocket,\n\t} = useWebSocket(\n\t\tconnectionUrl,\n\t\t{\n\t\t\tshouldReconnect: (closeEvent) => {\n\t\t\t\tif (!canConnect) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (closeEvent.code === 1008 || closeEvent.code === 1011) {\n\t\t\t\t\tconst err = new Error(\n\t\t\t\t\t\tcloseEvent.reason ||\n\t\t\t\t\t\t\t\"Realtime connection closed by server. Please check your credentials.\"\n\t\t\t\t\t);\n\t\t\t\t\tsetConnectionError(err);\n\t\t\t\t\tonError?.(err);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\treconnectAttempts: autoConnect ? undefined : 0,\n\t\t\treconnectInterval: (attempt) => {\n\t\t\t\tconst base = 500 * 2 ** attempt;\n\t\t\t\treturn Math.min(base, 30_000);\n\t\t\t},\n\t\t\tretryOnError: false,\n\t\t\tonOpen: () => {\n\t\t\t\thasOpenedRef.current = true;\n\t\t\t\tsetConnectionError(null);\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tonConnect?.();\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\tsetConnectionId(null);\n\t\t\t\tonDisconnect?.();\n\t\t\t},\n\t\t\tonError: (event) => {\n\t\t\t\tif (!canConnect) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst socketLike = event.target;\n\t\t\t\tconst currentSocket = getWebSocket();\n\t\t\t\tconst isBrowserSocket =\n\t\t\t\t\ttypeof WebSocket !== \"undefined\" && socketLike instanceof WebSocket;\n\t\t\t\tconst socketState = isBrowserSocket ? socketLike.readyState : undefined;\n\n\t\t\t\t// Only suppress errors for THIS provider's socket, not other nested providers\n\t\t\t\t// Check if the errored socket belongs to this provider instance\n\t\t\t\tconst isThisProvidersSocket = currentSocket === socketLike;\n\n\t\t\t\t// Suppress errors if:\n\t\t\t\t// 1. This socket was replaced (URL changed while connecting) - only for this provider\n\t\t\t\t// 2. Connection URL is null (component unmounting or disabled)\n\t\t\t\t// 3. Socket is in CLOSING/CLOSED state and hasn't opened (cleanup/unmount) - only for this provider\n\t\t\t\tif (\n\t\t\t\t\t(!isThisProvidersSocket && currentSocket) ||\n\t\t\t\t\t!connectionUrl ||\n\t\t\t\t\t(isThisProvidersSocket &&\n\t\t\t\t\t\t!hasOpenedRef.current &&\n\t\t\t\t\t\t(socketState === WebSocket.CLOSING ||\n\t\t\t\t\t\t\tsocketState === WebSocket.CLOSED))\n\t\t\t\t) {\n\t\t\t\t\t// Suppress these expected errors during connection replacement or cleanup\n\t\t\t\t\t// But only if it's THIS provider's socket being replaced\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// For errors that occur during CONNECTING state, check if URL changed\n\t\t\t\t// Only suppress if it's this provider's socket\n\t\t\t\tif (\n\t\t\t\t\tisThisProvidersSocket &&\n\t\t\t\t\t!hasOpenedRef.current &&\n\t\t\t\t\tsocketState === WebSocket.CONNECTING &&\n\t\t\t\t\tconnectionUrl !== previousUrlRef.current\n\t\t\t\t) {\n\t\t\t\t\t// URL changed while connecting, suppress error\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst err = new Error(`WebSocket error: ${event.type}`);\n\t\t\t\tsetConnectionError(err);\n\t\t\t\tonError?.(err);\n\t\t\t},\n\t\t},\n\t\tcanConnect\n\t);\n\n\tuseEffect(() => {\n\t\tif (!lastMessage) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Decode message data from various formats\n\t\tconst decoded = decodeMessageData(lastMessage.data);\n\t\tif (decoded.type === \"unsupported\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse the message and determine its type\n\t\tconst message = parseWebSocketMessage(decoded.data);\n\n\t\t// Handle different message types\n\t\tswitch (message.type) {\n\t\t\tcase \"pong\":\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tbreak;\n\n\t\t\tcase \"connection-established\":\n\t\t\t\tsetConnectionId(message.connectionId);\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tbreak;\n\n\t\t\tcase \"error\": {\n\t\t\t\tconst err = new Error(message.message);\n\t\t\t\tsetConnectionError(err);\n\t\t\t\tonError?.(err);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"event\":\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tsetLastEvent(message.event);\n\t\t\t\tfor (const handler of eventHandlersRef.current) {\n\t\t\t\t\tPromise.resolve(handler(message.event)).catch((error) => {\n\t\t\t\t\t\tconst err =\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t: new Error(`Subscriber threw an exception: ${String(error)}`);\n\t\t\t\t\t\tonError?.(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Silently ignore invalid or unknown messages\n\t\t\t\tbreak;\n\t\t}\n\t}, [lastMessage, onError]);\n\n\tuseEffect(() => {\n\t\tif (!canConnect) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst interval = window.setInterval(() => {\n\t\t\tif (readyState !== ReadyState.OPEN) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if heartbeat has timed out (skip if connection hasn't opened yet)\n\t\t\tif (\n\t\t\t\tlastHeartbeatRef.current !== 0 &&\n\t\t\t\tisHeartbeatTimedOut(lastHeartbeatRef.current, heartbeatTimeoutMs)\n\t\t\t) {\n\t\t\t\tconst socket = getWebSocket();\n\t\t\t\tsocket?.close(4000, \"Heartbeat timeout\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Send ping to keep connection alive\n\t\t\ttry {\n\t\t\t\tsendMessage(\"ping\");\n\t\t\t} catch {\n\t\t\t\t// Ignore send failures; reconnect logic will handle it\n\t\t\t}\n\t\t}, heartbeatIntervalMs);\n\n\t\treturn () => {\n\t\t\twindow.clearInterval(interval);\n\t\t};\n\t}, [\n\t\tcanConnect,\n\t\theartbeatIntervalMs,\n\t\theartbeatTimeoutMs,\n\t\treadyState,\n\t\tsendMessage,\n\t\tgetWebSocket,\n\t]);\n\n\tconst send = useCallback(\n\t\t(event: AnyRealtimeEvent) => {\n\t\t\tif (!connectionUrl) {\n\t\t\t\tthrow new Error(\"Realtime connection is disabled\");\n\t\t\t}\n\n\t\t\tif (readyState !== ReadyState.OPEN) {\n\t\t\t\tthrow new Error(\"Realtime connection is not established\");\n\t\t\t}\n\n\t\t\tsendJsonMessage(event);\n\t\t},\n\t\t[connectionUrl, readyState, sendJsonMessage]\n\t);\n\n\tconst sendRaw = useCallback(\n\t\t(data: string) => {\n\t\t\tif (!connectionUrl) {\n\t\t\t\tthrow new Error(\"Realtime connection is disabled\");\n\t\t\t}\n\n\t\t\tif (readyState !== ReadyState.OPEN) {\n\t\t\t\tthrow new Error(\"Realtime connection is not established\");\n\t\t\t}\n\n\t\t\tsendMessage(data);\n\t\t},\n\t\t[connectionUrl, readyState, sendMessage]\n\t);\n\n\tconst subscribe = useCallback((handler: SubscribeHandler) => {\n\t\teventHandlersRef.current.add(handler);\n\t\treturn () => {\n\t\t\teventHandlersRef.current.delete(handler);\n\t\t};\n\t}, []);\n\n\tconst reconnect = useCallback(() => {\n\t\tconst socket = getWebSocket();\n\t\tsocket?.close();\n\t}, [getWebSocket]);\n\n\tconst connection = useMemo<RealtimeConnectionState>(\n\t\t() => ({\n\t\t\tisConnected: readyState === ReadyState.OPEN,\n\t\t\tisConnecting: readyState === ReadyState.CONNECTING,\n\t\t\terror: connectionError,\n\t\t\tsend,\n\t\t\tsendRaw,\n\t\t\tsubscribe,\n\t\t\tlastEvent,\n\t\t\tconnectionId,\n\t\t\treconnect,\n\t\t}),\n\t\t[\n\t\t\treadyState,\n\t\t\tconnectionError,\n\t\t\tsend,\n\t\t\tsendRaw,\n\t\t\tsubscribe,\n\t\t\tlastEvent,\n\t\t\tconnectionId,\n\t\t\treconnect,\n\t\t]\n\t);\n\n\tconst value = useMemo<RealtimeContextValue>(\n\t\t() => ({\n\t\t\t...connection,\n\t\t\tvisitorId: normalizedAuth?.visitorId ?? null,\n\t\t\twebsiteId: normalizedAuth?.websiteId ?? null,\n\t\t\tuserId: normalizedAuth?.userId ?? null,\n\t\t}),\n\t\t[\n\t\t\tconnection,\n\t\t\tnormalizedAuth?.visitorId,\n\t\t\tnormalizedAuth?.websiteId,\n\t\t\tnormalizedAuth?.userId,\n\t\t]\n\t);\n\n\treturn (\n\t\t<RealtimeContext.Provider value={value}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t);\n}\n\n/**\n * Provides websocket connectivity and heartbeating logic for realtime events.\n * Handles SSR by only initializing the WebSocket connection in the browser.\n */\nexport function RealtimeProvider({\n\tchildren,\n\twsUrl = DEFAULT_WS_URL,\n\tauth,\n\tautoConnect = true,\n\tonConnect,\n\tonDisconnect,\n\tonError,\n}: RealtimeProviderProps): React.ReactElement {\n\tconst [isBrowser, setIsBrowser] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIsBrowser(true);\n\t}, []);\n\n\tconst normalizedAuth = normalizeAuth(auth);\n\n\t// Create a default context value for SSR\n\tconst defaultValue = useMemo<RealtimeContextValue>(\n\t\t() => ({\n\t\t\tisConnected: false,\n\t\t\tisConnecting: false,\n\t\t\terror: null,\n\t\t\tsend: () => {\n\t\t\t\tthrow new Error(\"Realtime connection is not available during SSR\");\n\t\t\t},\n\t\t\tsendRaw: () => {\n\t\t\t\tthrow new Error(\"Realtime connection is not available during SSR\");\n\t\t\t},\n\t\t\tsubscribe: () => () => {},\n\t\t\tlastEvent: null,\n\t\t\tconnectionId: null,\n\t\t\treconnect: () => {},\n\t\t\tvisitorId: normalizedAuth?.visitorId ?? null,\n\t\t\twebsiteId: normalizedAuth?.websiteId ?? null,\n\t\t\tuserId: normalizedAuth?.userId ?? null,\n\t\t}),\n\t\t[\n\t\t\tnormalizedAuth?.visitorId,\n\t\t\tnormalizedAuth?.websiteId,\n\t\t\tnormalizedAuth?.userId,\n\t\t]\n\t);\n\n\t// During SSR or before hydration, provide a default context\n\tif (!isBrowser) {\n\t\treturn (\n\t\t\t<RealtimeContext.Provider value={defaultValue}>\n\t\t\t\t{children}\n\t\t\t</RealtimeContext.Provider>\n\t\t);\n\t}\n\n\t// In the browser, use the full implementation\n\treturn (\n\t\t<RealtimeProviderInternal\n\t\t\tauth={auth}\n\t\t\tautoConnect={autoConnect}\n\t\t\tonConnect={onConnect}\n\t\t\tonDisconnect={onDisconnect}\n\t\t\tonError={onError}\n\t\t\twsUrl={wsUrl}\n\t\t>\n\t\t\t{children}\n\t\t</RealtimeProviderInternal>\n\t);\n}\n\n/**\n * Returns the realtime connection context.\n */\nexport function useRealtimeConnection(): RealtimeContextValue {\n\tconst context = useContext(RealtimeContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useRealtimeConnection must be used within RealtimeProvider\"\n\t\t);\n\t}\n\n\treturn context;\n}\n\nexport type { RealtimeContextValue };\nexport type { RealtimeAuthConfig };\nexport type { RealtimeProviderProps };\nexport type { RealtimeEvent } from \"@cossistant/types/realtime-events\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider.js","names":["payload: unknown"],"sources":["../../src/realtime/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n\ttype AnyRealtimeEvent,\n\tisValidEventType,\n\ttype RealtimeEvent,\n\tvalidateRealtimeEvent,\n} from \"@cossistant/types/realtime-events\";\nimport type React from \"react\";\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport useWebSocket, { ReadyState } from \"react-use-websocket\";\n\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;\nconst DEFAULT_HEARTBEAT_TIMEOUT_MS = 45_000;\n\ntype SubscribeHandler = (event: AnyRealtimeEvent) => void;\n\ntype MessageDecodeResult =\n\t| {\n\t\t\ttype: \"raw-text\";\n\t\t\tdata: string;\n\t }\n\t| {\n\t\t\ttype: \"unsupported\";\n\t };\n\ntype ParsedMessage =\n\t| {\n\t\t\ttype: \"pong\";\n\t }\n\t| {\n\t\t\ttype: \"connection-established\";\n\t\t\tconnectionId: string | null;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\tmessage: string;\n\t }\n\t| {\n\t\t\ttype: \"event\";\n\t\t\tevent: AnyRealtimeEvent;\n\t }\n\t| {\n\t\t\ttype: \"invalid\";\n\t };\n\ntype VisitorAuthConfig = {\n\tkind: \"visitor\";\n\tvisitorId: string | null;\n\twebsiteId?: string | null;\n\tpublicKey?: string | null;\n};\n\ntype SessionAuthConfig = {\n\tkind: \"session\";\n\tsessionToken: string | null;\n\twebsiteId?: string | null;\n\tuserId?: string | null;\n};\n\ntype RealtimeAuthConfig = VisitorAuthConfig | SessionAuthConfig;\n\ntype ResolvedAuthConfig = {\n\ttype: \"visitor\" | \"session\";\n\tvisitorId: string | null;\n\twebsiteId: string | null;\n\tuserId: string | null;\n\tsessionToken: string | null;\n\tpublicKey: string | null;\n};\n\ntype RealtimeAuthIdentity = Pick<\n\tResolvedAuthConfig,\n\t\"visitorId\" | \"websiteId\" | \"userId\"\n>;\n\ntype RealtimeProviderProps = {\n\tchildren: React.ReactNode;\n\twsUrl?: string;\n\tauth: RealtimeAuthConfig | null;\n\tautoConnect?: boolean;\n\tonConnect?: () => void;\n\tonDisconnect?: () => void;\n\tonError?: (error: Error) => void;\n};\n\ntype RealtimeConnectionState = {\n\tisConnected: boolean;\n\tisConnecting: boolean;\n\terror: Error | null;\n\tsend: (event: AnyRealtimeEvent) => void;\n\tsendRaw: (data: string) => void;\n\tsubscribe: (handler: SubscribeHandler) => () => void;\n\tlastEvent: AnyRealtimeEvent | null;\n\tconnectionId: string | null;\n\treconnect: () => void;\n};\n\ntype RealtimeContextValue = RealtimeConnectionState & {\n\tvisitorId: string | null;\n\twebsiteId: string | null;\n\tuserId: string | null;\n};\n\nconst DEFAULT_WS_URL = \"wss://api.cossistant.com/ws\";\n\nconst RealtimeContext = createContext<RealtimeContextValue | null>(null);\n\n/**\n * Decodes WebSocket message data into a string.\n * Handles string, ArrayBuffer, and ArrayBufferView formats.\n */\nfunction decodeMessageData(data: unknown): MessageDecodeResult {\n\tif (typeof data === \"string\") {\n\t\treturn { type: \"raw-text\", data };\n\t}\n\n\tif (data instanceof ArrayBuffer) {\n\t\ttry {\n\t\t\treturn { type: \"raw-text\", data: new TextDecoder().decode(data) };\n\t\t} catch {\n\t\t\treturn { type: \"unsupported\" };\n\t\t}\n\t}\n\n\tif (ArrayBuffer.isView(data)) {\n\t\ttry {\n\t\t\treturn { type: \"raw-text\", data: new TextDecoder().decode(data.buffer) };\n\t\t} catch {\n\t\t\treturn { type: \"unsupported\" };\n\t\t}\n\t}\n\n\treturn { type: \"unsupported\" };\n}\n\n/**\n * Safely parses JSON string, returning null if invalid.\n */\nfunction parseJson(raw: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Extracts a string field from an unknown object, with optional validation.\n */\nfunction extractStringField(\n\tobj: unknown,\n\tfield: string,\n\trequired = false\n): string | null {\n\tif (!obj || typeof obj !== \"object\" || !(field in obj)) {\n\t\treturn required ? null : null;\n\t}\n\tconst value = (obj as Record<string, unknown>)[field];\n\tif (typeof value === \"string\" && value.length > 0) {\n\t\treturn value;\n\t}\n\treturn required ? null : null;\n}\n\n/**\n * Parses a WebSocket message and determines its type and content.\n */\nfunction parseWebSocketMessage(rawText: string): ParsedMessage {\n\t// Handle pong heartbeat\n\tif (rawText === \"pong\") {\n\t\treturn { type: \"pong\" };\n\t}\n\n\t// Try to parse as JSON\n\tconst parsed = parseJson(rawText);\n\tif (!parsed || typeof parsed !== \"object\") {\n\t\treturn { type: \"invalid\" };\n\t}\n\n\tconst messageType = extractStringField(parsed, \"type\");\n\n\t// Handle CONNECTION_ESTABLISHED\n\tif (messageType === \"CONNECTION_ESTABLISHED\") {\n\t\tconst payload = (parsed as { payload?: unknown }).payload;\n\t\tconst connectionId = extractStringField(payload, \"connectionId\");\n\t\treturn { type: \"connection-established\", connectionId };\n\t}\n\n\t// Handle error messages\n\tif (\"error\" in parsed && \"message\" in parsed) {\n\t\tconst message =\n\t\t\textractStringField(parsed, \"message\") || \"Realtime connection error\";\n\t\treturn { type: \"error\", message };\n\t}\n\n\t// Handle realtime events\n\tif (messageType && isValidEventType(messageType)) {\n\t\ttry {\n\t\t\tconst event = constructRealtimeEvent(parsed);\n\t\t\tif (!event) {\n\t\t\t\treturn { type: \"invalid\" };\n\t\t\t}\n\t\t\treturn { type: \"event\", event };\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Realtime] Failed to construct event\", error);\n\t\t\treturn { type: \"invalid\" };\n\t\t}\n\t}\n\n\treturn { type: \"invalid\" };\n}\n\n/**\n * Constructs a RealtimeEvent from parsed JSON data.\n * Returns null if required fields are missing or validation fails.\n */\nfunction constructRealtimeEvent(parsed: unknown): AnyRealtimeEvent | null {\n\tif (!parsed || typeof parsed !== \"object\" || !(\"type\" in parsed)) {\n\t\treturn null;\n\t}\n\n\tconst type = (parsed as { type: unknown }).type;\n\tif (!isValidEventType(type)) {\n\t\treturn null;\n\t}\n\n\tconst eventType = type;\n\n\t// Extract payload directly\n\tconst payloadSource = (parsed as { payload?: unknown }).payload;\n\n\tlet payload: unknown;\n\ttry {\n\t\tpayload = validateRealtimeEvent(eventType, payloadSource);\n\t} catch (error) {\n\t\tconsole.error(\"[Realtime] Received invalid event payload\", error);\n\t\treturn null;\n\t}\n\n\tconst organizationId = extractStringField(\n\t\tpayloadSource,\n\t\t\"organizationId\",\n\t\ttrue\n\t);\n\tconst websiteId = extractStringField(payloadSource, \"websiteId\", true);\n\n\tif (!organizationId) {\n\t\tconsole.error(\"[Realtime] Received event without organizationId\", parsed);\n\t\treturn null;\n\t}\n\n\tif (!websiteId) {\n\t\tconsole.error(\"[Realtime] Received event without websiteId\", parsed);\n\t\treturn null;\n\t}\n\n\tconst visitorId = extractStringField(parsed, \"visitorId\");\n\n\treturn {\n\t\ttype: eventType,\n\t\tpayload,\n\t\torganizationId,\n\t\twebsiteId,\n\t\tvisitorId,\n\t} as AnyRealtimeEvent;\n}\n\n/**\n * Checks if heartbeat has timed out.\n * Only call this function in browser context (inside effects or event handlers).\n */\nfunction isHeartbeatTimedOut(\n\tlastHeartbeat: number,\n\ttimeoutMs: number\n): boolean {\n\tif (typeof window === \"undefined\") {\n\t\treturn false;\n\t}\n\tconst elapsed = Date.now() - lastHeartbeat;\n\treturn elapsed > timeoutMs;\n}\n\nfunction resolvePublicKey(explicit?: string | null): string | null {\n\tconst trimmed = explicit?.trim();\n\tif (trimmed) {\n\t\treturn trimmed;\n\t}\n\n\tconst processEnv = typeof process !== \"undefined\" ? process.env : undefined;\n\n\t// Next.js: NEXT_PUBLIC_COSSISTANT_API_KEY\n\t// React/other: COSSISTANT_API_KEY\n\tconst fromEnv =\n\t\tprocessEnv?.NEXT_PUBLIC_COSSISTANT_API_KEY ||\n\t\tprocessEnv?.COSSISTANT_API_KEY ||\n\t\tnull;\n\n\tconst normalized = fromEnv?.trim();\n\treturn normalized && normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeAuth(\n\tauth: RealtimeAuthConfig | null\n): ResolvedAuthConfig | null {\n\tif (!auth) {\n\t\treturn null;\n\t}\n\n\tif (auth.kind === \"visitor\") {\n\t\tconst visitorId = auth.visitorId?.trim() || null;\n\n\t\tif (!visitorId) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"visitor\",\n\t\t\tvisitorId,\n\t\t\twebsiteId: auth.websiteId?.trim() || null,\n\t\t\tuserId: null,\n\t\t\tsessionToken: null,\n\t\t\tpublicKey: resolvePublicKey(auth.publicKey ?? null),\n\t\t} satisfies ResolvedAuthConfig;\n\t}\n\n\tconst sessionToken = auth.sessionToken?.trim() || null;\n\n\tif (!sessionToken) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\ttype: \"session\",\n\t\tvisitorId: null,\n\t\twebsiteId: auth.websiteId?.trim() || null,\n\t\tuserId: auth.userId?.trim() || null,\n\t\tsessionToken,\n\t\tpublicKey: null,\n\t} satisfies ResolvedAuthConfig;\n}\n\nfunction toRealtimeAuthIdentity(\n\tauth: ResolvedAuthConfig | null\n): RealtimeAuthIdentity {\n\treturn {\n\t\tvisitorId: auth?.visitorId ?? null,\n\t\twebsiteId: auth?.websiteId ?? null,\n\t\tuserId: auth?.userId ?? null,\n\t};\n}\n\nfunction hasRealtimeAuthIdentityChanged(\n\tprevious: RealtimeAuthIdentity,\n\tnext: RealtimeAuthIdentity\n): boolean {\n\treturn (\n\t\tprevious.visitorId !== next.visitorId ||\n\t\tprevious.websiteId !== next.websiteId ||\n\t\tprevious.userId !== next.userId\n\t);\n}\n\nfunction buildSocketUrl(\n\tbaseUrl: string,\n\tauth: ResolvedAuthConfig | null\n): string | null {\n\tif (!auth) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst url = new URL(baseUrl);\n\n\t\tif (auth.type === \"visitor\") {\n\t\t\turl.searchParams.set(\"visitorId\", auth.visitorId ?? \"\");\n\t\t\tconst publicKey = auth.publicKey;\n\t\t\tif (publicKey) {\n\t\t\t\turl.searchParams.set(\"publicKey\", publicKey);\n\t\t\t}\n\t\t} else {\n\t\t\turl.searchParams.set(\"sessionToken\", auth.sessionToken ?? \"\");\n\t\t\tif (auth.websiteId) {\n\t\t\t\turl.searchParams.set(\"websiteId\", auth.websiteId);\n\t\t\t}\n\t\t}\n\n\t\treturn url.toString();\n\t} catch (error) {\n\t\tconsole.error(\"[Realtime] Failed to build WebSocket URL\", error);\n\t\treturn null;\n\t}\n}\n\n/**\n * Internal component that handles the WebSocket connection.\n */\nfunction RealtimeProviderInternal({\n\tchildren,\n\twsUrl = DEFAULT_WS_URL,\n\tauth,\n\tautoConnect,\n\tonConnect,\n\tonDisconnect,\n\tonError,\n}: RealtimeProviderProps): React.ReactElement {\n\tconst normalizedAuth = normalizeAuth(auth);\n\tconst authIdentity = useMemo(\n\t\t() => toRealtimeAuthIdentity(normalizedAuth),\n\t\t[\n\t\t\tnormalizedAuth?.visitorId,\n\t\t\tnormalizedAuth?.websiteId,\n\t\t\tnormalizedAuth?.userId,\n\t\t]\n\t);\n\n\tconst socketUrl = buildSocketUrl(wsUrl, normalizedAuth);\n\tconst eventHandlersRef = useRef<Set<SubscribeHandler>>(new Set());\n\tconst lastHeartbeatRef = useRef<number>(0);\n\tconst hasOpenedRef = useRef(false);\n\tconst previousAuthIdentityRef = useRef(authIdentity);\n\tconst previousUrlRef = useRef<string | null>(null);\n\tconst [connectionError, setConnectionError] = useState<Error | null>(null);\n\tconst [lastEvent, setLastEvent] = useState<AnyRealtimeEvent | null>(null);\n\tconst [connectionId, setConnectionId] = useState<string | null>(null);\n\n\tconst heartbeatIntervalMs = DEFAULT_HEARTBEAT_INTERVAL_MS;\n\tconst heartbeatTimeoutMs = DEFAULT_HEARTBEAT_TIMEOUT_MS;\n\n\tconst canConnect = Boolean(autoConnect && socketUrl);\n\tconst connectionUrl = canConnect ? socketUrl : null;\n\n\t// Reset connection metadata when auth identity changes without remounting descendants.\n\tuseEffect(() => {\n\t\tconst previous = previousAuthIdentityRef.current;\n\t\tconst hasIdentityChanged = hasRealtimeAuthIdentityChanged(\n\t\t\tprevious,\n\t\t\tauthIdentity\n\t\t);\n\n\t\tif (hasIdentityChanged) {\n\t\t\thasOpenedRef.current = false;\n\t\t\tlastHeartbeatRef.current = 0;\n\t\t\tsetConnectionId(null);\n\t\t\tsetLastEvent(null);\n\t\t\tsetConnectionError(null);\n\t\t}\n\n\t\tpreviousAuthIdentityRef.current = authIdentity;\n\t}, [authIdentity]);\n\n\t// Track URL changes to detect when connection is being replaced\n\tuseEffect(() => {\n\t\tif (connectionUrl !== previousUrlRef.current) {\n\t\t\tpreviousUrlRef.current = connectionUrl;\n\t\t\t// Reset hasOpenedRef when URL changes so we know a new connection is starting\n\t\t\thasOpenedRef.current = false;\n\t\t}\n\t}, [connectionUrl]);\n\n\tconst {\n\t\tsendMessage,\n\t\tsendJsonMessage,\n\t\tlastMessage,\n\t\treadyState,\n\t\tgetWebSocket,\n\t} = useWebSocket(\n\t\tconnectionUrl,\n\t\t{\n\t\t\tshouldReconnect: (closeEvent) => {\n\t\t\t\tif (!canConnect) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (closeEvent.code === 1008 || closeEvent.code === 1011) {\n\t\t\t\t\tconst err = new Error(\n\t\t\t\t\t\tcloseEvent.reason ||\n\t\t\t\t\t\t\t\"Realtime connection closed by server. Please check your credentials.\"\n\t\t\t\t\t);\n\t\t\t\t\tsetConnectionError(err);\n\t\t\t\t\tonError?.(err);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\treconnectAttempts: autoConnect ? undefined : 0,\n\t\t\treconnectInterval: (attempt) => {\n\t\t\t\tconst base = 500 * 2 ** attempt;\n\t\t\t\treturn Math.min(base, 30_000);\n\t\t\t},\n\t\t\tretryOnError: false,\n\t\t\tonOpen: () => {\n\t\t\t\thasOpenedRef.current = true;\n\t\t\t\tsetConnectionError(null);\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tonConnect?.();\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\tsetConnectionId(null);\n\t\t\t\tonDisconnect?.();\n\t\t\t},\n\t\t\tonError: (event) => {\n\t\t\t\tif (!canConnect) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst socketLike = event.target;\n\t\t\t\tconst currentSocket = getWebSocket();\n\t\t\t\tconst isBrowserSocket =\n\t\t\t\t\ttypeof WebSocket !== \"undefined\" && socketLike instanceof WebSocket;\n\t\t\t\tconst socketState = isBrowserSocket ? socketLike.readyState : undefined;\n\n\t\t\t\t// Only suppress errors for THIS provider's socket, not other nested providers\n\t\t\t\t// Check if the errored socket belongs to this provider instance\n\t\t\t\tconst isThisProvidersSocket = currentSocket === socketLike;\n\n\t\t\t\t// Suppress errors if:\n\t\t\t\t// 1. This socket was replaced (URL changed while connecting) - only for this provider\n\t\t\t\t// 2. Connection URL is null (component unmounting or disabled)\n\t\t\t\t// 3. Socket is in CLOSING/CLOSED state and hasn't opened (cleanup/unmount) - only for this provider\n\t\t\t\tif (\n\t\t\t\t\t(!isThisProvidersSocket && currentSocket) ||\n\t\t\t\t\t!connectionUrl ||\n\t\t\t\t\t(isThisProvidersSocket &&\n\t\t\t\t\t\t!hasOpenedRef.current &&\n\t\t\t\t\t\t(socketState === WebSocket.CLOSING ||\n\t\t\t\t\t\t\tsocketState === WebSocket.CLOSED))\n\t\t\t\t) {\n\t\t\t\t\t// Suppress these expected errors during connection replacement or cleanup\n\t\t\t\t\t// But only if it's THIS provider's socket being replaced\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// For errors that occur during CONNECTING state, check if URL changed\n\t\t\t\t// Only suppress if it's this provider's socket\n\t\t\t\tif (\n\t\t\t\t\tisThisProvidersSocket &&\n\t\t\t\t\t!hasOpenedRef.current &&\n\t\t\t\t\tsocketState === WebSocket.CONNECTING &&\n\t\t\t\t\tconnectionUrl !== previousUrlRef.current\n\t\t\t\t) {\n\t\t\t\t\t// URL changed while connecting, suppress error\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst err = new Error(`WebSocket error: ${event.type}`);\n\t\t\t\tsetConnectionError(err);\n\t\t\t\tonError?.(err);\n\t\t\t},\n\t\t},\n\t\tcanConnect\n\t);\n\n\tuseEffect(() => {\n\t\tif (!lastMessage) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Decode message data from various formats\n\t\tconst decoded = decodeMessageData(lastMessage.data);\n\t\tif (decoded.type === \"unsupported\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse the message and determine its type\n\t\tconst message = parseWebSocketMessage(decoded.data);\n\n\t\t// Handle different message types\n\t\tswitch (message.type) {\n\t\t\tcase \"pong\":\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tbreak;\n\n\t\t\tcase \"connection-established\":\n\t\t\t\tsetConnectionId(message.connectionId);\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tbreak;\n\n\t\t\tcase \"error\": {\n\t\t\t\tconst err = new Error(message.message);\n\t\t\t\tsetConnectionError(err);\n\t\t\t\tonError?.(err);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"event\":\n\t\t\t\tlastHeartbeatRef.current =\n\t\t\t\t\ttypeof window !== \"undefined\" ? Date.now() : 0;\n\t\t\t\tsetLastEvent(message.event);\n\t\t\t\tfor (const handler of eventHandlersRef.current) {\n\t\t\t\t\tPromise.resolve(handler(message.event)).catch((error) => {\n\t\t\t\t\t\tconst err =\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t: new Error(`Subscriber threw an exception: ${String(error)}`);\n\t\t\t\t\t\tonError?.(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Silently ignore invalid or unknown messages\n\t\t\t\tbreak;\n\t\t}\n\t}, [lastMessage, onError]);\n\n\tuseEffect(() => {\n\t\tif (!canConnect) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst interval = window.setInterval(() => {\n\t\t\tif (readyState !== ReadyState.OPEN) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if heartbeat has timed out (skip if connection hasn't opened yet)\n\t\t\tif (\n\t\t\t\tlastHeartbeatRef.current !== 0 &&\n\t\t\t\tisHeartbeatTimedOut(lastHeartbeatRef.current, heartbeatTimeoutMs)\n\t\t\t) {\n\t\t\t\tconst socket = getWebSocket();\n\t\t\t\tsocket?.close(4000, \"Heartbeat timeout\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Send ping to keep connection alive\n\t\t\ttry {\n\t\t\t\tsendMessage(\"ping\");\n\t\t\t} catch {\n\t\t\t\t// Ignore send failures; reconnect logic will handle it\n\t\t\t}\n\t\t}, heartbeatIntervalMs);\n\n\t\treturn () => {\n\t\t\twindow.clearInterval(interval);\n\t\t};\n\t}, [\n\t\tcanConnect,\n\t\theartbeatIntervalMs,\n\t\theartbeatTimeoutMs,\n\t\treadyState,\n\t\tsendMessage,\n\t\tgetWebSocket,\n\t]);\n\n\tconst send = useCallback(\n\t\t(event: AnyRealtimeEvent) => {\n\t\t\tif (!connectionUrl) {\n\t\t\t\tthrow new Error(\"Realtime connection is disabled\");\n\t\t\t}\n\n\t\t\tif (readyState !== ReadyState.OPEN) {\n\t\t\t\tthrow new Error(\"Realtime connection is not established\");\n\t\t\t}\n\n\t\t\tsendJsonMessage(event);\n\t\t},\n\t\t[connectionUrl, readyState, sendJsonMessage]\n\t);\n\n\tconst sendRaw = useCallback(\n\t\t(data: string) => {\n\t\t\tif (!connectionUrl) {\n\t\t\t\tthrow new Error(\"Realtime connection is disabled\");\n\t\t\t}\n\n\t\t\tif (readyState !== ReadyState.OPEN) {\n\t\t\t\tthrow new Error(\"Realtime connection is not established\");\n\t\t\t}\n\n\t\t\tsendMessage(data);\n\t\t},\n\t\t[connectionUrl, readyState, sendMessage]\n\t);\n\n\tconst subscribe = useCallback((handler: SubscribeHandler) => {\n\t\teventHandlersRef.current.add(handler);\n\t\treturn () => {\n\t\t\teventHandlersRef.current.delete(handler);\n\t\t};\n\t}, []);\n\n\tconst reconnect = useCallback(() => {\n\t\tconst socket = getWebSocket();\n\t\tsocket?.close();\n\t}, [getWebSocket]);\n\n\tconst connection = useMemo<RealtimeConnectionState>(\n\t\t() => ({\n\t\t\tisConnected: readyState === ReadyState.OPEN,\n\t\t\tisConnecting: readyState === ReadyState.CONNECTING,\n\t\t\terror: connectionError,\n\t\t\tsend,\n\t\t\tsendRaw,\n\t\t\tsubscribe,\n\t\t\tlastEvent,\n\t\t\tconnectionId,\n\t\t\treconnect,\n\t\t}),\n\t\t[\n\t\t\treadyState,\n\t\t\tconnectionError,\n\t\t\tsend,\n\t\t\tsendRaw,\n\t\t\tsubscribe,\n\t\t\tlastEvent,\n\t\t\tconnectionId,\n\t\t\treconnect,\n\t\t]\n\t);\n\n\tconst value = useMemo<RealtimeContextValue>(\n\t\t() => ({\n\t\t\t...connection,\n\t\t\tvisitorId: normalizedAuth?.visitorId ?? null,\n\t\t\twebsiteId: normalizedAuth?.websiteId ?? null,\n\t\t\tuserId: normalizedAuth?.userId ?? null,\n\t\t}),\n\t\t[\n\t\t\tconnection,\n\t\t\tnormalizedAuth?.visitorId,\n\t\t\tnormalizedAuth?.websiteId,\n\t\t\tnormalizedAuth?.userId,\n\t\t]\n\t);\n\n\treturn (\n\t\t<RealtimeContext.Provider value={value}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t);\n}\n\n/**\n * Provides websocket connectivity and heartbeating logic for realtime events.\n */\nexport function RealtimeProvider({\n\tchildren,\n\twsUrl = DEFAULT_WS_URL,\n\tauth,\n\tautoConnect = true,\n\tonConnect,\n\tonDisconnect,\n\tonError,\n}: RealtimeProviderProps): React.ReactElement {\n\treturn (\n\t\t<RealtimeProviderInternal\n\t\t\tauth={auth}\n\t\t\tautoConnect={autoConnect}\n\t\t\tonConnect={onConnect}\n\t\t\tonDisconnect={onDisconnect}\n\t\t\tonError={onError}\n\t\t\twsUrl={wsUrl}\n\t\t>\n\t\t\t{children}\n\t\t</RealtimeProviderInternal>\n\t);\n}\n\n/**\n * Returns the realtime connection context.\n */\nexport function useRealtimeConnection(): RealtimeContextValue {\n\tconst context = useContext(RealtimeContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useRealtimeConnection must be used within RealtimeProvider\"\n\t\t);\n\t}\n\n\treturn context;\n}\n\nexport type { RealtimeContextValue };\nexport type { RealtimeAuthConfig };\nexport type { RealtimeProviderProps };\nexport type { RealtimeEvent } from \"@cossistant/types/realtime-events\";\n"],"mappings":";;;;;;;;AAoBA,MAAM,gCAAgC;AACtC,MAAM,+BAA+B;AA2FrC,MAAM,iBAAiB;AAEvB,MAAM,kBAAkB,cAA2C,KAAK;;;;;AAMxE,SAAS,kBAAkB,MAAoC;AAC9D,KAAI,OAAO,SAAS,SACnB,QAAO;EAAE,MAAM;EAAY;EAAM;AAGlC,KAAI,gBAAgB,YACnB,KAAI;AACH,SAAO;GAAE,MAAM;GAAY,MAAM,IAAI,aAAa,CAAC,OAAO,KAAK;GAAE;SAC1D;AACP,SAAO,EAAE,MAAM,eAAe;;AAIhC,KAAI,YAAY,OAAO,KAAK,CAC3B,KAAI;AACH,SAAO;GAAE,MAAM;GAAY,MAAM,IAAI,aAAa,CAAC,OAAO,KAAK,OAAO;GAAE;SACjE;AACP,SAAO,EAAE,MAAM,eAAe;;AAIhC,QAAO,EAAE,MAAM,eAAe;;;;;AAM/B,SAAS,UAAU,KAAsB;AACxC,KAAI;AACH,SAAO,KAAK,MAAM,IAAI;SACf;AACP,SAAO;;;;;;AAOT,SAAS,mBACR,KACA,OACA,WAAW,OACK;AAChB,KAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,EAAE,SAAS,KACjD,QAAO,WAAW,OAAO;CAE1B,MAAM,QAAS,IAAgC;AAC/C,KAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAC/C,QAAO;AAER,QAAO,WAAW,OAAO;;;;;AAM1B,SAAS,sBAAsB,SAAgC;AAE9D,KAAI,YAAY,OACf,QAAO,EAAE,MAAM,QAAQ;CAIxB,MAAM,SAAS,UAAU,QAAQ;AACjC,KAAI,CAAC,UAAU,OAAO,WAAW,SAChC,QAAO,EAAE,MAAM,WAAW;CAG3B,MAAM,cAAc,mBAAmB,QAAQ,OAAO;AAGtD,KAAI,gBAAgB,0BAA0B;EAC7C,MAAM,UAAW,OAAiC;AAElD,SAAO;GAAE,MAAM;GAA0B,cADpB,mBAAmB,SAAS,eAAe;GACT;;AAIxD,KAAI,WAAW,UAAU,aAAa,OAGrC,QAAO;EAAE,MAAM;EAAS,SADvB,mBAAmB,QAAQ,UAAU,IAAI;EACT;AAIlC,KAAI,eAAe,iBAAiB,YAAY,CAC/C,KAAI;EACH,MAAM,QAAQ,uBAAuB,OAAO;AAC5C,MAAI,CAAC,MACJ,QAAO,EAAE,MAAM,WAAW;AAE3B,SAAO;GAAE,MAAM;GAAS;GAAO;UACvB,OAAO;AACf,UAAQ,MAAM,wCAAwC,MAAM;AAC5D,SAAO,EAAE,MAAM,WAAW;;AAI5B,QAAO,EAAE,MAAM,WAAW;;;;;;AAO3B,SAAS,uBAAuB,QAA0C;AACzE,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,UAAU,QACxD,QAAO;CAGR,MAAM,OAAQ,OAA6B;AAC3C,KAAI,CAAC,iBAAiB,KAAK,CAC1B,QAAO;CAGR,MAAM,YAAY;CAGlB,MAAM,gBAAiB,OAAiC;CAExD,IAAIA;AACJ,KAAI;AACH,YAAU,sBAAsB,WAAW,cAAc;UACjD,OAAO;AACf,UAAQ,MAAM,6CAA6C,MAAM;AACjE,SAAO;;CAGR,MAAM,iBAAiB,mBACtB,eACA,kBACA,KACA;CACD,MAAM,YAAY,mBAAmB,eAAe,aAAa,KAAK;AAEtE,KAAI,CAAC,gBAAgB;AACpB,UAAQ,MAAM,oDAAoD,OAAO;AACzE,SAAO;;AAGR,KAAI,CAAC,WAAW;AACf,UAAQ,MAAM,+CAA+C,OAAO;AACpE,SAAO;;CAGR,MAAM,YAAY,mBAAmB,QAAQ,YAAY;AAEzD,QAAO;EACN,MAAM;EACN;EACA;EACA;EACA;EACA;;;;;;AAOF,SAAS,oBACR,eACA,WACU;AACV,KAAI,OAAO,WAAW,YACrB,QAAO;AAGR,QADgB,KAAK,KAAK,GAAG,gBACZ;;AAGlB,SAAS,iBAAiB,UAAyC;CAClE,MAAM,UAAU,UAAU,MAAM;AAChC,KAAI,QACH,QAAO;CAGR,MAAM,aAAa,OAAO,YAAY,cAAc,QAAQ,MAAM;CASlE,MAAM,cAJL,YAAY,kCACZ,YAAY,sBACZ,OAE2B,MAAM;AAClC,QAAO,cAAc,WAAW,SAAS,IAAI,aAAa;;AAG3D,SAAS,cACR,MAC4B;AAC5B,KAAI,CAAC,KACJ,QAAO;AAGR,KAAI,KAAK,SAAS,WAAW;EAC5B,MAAM,YAAY,KAAK,WAAW,MAAM,IAAI;AAE5C,MAAI,CAAC,UACJ,QAAO;AAGR,SAAO;GACN,MAAM;GACN;GACA,WAAW,KAAK,WAAW,MAAM,IAAI;GACrC,QAAQ;GACR,cAAc;GACd,WAAW,iBAAiB,KAAK,aAAa,KAAK;GACnD;;CAGF,MAAM,eAAe,KAAK,cAAc,MAAM,IAAI;AAElD,KAAI,CAAC,aACJ,QAAO;AAGR,QAAO;EACN,MAAM;EACN,WAAW;EACX,WAAW,KAAK,WAAW,MAAM,IAAI;EACrC,QAAQ,KAAK,QAAQ,MAAM,IAAI;EAC/B;EACA,WAAW;EACX;;AAGF,SAAS,uBACR,MACuB;AACvB,QAAO;EACN,WAAW,MAAM,aAAa;EAC9B,WAAW,MAAM,aAAa;EAC9B,QAAQ,MAAM,UAAU;EACxB;;AAGF,SAAS,+BACR,UACA,MACU;AACV,QACC,SAAS,cAAc,KAAK,aAC5B,SAAS,cAAc,KAAK,aAC5B,SAAS,WAAW,KAAK;;AAI3B,SAAS,eACR,SACA,MACgB;AAChB,KAAI,CAAC,KACJ,QAAO;AAGR,KAAI;EACH,MAAM,MAAM,IAAI,IAAI,QAAQ;AAE5B,MAAI,KAAK,SAAS,WAAW;AAC5B,OAAI,aAAa,IAAI,aAAa,KAAK,aAAa,GAAG;GACvD,MAAM,YAAY,KAAK;AACvB,OAAI,UACH,KAAI,aAAa,IAAI,aAAa,UAAU;SAEvC;AACN,OAAI,aAAa,IAAI,gBAAgB,KAAK,gBAAgB,GAAG;AAC7D,OAAI,KAAK,UACR,KAAI,aAAa,IAAI,aAAa,KAAK,UAAU;;AAInD,SAAO,IAAI,UAAU;UACb,OAAO;AACf,UAAQ,MAAM,4CAA4C,MAAM;AAChE,SAAO;;;;;;AAOT,SAAS,yBAAyB,EACjC,UACA,QAAQ,gBACR,MACA,aACA,WACA,cACA,WAC6C;CAC7C,MAAM,iBAAiB,cAAc,KAAK;CAC1C,MAAM,eAAe,cACd,uBAAuB,eAAe,EAC5C;EACC,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,CACD;CAED,MAAM,YAAY,eAAe,OAAO,eAAe;CACvD,MAAM,mBAAmB,uBAA8B,IAAI,KAAK,CAAC;CACjE,MAAM,mBAAmB,OAAe,EAAE;CAC1C,MAAM,eAAe,OAAO,MAAM;CAClC,MAAM,0BAA0B,OAAO,aAAa;CACpD,MAAM,iBAAiB,OAAsB,KAAK;CAClD,MAAM,CAAC,iBAAiB,sBAAsB,SAAuB,KAAK;CAC1E,MAAM,CAAC,WAAW,gBAAgB,SAAkC,KAAK;CACzE,MAAM,CAAC,cAAc,mBAAmB,SAAwB,KAAK;CAErE,MAAM,sBAAsB;CAC5B,MAAM,qBAAqB;CAE3B,MAAM,aAAa,QAAQ,eAAe,UAAU;CACpD,MAAM,gBAAgB,aAAa,YAAY;AAG/C,iBAAgB;EACf,MAAM,WAAW,wBAAwB;AAMzC,MAL2B,+BAC1B,UACA,aACA,EAEuB;AACvB,gBAAa,UAAU;AACvB,oBAAiB,UAAU;AAC3B,mBAAgB,KAAK;AACrB,gBAAa,KAAK;AAClB,sBAAmB,KAAK;;AAGzB,0BAAwB,UAAU;IAChC,CAAC,aAAa,CAAC;AAGlB,iBAAgB;AACf,MAAI,kBAAkB,eAAe,SAAS;AAC7C,kBAAe,UAAU;AAEzB,gBAAa,UAAU;;IAEtB,CAAC,cAAc,CAAC;CAEnB,MAAM,EACL,aACA,iBACA,aACA,YACA,iBACG,aACH,eACA;EACC,kBAAkB,eAAe;AAChC,OAAI,CAAC,WACJ,QAAO;AAGR,OAAI,WAAW,SAAS,QAAQ,WAAW,SAAS,MAAM;IACzD,MAAM,MAAM,IAAI,MACf,WAAW,UACV,uEACD;AACD,uBAAmB,IAAI;AACvB,cAAU,IAAI;AACd,WAAO;;AAGR,UAAO;;EAER,mBAAmB,cAAc,SAAY;EAC7C,oBAAoB,YAAY;GAC/B,MAAM,OAAO,MAAM,KAAK;AACxB,UAAO,KAAK,IAAI,MAAM,IAAO;;EAE9B,cAAc;EACd,cAAc;AACb,gBAAa,UAAU;AACvB,sBAAmB,KAAK;AACxB,oBAAiB,UAChB,OAAO,WAAW,cAAc,KAAK,KAAK,GAAG;AAC9C,gBAAa;;EAEd,eAAe;AACd,mBAAgB,KAAK;AACrB,mBAAgB;;EAEjB,UAAU,UAAU;AACnB,OAAI,CAAC,WACJ;GAGD,MAAM,aAAa,MAAM;GACzB,MAAM,gBAAgB,cAAc;GAGpC,MAAM,cADL,OAAO,cAAc,eAAe,sBAAsB,YACrB,WAAW,aAAa;GAI9D,MAAM,wBAAwB,kBAAkB;AAMhD,OACE,CAAC,yBAAyB,iBAC3B,CAAC,iBACA,yBACA,CAAC,aAAa,YACb,gBAAgB,UAAU,WAC1B,gBAAgB,UAAU,QAI5B;AAKD,OACC,yBACA,CAAC,aAAa,WACd,gBAAgB,UAAU,cAC1B,kBAAkB,eAAe,QAGjC;GAGD,MAAM,sBAAM,IAAI,MAAM,oBAAoB,MAAM,OAAO;AACvD,sBAAmB,IAAI;AACvB,aAAU,IAAI;;EAEf,EACD,WACA;AAED,iBAAgB;AACf,MAAI,CAAC,YACJ;EAID,MAAM,UAAU,kBAAkB,YAAY,KAAK;AACnD,MAAI,QAAQ,SAAS,cACpB;EAID,MAAM,UAAU,sBAAsB,QAAQ,KAAK;AAGnD,UAAQ,QAAQ,MAAhB;GACC,KAAK;AACJ,qBAAiB,UAChB,OAAO,WAAW,cAAc,KAAK,KAAK,GAAG;AAC9C;GAED,KAAK;AACJ,oBAAgB,QAAQ,aAAa;AACrC,qBAAiB,UAChB,OAAO,WAAW,cAAc,KAAK,KAAK,GAAG;AAC9C;GAED,KAAK,SAAS;IACb,MAAM,MAAM,IAAI,MAAM,QAAQ,QAAQ;AACtC,uBAAmB,IAAI;AACvB,cAAU,IAAI;AACd;;GAGD,KAAK;AACJ,qBAAiB,UAChB,OAAO,WAAW,cAAc,KAAK,KAAK,GAAG;AAC9C,iBAAa,QAAQ,MAAM;AAC3B,SAAK,MAAM,WAAW,iBAAiB,QACtC,SAAQ,QAAQ,QAAQ,QAAQ,MAAM,CAAC,CAAC,OAAO,UAAU;KACxD,MAAM,MACL,iBAAiB,QACd,wBACA,IAAI,MAAM,kCAAkC,OAAO,MAAM,GAAG;AAChE,eAAU,IAAI;MACb;AAEH;GAED,QAEC;;IAEA,CAAC,aAAa,QAAQ,CAAC;AAE1B,iBAAgB;AACf,MAAI,CAAC,WACJ;EAGD,MAAM,WAAW,OAAO,kBAAkB;AACzC,OAAI,eAAe,WAAW,KAC7B;AAID,OACC,iBAAiB,YAAY,KAC7B,oBAAoB,iBAAiB,SAAS,mBAAmB,EAChE;AAED,IADe,cAAc,EACrB,MAAM,KAAM,oBAAoB;AACxC;;AAID,OAAI;AACH,gBAAY,OAAO;WACZ;KAGN,oBAAoB;AAEvB,eAAa;AACZ,UAAO,cAAc,SAAS;;IAE7B;EACF;EACA;EACA;EACA;EACA;EACA;EACA,CAAC;CAEF,MAAM,OAAO,aACX,UAA4B;AAC5B,MAAI,CAAC,cACJ,OAAM,IAAI,MAAM,kCAAkC;AAGnD,MAAI,eAAe,WAAW,KAC7B,OAAM,IAAI,MAAM,yCAAyC;AAG1D,kBAAgB,MAAM;IAEvB;EAAC;EAAe;EAAY;EAAgB,CAC5C;CAED,MAAM,UAAU,aACd,SAAiB;AACjB,MAAI,CAAC,cACJ,OAAM,IAAI,MAAM,kCAAkC;AAGnD,MAAI,eAAe,WAAW,KAC7B,OAAM,IAAI,MAAM,yCAAyC;AAG1D,cAAY,KAAK;IAElB;EAAC;EAAe;EAAY;EAAY,CACxC;CAED,MAAM,YAAY,aAAa,YAA8B;AAC5D,mBAAiB,QAAQ,IAAI,QAAQ;AACrC,eAAa;AACZ,oBAAiB,QAAQ,OAAO,QAAQ;;IAEvC,EAAE,CAAC;CAEN,MAAM,YAAY,kBAAkB;AAEnC,EADe,cAAc,EACrB,OAAO;IACb,CAAC,aAAa,CAAC;CAElB,MAAM,aAAa,eACX;EACN,aAAa,eAAe,WAAW;EACvC,cAAc,eAAe,WAAW;EACxC,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA,GACD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CACD;CAED,MAAM,QAAQ,eACN;EACN,GAAG;EACH,WAAW,gBAAgB,aAAa;EACxC,WAAW,gBAAgB,aAAa;EACxC,QAAQ,gBAAgB,UAAU;EAClC,GACD;EACC;EACA,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,CACD;AAED,QACC,oBAAC,gBAAgB;EAAgB;EAC/B;GACyB;;;;;AAO7B,SAAgB,iBAAiB,EAChC,UACA,QAAQ,gBACR,MACA,cAAc,MACd,WACA,cACA,WAC6C;AAC7C,QACC,oBAAC;EACM;EACO;EACF;EACG;EACL;EACF;EAEN;GACyB;;;;;AAO7B,SAAgB,wBAA8C;CAC7D,MAAM,UAAU,WAAW,gBAAgB;AAC3C,KAAI,CAAC,QACJ,OAAM,IAAI,MACT,6DACA;AAGF,QAAO"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/sounds/sound-data.d.ts
|
|
2
|
+
declare const NEW_MESSAGE_SOUND_DATA_URL = "data:audio/mp4;base64,AAAAHGZ0eXBNNEEgAAAAAE00QSBtcDQyaXNvbQAAA1Ztb292AAAAbG12aGQAAAAA5a8JFeWvCRUAAH0AAAAkAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAB6HRyYWsAAABcdGtoZAAAAAflrwkV5a8JFQAAAAEAAAAAAAAkAAAAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAYRtZGlhAAAAIG1kaGQAAAAA5a8JFeWvCRUAAH0AAAAkAAAAAAAAAAAiaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAAAAAAABOm1pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAA/nN0YmwAAAB2c3RzZAAAAAAAAAABAAAAZm1wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAB9AAAAAAAAM2VzZHMAAAAAA4CAgCIAAAAEgICAFEAUABgAAAAw2AAA+gAFgICAAhKQBoCAgAECAAAAD3NidGQAAAAASTE2AAAAGHN0dHMAAAAAAAAAAQAAAAkAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAJAAAAAQAAADhzdHN6AAAAAAAAAAAAAAAJAAAABgAAAFYAAAG6AAABKgAAAQsAAACxAAAAewAAAKQAAABMAAAAFHN0Y28AAAAAAAAAAQAAEAAAAAD6dWR0YQAAAPJtZXRhAAAAAAAAACJoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAADEaWxzdAAAALwtLS0tAAAAHG1lYW4AAAAAY29tLmFwcGxlLmlUdW5lcwAAABRuYW1lAAAAAGlUdW5TTVBCAAAAhGRhdGEAAAABAAAAACAwMDAwMDAwMCAwMDAwMDg0MCAwMDAwMDFEMiAwMDAwMDAwMDAwMDAxOUVFIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwAAAMhmZyZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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";
|
|
3
|
+
declare const TYPING_LOOP_SOUND_DATA_URL = "data:audio/mp4;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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";
|
|
4
|
+
//#endregion
|
|
5
|
+
export { NEW_MESSAGE_SOUND_DATA_URL, TYPING_LOOP_SOUND_DATA_URL };
|
|
6
|
+
//# sourceMappingURL=sound-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sound-data.d.ts","names":[],"sources":["../../src/sounds/sound-data.ts"],"sourcesContent":[],"mappings":";cAGa,0BAAA;AAAA,cAGA,0BAAA,GAH0B,g3fAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region src/sounds/sound-data.ts
|
|
2
|
+
const NEW_MESSAGE_SOUND_DATA_URL = "data:audio/mp4;base64,AAAAHGZ0eXBNNEEgAAAAAE00QSBtcDQyaXNvbQAAA1Ztb292AAAAbG12aGQAAAAA5a8JFeWvCRUAAH0AAAAkAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAB6HRyYWsAAABcdGtoZAAAAAflrwkV5a8JFQAAAAEAAAAAAAAkAAAAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAYRtZGlhAAAAIG1kaGQAAAAA5a8JFeWvCRUAAH0AAAAkAAAAAAAAAAAiaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAAAAAAABOm1pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAA/nN0YmwAAAB2c3RzZAAAAAAAAAABAAAAZm1wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAB9AAAAAAAAM2VzZHMAAAAAA4CAgCIAAAAEgICAFEAUABgAAAAw2AAA+gAFgICAAhKQBoCAgAECAAAAD3NidGQAAAAASTE2AAAAGHN0dHMAAAAAAAAAAQAAAAkAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAJAAAAAQAAADhzdHN6AAAAAAAAAAAAAAAJAAAABgAAAFYAAAG6AAABKgAAAQsAAACxAAAAewAAAKQAAABMAAAAFHN0Y28AAAAAAAAAAQAAEAAAAAD6dWR0YQAAAPJtZXRhAAAAAAAAACJoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAADEaWxzdAAAALwtLS0tAAAAHG1lYW4AAAAAY29tLmFwcGxlLmlUdW5lcwAAABRuYW1lAAAAAGlUdW5TTVBCAAAAhGRhdGEAAAABAAAAACAwMDAwMDAwMCAwMDAwMDg0MCAwMDAwMDFEMiAwMDAwMDAwMDAwMDAxOUVFIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwAAAMhmZyZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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";
|
|
3
|
+
const TYPING_LOOP_SOUND_DATA_URL = "data:audio/mp4;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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";
|
|
4
|
+
|
|
5
|
+
//#endregion
|
|
6
|
+
export { NEW_MESSAGE_SOUND_DATA_URL, TYPING_LOOP_SOUND_DATA_URL };
|
|
7
|
+
//# sourceMappingURL=sound-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sound-data.js","names":[],"sources":["../../src/sounds/sound-data.ts"],"sourcesContent":["// Inline base64-encoded AAC audio files\n// Converted from WAV to AAC (m4a) at 64kbps for minimal bundle size (~24KB total)\n\nexport const NEW_MESSAGE_SOUND_DATA_URL =\n\t\"data:audio/mp4;base64,AAAAHGZ0eXBNNEEgAAAAAE00QSBtcDQyaXNvbQAAA1Ztb292AAAAbG12aGQAAAAA5a8JFeWvCRUAAH0AAAAkAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAB6HRyYWsAAABcdGtoZAAAAAflrwkV5a8JFQAAAAEAAAAAAAAkAAAAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAYRtZGlhAAAAIG1kaGQAAAAA5a8JFeWvCRUAAH0AAAAkAAAAAAAAAAAiaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAAAAAAABOm1pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAA/nN0YmwAAAB2c3RzZAAAAAAAAAABAAAAZm1wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAB9AAAAAAAAM2VzZHMAAAAAA4CAgCIAAAAEgICAFEAUABgAAAAw2AAA+gAFgICAAhKQBoCAgAECAAAAD3NidGQAAAAASTE2AAAAGHN0dHMAAAAAAAAAAQAAAAkAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAJAAAAAQAAADhzdHN6AAAAAAAAAAAAAAAJAAAABgAAAFYAAAG6AAABKgAAAQsAAACxAAAAewAAAKQAAABMAAAAFHN0Y28AAAAAAAAAAQAAEAAAAAD6dWR0YQAAAPJtZXRhAAAAAAAAACJoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAADEaWxzdAAAALwtLS0tAAAAHG1lYW4AAAAAY29tLmFwcGxlLmlUdW5lcwAAABRuYW1lAAAAAGlUdW5TTVBCAAAAhGRhdGEAAAABAAAAACAwMDAwMDAwMCAwMDAwMDg0MCAwMDAwMDFEMiAwMDAwMDAwMDAwMDAxOUVFIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwAAAMhmZyZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZvbWRhdCEAA0BoHCEr1BgGDocPhW8ii2ouRlaYYcAh4CoVDyjQfwvSJgIZ6nHnx4H9gmbr3to+0RjCJLBIYfC89ZZ0t1guRdaYfeIeAoTsl8+nUcotMH1NHZXPVpegj6eAIU1k//P/n/z/5//hYTckgMIjCEsVoGkvCMC+RswMtuRT9/t/Pbj1d93//Sn6z68fXj2w/u+7+Vr8Y/7P8a1PrNNP/p4+vr6edQbXLrLwE9jl+Ig6DlS9yDEy1CNsUKI2lTUGRxbe5TUgUJiqRxEO7zteeuviAzYEXtn7c5ZIv2fwwFjz500fgHOAmw4hGvlrMzmu/KFDcYSd/Lp+X0dJny9vaq71VZSZnuyWZ2MNOGc7XV0q3I/SEat24xXlRMYc+2FsO0B/mdr5nVCQk0qrtbX2L+KZYG28pLlBEuXXkT20pTFJy2OHtOiqnzUgDET291VJY5tQkPW+7tvZSE6WApA8FH12JRUjsiETw8trV0asnnQbU0f1Q4fSa6K+X9t0RBrUQz0qPr0tHejgMp6XJgKP55X4hxv/+l7L/n7fj18Z1Vf8HH/fIYvf/w6/f29jjn/9vE+P+/v/KIXM4uQH5SESQQGNfkP21EYpGLIQ9QDkcADivXjAORd0rVgHPlTLhIwwX6V/3U62K+QMC3unwBuqvGPuYSwNAQ9qC3coCh2xLY57+N7PBkEgzYqnhiWsl57NrbV4WVsSvyFrz//h////+XpNiJABQxIYRDQgEeexthxfXVl9CaYkUlFqst1GgTwC1BVHKokQThQByjxhmTKxZSrIKyKAfHx8GHv7+5+Hw27Z2y+RcKhVV5Ed82GtDM9S9l7Reh1ZMf9SyaEpXY5SHPcAzd7HvRc3A7p5c5JciBgYLlYHFaFmOegKM1HTWFNGMTe4GBxrdyKu+Y5jjUtLUo71uLADiTbzug7wprM5TnfjCoPxOx1v4pIwVWXsnyeGyWr1y8xUokp21dkol3JE4G9J5qBKgCeQRgURAIREMUAR8bvs5pcyf+zglaYLQFCdjTswyWkJv6c0cAjhpBdeNwAEAAK+iV6DsgLXARlHFprQ16t28/M6rrFhiARYXCMty/Zjsjkw5n06wn7HTMndjAchC9RsJsQDVBHQghQxDAgchb+bNuClkRNxAga2qC4lcU05A64AtmTktWdS45RCjWtdRm2L3j3dLurNfVsAxjCu0F7kJU1OCveAcr7C5Do7hoYkFREYJM+HsceeEE0iqm9OQlTOCVWY0oVuqsSz2tXauajRIlIkK4JTgDtClU8Vc98G+BZhOLlQOWJFg9k0rZV2nqqF9TWOjcGIC184uEJukFOxLdENriIpljviLK0icy4I+AgNCuIDioCCoCs4dw/w6wE4N3MIMmaN2FJCk5v92QhcMPHAmjJCXVYyLgALxFxRTJ7dmv8qr96U513Yfz9CVbhCSF67qVpLFZYlC4g1NiWLVQ3hUkhSqrghC9RtLAaKGAHdW9Daf5C0BZmcbtN2GtFkokgl0M1wC4MuEhJl8zr1aGiiir4WyqBQHSueHykcrOuuxwsY0avUydMbV5d2aPzdYSXkndZjRn9PC0S9c8DnhdsVZ8q4/9+ILlgButj/Qr7wBUlln/HIYeIWpjyLABJzkFcdnkjKNVYHEIJEIFEwHaO8VMf78SFWM/ZQxgAvu19chcC6IBOazDDqYjJcUjf1JgL9FuNfth4hC9RFBY7kQxJA4hBh07mX4u37xZ30BlDWjAOB7YlG9jfv+1OnucJsDiR6yM4dODTCymoa4YfFK0M+8QM8iMNBEVfPuGJiRuDS0qAAIFCMRYDIomCz248DGP8gL2HE9iTZZ0wp9aBi3lrG5fYVnveYypCM02Hx660AmcAhC9Q0KQpKEoDFIFNMKLOkjRYxQWyIXIno///7tQkGARBKKUUJR5JNiClm6IEAAAAABi1Y+yRFplzfbVQOu3fA9qZ7UnNB81QIpNSKYE1GWHMVkFJABjABDSaP6n5OtNM9Fovw9vJKKygzaAfCK6kkYxdcn72PzUhp+d9WbNFq4CiQMNcGTAffQXInv/4A5jSCqpW6qZqfjkAGohywwZLJJ52KPCEL1GM8PhfXaT2B3XS5GTIYeACHgIAd3d3d3eQ2ZK5f3/zHFmAnd3d3d8JHeKRofG++Ghs0uRMyGHgA+fRQUFBQU0N1qahBQUFBTXA=\";\n\nexport const TYPING_LOOP_SOUND_DATA_URL =\n\t\"data:audio/mp4;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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\";\n"],"mappings":";AAGA,MAAa,6BACZ;AAED,MAAa,6BACZ"}
|
package/styles.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer base{.cossistant{color:var(--co-primary);color-scheme:normal;--co-font-sans:var(--co-theme-font-sans,"Geist","Inter",sans-serif);--co-font-mono:var(--co-theme-font-mono,"Geist Mono","Inter Mono",monospace);--co-radius:var(--co-theme-radius,.375rem);--co-background-base:var(--co-theme-background,oklch(99% 0 0));--co-foreground-base:var(--co-theme-foreground,oklch(20.5% 0 0));--co-popover-base:var(--co-theme-popover,var(--co-background-base));--co-popover-foreground-base:var(--co-theme-popover-foreground,var(--co-foreground-base));--co-primary-base:var(--co-theme-primary,oklch(14.5% 0 0));--co-primary-foreground-base:var(--co-theme-primary-foreground,oklch(98.5% 0 0));--co-secondary-base:var(--co-theme-secondary,oklch(97% 0 0));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,oklch(14.5% 0 0));--co-border-base:var(--co-theme-border,oklch(92.2% 0 0));--co-input-base:var(--co-theme-input,oklch(92.2% 0 0));--co-ring-base:var(--co-theme-ring,var(--co-primary-base));--co-accent-base:var(--co-theme-accent,var(--co-primary-base));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--co-primary-foreground-base));--co-background-50-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-50-mix:color-mix(in oklch,var(--co-background-base)98%,var(--co-foreground-base))}}.cossistant{--co-background-100-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-100-mix:color-mix(in oklch,var(--co-background-base)97%,var(--co-foreground-base))}}.cossistant{--co-background-200-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-200-mix:color-mix(in oklch,var(--co-background-base)96%,var(--co-foreground-base))}}.cossistant{--co-background-300-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-300-mix:color-mix(in oklch,var(--co-background-base)95%,var(--co-foreground-base))}}.cossistant{--co-background-400-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-400-mix:color-mix(in oklch,var(--co-background-base)94%,var(--co-foreground-base))}}.cossistant{--co-background-500-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-500-mix:color-mix(in oklch,var(--co-background-base)93%,var(--co-foreground-base))}}.cossistant{--co-background-600-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-600-mix:color-mix(in oklch,var(--co-background-base)92%,var(--co-foreground-base))}}.cossistant{--co-muted-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-muted-mix:color-mix(in oklch,var(--co-background-base)85%,var(--co-foreground-base))}}.cossistant{--co-muted-foreground-mix:var(--co-foreground-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-muted-foreground-mix:color-mix(in oklch,var(--co-foreground-base)70%,white)}}.cossistant{--co-background:var(--co-background-base);--co-background-50:var(--co-theme-background-50,var(--co-background-50-mix,oklch(92% 0 0)));--co-background-100:var(--co-theme-background-100,var(--co-background-100-mix,oklch(93% 0 0)));--co-background-200:var(--co-theme-background-200,var(--co-background-200-mix,oklch(94% 0 0)));--co-background-300:var(--co-theme-background-300,var(--co-background-300-mix,oklch(95% 0 0)));--co-background-400:var(--co-theme-background-400,var(--co-background-400-mix,oklch(96% 0 0)));--co-background-500:var(--co-theme-background-500,var(--co-background-500-mix,oklch(97% 0 0)));--co-background-600:var(--co-theme-background-600,var(--co-background-600-mix,oklch(98% 0 0)));--co-foreground:var(--co-foreground-base);--co-popover:var(--co-popover-base);--co-popover-foreground:var(--co-popover-foreground-base);--co-primary:var(--co-primary-base);--co-primary-foreground:var(--co-primary-foreground-base);--co-secondary:var(--co-secondary-base);--co-secondary-foreground:var(--co-secondary-foreground-base);--co-muted:var(--co-theme-muted,var(--co-muted-mix,oklch(97% 0 0)));--co-muted-foreground:var(--co-theme-muted-foreground,var(--co-muted-foreground-mix,oklch(55.6% 0 0)));--co-border:var(--co-border-base);--co-input:var(--co-input-base);--co-ring:var(--co-ring-base);--co-accent:var(--co-accent-base);--co-accent-foreground:var(--co-accent-foreground-base);--co-pink:var(--co-theme-pink,oklch(76.3% .152 354));--co-yellow:var(--co-theme-yellow,oklch(86.4% .144 99));--co-blue:var(--co-theme-blue,oklch(72.5% .132 241));--co-orange:var(--co-theme-orange,oklch(74.5% .166 50));--co-destructive:var(--co-theme-destructive,oklch(57.7% .245 27.325));--co-destructive-foreground:var(--co-theme-destructive-foreground,oklch(57.7% .245 27.325));--co-success:var(--co-theme-success,oklch(71.7% .18 142));--co-success-foreground:var(--co-theme-success-foreground,oklch(26.5% .052 142.7));--co-neutral:var(--co-theme-neutral,oklch(60.8% 0 0));--co-neutral-foreground:var(--co-theme-neutral-foreground,oklch(25.6% 0 0));--co-warning:var(--co-theme-warning,oklch(86.4% .144 99));--co-warning-foreground:var(--co-theme-warning-foreground,oklch(41.4% .071 99))}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-base:var(--co-theme-background,oklch(15.5% 0 0));--co-foreground-base:var(--co-theme-foreground,oklch(95% 0 0));--co-popover-base:var(--co-theme-popover,oklch(14.5% 0 0));--co-popover-foreground-base:var(--co-theme-popover-foreground,oklch(95% 0 0));--co-primary-base:var(--co-theme-primary,oklch(98.5% 0 0));--co-primary-foreground-base:var(--co-theme-primary-foreground,oklch(14.5% 0 0));--co-secondary-base:var(--co-theme-secondary,oklch(26.9% 0 0));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,oklch(95% 0 0));--co-border-base:var(--co-theme-border,oklch(26.9% 0 0));--co-input-base:var(--co-theme-input,oklch(26.9% 0 0));--co-ring-base:var(--co-theme-ring,var(--co-primary-base));--co-accent-base:var(--co-theme-accent,var(--co-primary-base));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--co-primary-foreground-base));--co-muted-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-mix:color-mix(in oklch,var(--co-background-base)55%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-foreground-mix:var(--co-foreground-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-foreground-mix:color-mix(in oklch,var(--co-foreground-base)65%,white)}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-50-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-50-mix:color-mix(in oklch,var(--co-background-base)98%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-100-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-100-mix:color-mix(in oklch,var(--co-background-base)96%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-200-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-200-mix:color-mix(in oklch,var(--co-background-base)94%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-300-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-300-mix:color-mix(in oklch,var(--co-background-base)92%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-400-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-400-mix:color-mix(in oklch,var(--co-background-base)90%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-500-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-500-mix:color-mix(in oklch,var(--co-background-base)88%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-600-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-600-mix:color-mix(in oklch,var(--co-background-base)86%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-pink:var(--co-theme-pink,oklch(84.2% .109 354));--co-yellow:var(--co-theme-yellow,oklch(90.3% .111 99));--co-blue:var(--co-theme-blue,oklch(79.8% .089 241));--co-orange:var(--co-theme-orange,oklch(68.2% .194 50));--co-destructive:var(--co-theme-destructive,oklch(39.6% .141 25.723));--co-destructive-foreground:var(--co-theme-destructive-foreground,oklch(63.7% .237 25.331));--co-success:var(--co-theme-success,oklch(60% .15 142));--co-success-foreground:var(--co-theme-success-foreground,oklch(85% .12 142));--co-neutral:var(--co-theme-neutral,oklch(50% 0 0));--co-neutral-foreground:var(--co-theme-neutral-foreground,oklch(85% 0 0));--co-warning:var(--co-theme-warning,oklch(90.3% .111 99));--co-warning-foreground:var(--co-theme-warning-foreground,oklch(85% .1 99))}}@layer utilities{@keyframes co-bounce-dot{0%,80%,to{transform:translateY(0)}40%{transform:translateY(-6px)}}.cossistant .co-scrollbar-thin{scrollbar-width:thin;scrollbar-color:oklch(from var(--co-primary)l c h/.3)transparent}.cossistant .co-scrollbar-thin::-webkit-scrollbar{width:8px;height:8px}.cossistant .co-scrollbar-thin::-webkit-scrollbar-track{background:0 0}.cossistant .co-scrollbar-thin::-webkit-scrollbar-thumb{background-color:oklch(from var(--co-primary)l c h/.3);border-radius:4px}.cossistant .co-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:oklch(from var(--co-primary)l c h/.5)}.cossistant .animation-delay-0{animation-delay:0s}.cossistant .animation-delay-200{animation-delay:.2s}.cossistant .animation-delay-400{animation-delay:.4s}.cossistant .dot-bounce-1{animation:1.4s infinite co-bounce-dot}.cossistant .dot-bounce-2{animation:1.4s .16s infinite co-bounce-dot}.cossistant .dot-bounce-3{animation:1.4s .32s infinite co-bounce-dot}}
|
|
@@ -42,7 +42,7 @@ function Avatar({ className, image, name, isAI = false, showBackground = true, c
|
|
|
42
42
|
}), /* @__PURE__ */ jsx(AvatarFallback, {
|
|
43
43
|
className: "size-full",
|
|
44
44
|
children: /* @__PURE__ */ jsx(Facehash, {
|
|
45
|
-
className: "size-full",
|
|
45
|
+
className: "size-full text-black",
|
|
46
46
|
colorClasses,
|
|
47
47
|
interactive: false,
|
|
48
48
|
name,
|
|
@@ -55,13 +55,13 @@ function Avatar({ className, image, name, isAI = false, showBackground = true, c
|
|
|
55
55
|
className: cn("relative", className),
|
|
56
56
|
children: [/* @__PURE__ */ jsxs(Avatar$1, {
|
|
57
57
|
className: cn("flex size-full items-center justify-center overflow-clip rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500"),
|
|
58
|
-
children: [image && /* @__PURE__ */ jsx(AvatarImage, {
|
|
58
|
+
children: [image && image.trim() !== "" && /* @__PURE__ */ jsx(AvatarImage, {
|
|
59
59
|
alt: name,
|
|
60
60
|
src: image
|
|
61
61
|
}), /* @__PURE__ */ jsx(AvatarFallback, {
|
|
62
62
|
className: "size-full",
|
|
63
63
|
children: /* @__PURE__ */ jsx(Facehash, {
|
|
64
|
-
className: "size-full",
|
|
64
|
+
className: "size-full text-black",
|
|
65
65
|
colorClasses,
|
|
66
66
|
interactive: false,
|
|
67
67
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.js","names":["AvatarPrimitive"],"sources":["../../../src/support/components/avatar.tsx"],"sourcesContent":["import { Facehash } from \"facehash\";\nimport type { ReactElement } from \"react\";\n\nimport {\n\tAvatarFallback,\n\tAvatarImage,\n\tAvatar as AvatarPrimitive,\n} from \"../../primitives/avatar\";\nimport { cn } from \"../utils\";\nimport { CossistantLogo } from \"./cossistant-branding\";\nimport { getAgentStatus, OnlineIndicator } from \"./online-indicator\";\n\n/**\n * Default Cossistant theme colors for avatar fallbacks.\n * These use the Tailwind classes defined in support.css.\n */\nconst DEFAULT_AVATAR_COLORS = [\n\t\"bg-co-pink\",\n\t\"bg-co-blue\",\n\t\"bg-co-yellow\",\n\t\"bg-co-orange\",\n];\n\ntype AvatarProps = {\n\tclassName?: string;\n\timage?: string | null;\n\tname: string;\n\t/** Whether this avatar is for an AI agent */\n\tisAI?: boolean;\n\t/** Whether to show the background circle (default: true) */\n\tshowBackground?: boolean;\n\t/**\n\t * Tailwind class array for Facehash background colors.\n\t * Defaults to Cossistant theme colors (pink, blue, yellow, orange).\n\t * @example [\"bg-pink-500\", \"bg-blue-500\", \"bg-green-500\"]\n\t */\n\tcolorClasses?: string[];\n\t/**\n\t * Last seen timestamp for the agent. When provided, shows a status indicator:\n\t * - Green (online): seen within last 15 minutes\n\t * - Orange (away): seen within last hour\n\t * Only shown for non-AI agents.\n\t */\n\tlastSeenAt?: string | null;\n\t/**\n\t * Size of the online indicator in pixels.\n\t * Defaults to 6px.\n\t */\n\tindicatorSize?: number;\n};\n\n/**\n * Renders a squared avatar with graceful fallbacks using Facehash when no\n * image is available. Features rounded corners and a subtle ring border.\n *\n * For AI agents without an image, displays the Cossistant logo without\n * a background.\n */\nexport function Avatar({\n\tclassName,\n\timage,\n\tname,\n\tisAI = false,\n\tshowBackground = true,\n\tcolorClasses = DEFAULT_AVATAR_COLORS,\n\tlastSeenAt,\n\tindicatorSize = 6,\n}: AvatarProps): ReactElement {\n\tconst agentStatus = isAI ? \"offline\" : getAgentStatus(lastSeenAt);\n\n\t// AI agent without image: show just the logo (no avatar wrapper)\n\t// Unless showBackground is true (e.g. in avatar stack), then wrap in a box\n\tif (isAI && !image) {\n\t\tif (showBackground) {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500\",\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<CossistantLogo className=\"h-1/2 w-1/2\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\treturn <CossistantLogo className={cn(\"h-full w-full\", className)} />;\n\t}\n\n\t// AI agent with image: show image in a square\n\tif (isAI && image) {\n\t\treturn (\n\t\t\t<AvatarPrimitive\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex size-9 items-center justify-center overflow-clip rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<AvatarImage alt={name} src={image} />\n\t\t\t\t<AvatarFallback className=\"size-full\">\n\t\t\t\t\t<Facehash\n\t\t\t\t\t\tclassName=\"size-full\"\n\t\t\t\t\t\tcolorClasses={colorClasses}\n\t\t\t\t\t\tinteractive={false}\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tshowInitial={false}\n\t\t\t\t\t\tsize=\"100%\"\n\t\t\t\t\t/>\n\t\t\t\t</AvatarFallback>\n\t\t\t</AvatarPrimitive>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<AvatarPrimitive\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex size-full items-center justify-center overflow-clip rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500\"\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{image && <AvatarImage alt={name} src={image} />}\n\t\t\t\t<AvatarFallback className=\"size-full\">\n\t\t\t\t\t<Facehash\n\t\t\t\t\t\tclassName=\"size-full\"\n\t\t\t\t\t\tcolorClasses={colorClasses}\n\t\t\t\t\t\tinteractive={false}\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tshowInitial={false}\n\t\t\t\t\t\tsize=\"100%\"\n\t\t\t\t\t/>\n\t\t\t\t</AvatarFallback>\n\t\t\t</AvatarPrimitive>\n\t\t\t<OnlineIndicator\n\t\t\t\tclassName=\"-bottom-0.5 -right-0.5 z-10\"\n\t\t\t\tsize={indicatorSize}\n\t\t\t\tstatus={agentStatus}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,MAAM,wBAAwB;CAC7B;CACA;CACA;CACA;CACA;;;;;;;;AAqCD,SAAgB,OAAO,EACtB,WACA,OACA,MACA,OAAO,OACP,iBAAiB,MACjB,eAAe,uBACf,YACA,gBAAgB,KACa;CAC7B,MAAM,cAAc,OAAO,YAAY,eAAe,WAAW;AAIjE,KAAI,QAAQ,CAAC,OAAO;AACnB,MAAI,eACH,QACC,oBAAC;GACA,WAAW,GACV,oHACA,UACA;aAED,oBAAC,kBAAe,WAAU,gBAAgB;IACrC;AAGR,SAAO,oBAAC,kBAAe,WAAW,GAAG,iBAAiB,UAAU,GAAI;;AAIrE,KAAI,QAAQ,MACX,QACC,qBAACA;EACA,WAAW,GACV,yIACA,UACA;aAED,oBAAC;GAAY,KAAK;GAAM,KAAK;IAAS,EACtC,oBAAC;GAAe,WAAU;aACzB,oBAAC;IACA,WAAU;IACI;IACd,aAAa;IACP;IACN,aAAa;IACb,MAAK;KACJ;IACc;GACA;AAIpB,QACC,qBAAC;EAAI,WAAW,GAAG,YAAY,UAAU;aACxC,qBAACA;GACA,WAAW,GACV,2IACA;cAEA,SAAS,oBAAC;IAAY,KAAK;IAAM,KAAK;KAAS,
|
|
1
|
+
{"version":3,"file":"avatar.js","names":["AvatarPrimitive"],"sources":["../../../src/support/components/avatar.tsx"],"sourcesContent":["import { Facehash } from \"facehash\";\nimport type { ReactElement } from \"react\";\n\nimport {\n\tAvatarFallback,\n\tAvatarImage,\n\tAvatar as AvatarPrimitive,\n} from \"../../primitives/avatar\";\nimport { cn } from \"../utils\";\nimport { CossistantLogo } from \"./cossistant-branding\";\nimport { getAgentStatus, OnlineIndicator } from \"./online-indicator\";\n\n/**\n * Default Cossistant theme colors for avatar fallbacks.\n * These use the Tailwind classes defined in support.css.\n */\nconst DEFAULT_AVATAR_COLORS = [\n\t\"bg-co-pink\",\n\t\"bg-co-blue\",\n\t\"bg-co-yellow\",\n\t\"bg-co-orange\",\n];\n\ntype AvatarProps = {\n\tclassName?: string;\n\timage?: string | null;\n\tname: string;\n\t/** Whether this avatar is for an AI agent */\n\tisAI?: boolean;\n\t/** Whether to show the background circle (default: true) */\n\tshowBackground?: boolean;\n\t/**\n\t * Tailwind class array for Facehash background colors.\n\t * Defaults to Cossistant theme colors (pink, blue, yellow, orange).\n\t * @example [\"bg-pink-500\", \"bg-blue-500\", \"bg-green-500\"]\n\t */\n\tcolorClasses?: string[];\n\t/**\n\t * Last seen timestamp for the agent. When provided, shows a status indicator:\n\t * - Green (online): seen within last 15 minutes\n\t * - Orange (away): seen within last hour\n\t * Only shown for non-AI agents.\n\t */\n\tlastSeenAt?: string | null;\n\t/**\n\t * Size of the online indicator in pixels.\n\t * Defaults to 6px.\n\t */\n\tindicatorSize?: number;\n};\n\n/**\n * Renders a squared avatar with graceful fallbacks using Facehash when no\n * image is available. Features rounded corners and a subtle ring border.\n *\n * For AI agents without an image, displays the Cossistant logo without\n * a background.\n */\nexport function Avatar({\n\tclassName,\n\timage,\n\tname,\n\tisAI = false,\n\tshowBackground = true,\n\tcolorClasses = DEFAULT_AVATAR_COLORS,\n\tlastSeenAt,\n\tindicatorSize = 6,\n}: AvatarProps): ReactElement {\n\tconst agentStatus = isAI ? \"offline\" : getAgentStatus(lastSeenAt);\n\n\t// AI agent without image: show just the logo (no avatar wrapper)\n\t// Unless showBackground is true (e.g. in avatar stack), then wrap in a box\n\tif (isAI && !image) {\n\t\tif (showBackground) {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500\",\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<CossistantLogo className=\"h-1/2 w-1/2\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\treturn <CossistantLogo className={cn(\"h-full w-full\", className)} />;\n\t}\n\n\t// AI agent with image: show image in a square\n\tif (isAI && image) {\n\t\treturn (\n\t\t\t<AvatarPrimitive\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex size-9 items-center justify-center overflow-clip rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<AvatarImage alt={name} src={image} />\n\t\t\t\t<AvatarFallback className=\"size-full\">\n\t\t\t\t\t<Facehash\n\t\t\t\t\t\tclassName=\"size-full text-black\"\n\t\t\t\t\t\tcolorClasses={colorClasses}\n\t\t\t\t\t\tinteractive={false}\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tshowInitial={false}\n\t\t\t\t\t\tsize=\"100%\"\n\t\t\t\t\t/>\n\t\t\t\t</AvatarFallback>\n\t\t\t</AvatarPrimitive>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<AvatarPrimitive\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex size-full items-center justify-center overflow-clip rounded bg-co-background-200 ring-1 ring-co-border/30 dark:bg-co-background-500\"\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{image && image.trim() !== \"\" && <AvatarImage alt={name} src={image} />}\n\t\t\t\t<AvatarFallback className=\"size-full\">\n\t\t\t\t\t<Facehash\n\t\t\t\t\t\tclassName=\"size-full text-black\"\n\t\t\t\t\t\tcolorClasses={colorClasses}\n\t\t\t\t\t\tinteractive={false}\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tshowInitial={false}\n\t\t\t\t\t\tsize=\"100%\"\n\t\t\t\t\t/>\n\t\t\t\t</AvatarFallback>\n\t\t\t</AvatarPrimitive>\n\t\t\t<OnlineIndicator\n\t\t\t\tclassName=\"-bottom-0.5 -right-0.5 z-10\"\n\t\t\t\tsize={indicatorSize}\n\t\t\t\tstatus={agentStatus}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,MAAM,wBAAwB;CAC7B;CACA;CACA;CACA;CACA;;;;;;;;AAqCD,SAAgB,OAAO,EACtB,WACA,OACA,MACA,OAAO,OACP,iBAAiB,MACjB,eAAe,uBACf,YACA,gBAAgB,KACa;CAC7B,MAAM,cAAc,OAAO,YAAY,eAAe,WAAW;AAIjE,KAAI,QAAQ,CAAC,OAAO;AACnB,MAAI,eACH,QACC,oBAAC;GACA,WAAW,GACV,oHACA,UACA;aAED,oBAAC,kBAAe,WAAU,gBAAgB;IACrC;AAGR,SAAO,oBAAC,kBAAe,WAAW,GAAG,iBAAiB,UAAU,GAAI;;AAIrE,KAAI,QAAQ,MACX,QACC,qBAACA;EACA,WAAW,GACV,yIACA,UACA;aAED,oBAAC;GAAY,KAAK;GAAM,KAAK;IAAS,EACtC,oBAAC;GAAe,WAAU;aACzB,oBAAC;IACA,WAAU;IACI;IACd,aAAa;IACP;IACN,aAAa;IACb,MAAK;KACJ;IACc;GACA;AAIpB,QACC,qBAAC;EAAI,WAAW,GAAG,YAAY,UAAU;aACxC,qBAACA;GACA,WAAW,GACV,2IACA;cAEA,SAAS,MAAM,MAAM,KAAK,MAAM,oBAAC;IAAY,KAAK;IAAM,KAAK;KAAS,EACvE,oBAAC;IAAe,WAAU;cACzB,oBAAC;KACA,WAAU;KACI;KACd,aAAa;KACP;KACN,aAAa;KACb,MAAK;MACJ;KACc;IACA,EAClB,oBAAC;GACA,WAAU;GACV,MAAM;GACN,QAAQ;IACP;GACG"}
|
|
@@ -4,8 +4,8 @@ import * as class_variance_authority_dist_types0 from "class-variance-authority/
|
|
|
4
4
|
|
|
5
5
|
//#region src/support/components/button.d.ts
|
|
6
6
|
declare const coButtonVariants: (props?: ({
|
|
7
|
-
variant?: "
|
|
8
|
-
size?: "default" | "large" | "icon" | null | undefined;
|
|
7
|
+
variant?: "tab" | "default" | "secondary" | "ghost" | "outline" | "tab-selected" | null | undefined;
|
|
8
|
+
size?: "small" | "default" | "large" | "icon" | null | undefined;
|
|
9
9
|
} & class_variance_authority_dist_types0.ClassProp) | undefined) => string;
|
|
10
10
|
type CossistantButtonProps = React$1.ComponentProps<"button"> & {
|
|
11
11
|
asChild?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","names":[],"sources":["../../../src/support/components/button.tsx"],"sourcesContent":[],"mappings":";;;;;cAKa,
|
|
1
|
+
{"version":3,"file":"button.d.ts","names":[],"sources":["../../../src/support/components/button.tsx"],"sourcesContent":[],"mappings":";;;;;cAKa,wBA6BZ;;;AA7BD,CAAA,GA6BC,oCAAA,CAAA,SAAA,CAAA,GAAA,SAAA,EAAA,GAAA,MAAA;AAEW,KAAA,qBAAA,GAAwB,OAAA,CAAM,cAAT,CAAA,QAAA,CAAA,GAAA;EAAG,OAAM,CAAA,EAAA,OAAA;CAElB,GAApB,YAAoB,CAAA,OAAA,gBAAA,CAAA;;;AAMxB;;AAEC,iBAFe,QAAA,CAEf;EAAA,SAAA;EAAA,OAAA;EAAA,IAAA;EAAA,GAAA;AAAA,CAAA,EAGE,qBAHF,CAAA,EAG0B,OAAA,CAAM,YAHhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","names":["ButtonPrimitive"],"sources":["../../../src/support/components/button.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { Button as ButtonPrimitive } from \"../../primitives/button\";\nimport { cn } from \"../utils\";\n\nexport const coButtonVariants = cva(\n\t\"group/btn inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded border font-medium text-sm outline-none transition-all hover:cursor-pointer focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"bg-co-primary text-co-primary-foreground hover:bg-co-primary/90\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"border-co-border bg-co-background-50/50 text-co-primary hover:bg-co-background-100 hover:text-co-foreground dark:bg-co-background-300 dark:hover:bg-co-background-400\",\n\t\t\t\tghost:\n\t\t\t\t\t\"border-transparent text-co-primary hover:bg-co-background-200 hover:text-co-foreground dark:hover:bg-co-background-300\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-co-border bg-co-background text-co-primary hover:bg-co-background-100 dark:bg-co-background-200 dark:hover:bg-co-background-300\",\n\t\t\t\ttab: \"opacity-40 hover:bg-co-background-100 hover:text-co-foreground hover:opacity-90 dark:hover:bg-co-background-200\",\n\t\t\t\t\"tab-selected\":\n\t\t\t\t\t\"hover:bg-co-background-100 hover:text-co-foreground dark:hover:bg-co-background-200\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-8 px-4 py-2 has-[>svg]:px-3\",\n\t\t\t\tlarge: \"h-14 px-6 has-[>svg]:px-4\",\n\t\t\t\ticon: \"size-6\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t}\n);\n\nexport type CossistantButtonProps = React.ComponentProps<\"button\"> & {\n\tasChild?: boolean;\n} & VariantProps<typeof coButtonVariants>;\n\n/**\n * Styled button primitive that forwards variant and size props to the shared\n * design tokens.\n */\nexport function CoButton({\n\tclassName,\n\tvariant,\n\tsize,\n\t...props\n}: CossistantButtonProps): React.ReactElement {\n\treturn (\n\t\t<ButtonPrimitive\n\t\t\tclassName={cn(coButtonVariants({ variant, size, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;;;AAKA,MAAa,mBAAmB,IAC/B,keACA;CACC,UAAU;EACT,SAAS;GACR,SACC;GACD,WACC;GACD,OACC;GACD,SACC;GACD,KAAK;GACL,gBACC;GACD;EACD,MAAM;GACL,SAAS;GACT,OAAO;GACP,MAAM;GACN;EACD;CACD,iBAAiB;EAChB,SAAS;EACT,MAAM;EACN;CACD,CACD;;;;;AAUD,SAAgB,SAAS,EACxB,WACA,SACA,MACA,GAAG,SAC0C;AAC7C,QACC,oBAACA;EACA,WAAW,GAAG,iBAAiB;GAAE;GAAS;GAAM;GAAW,CAAC,CAAC;EAC7D,GAAI;GACH"}
|
|
1
|
+
{"version":3,"file":"button.js","names":["ButtonPrimitive"],"sources":["../../../src/support/components/button.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { Button as ButtonPrimitive } from \"../../primitives/button\";\nimport { cn } from \"../utils\";\n\nexport const coButtonVariants = cva(\n\t\"group/btn inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded border font-medium text-sm outline-none transition-all hover:cursor-pointer focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"bg-co-primary text-co-primary-foreground hover:bg-co-primary/90\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"border-co-border bg-co-background-50/50 text-co-primary hover:bg-co-background-100 hover:text-co-foreground dark:bg-co-background-300 dark:hover:bg-co-background-400\",\n\t\t\t\tghost:\n\t\t\t\t\t\"border-transparent text-co-primary hover:bg-co-background-200 hover:text-co-foreground dark:hover:bg-co-background-300\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-co-border bg-co-background text-co-primary hover:bg-co-background-100 dark:bg-co-background-200 dark:hover:bg-co-background-300\",\n\t\t\t\ttab: \"opacity-40 hover:bg-co-background-100 hover:text-co-foreground hover:opacity-90 dark:hover:bg-co-background-200\",\n\t\t\t\t\"tab-selected\":\n\t\t\t\t\t\"hover:bg-co-background-100 hover:text-co-foreground dark:hover:bg-co-background-200\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-8 px-4 py-2 has-[>svg]:px-3\",\n\t\t\t\tlarge: \"h-14 px-6 has-[>svg]:px-4\",\n\t\t\t\tsmall: \"h-6 px-1 text-xs has-[>svg]:px-1.5\",\n\t\t\t\ticon: \"size-6\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t}\n);\n\nexport type CossistantButtonProps = React.ComponentProps<\"button\"> & {\n\tasChild?: boolean;\n} & VariantProps<typeof coButtonVariants>;\n\n/**\n * Styled button primitive that forwards variant and size props to the shared\n * design tokens.\n */\nexport function CoButton({\n\tclassName,\n\tvariant,\n\tsize,\n\t...props\n}: CossistantButtonProps): React.ReactElement {\n\treturn (\n\t\t<ButtonPrimitive\n\t\t\tclassName={cn(coButtonVariants({ variant, size, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;;;AAKA,MAAa,mBAAmB,IAC/B,keACA;CACC,UAAU;EACT,SAAS;GACR,SACC;GACD,WACC;GACD,OACC;GACD,SACC;GACD,KAAK;GACL,gBACC;GACD;EACD,MAAM;GACL,SAAS;GACT,OAAO;GACP,OAAO;GACP,MAAM;GACN;EACD;CACD,iBAAiB;EAChB,SAAS;EACT,MAAM;EACN;CACD,CACD;;;;;AAUD,SAAgB,SAAS,EACxB,WACA,SACA,MACA,GAAG,SAC0C;AAC7C,QACC,oBAACA;EACA,WAAW,GAAG,iBAAiB;GAAE;GAAS;GAAM;GAAW,CAAC,CAAC;EAC7D,GAAI;GACH"}
|
|
@@ -7,6 +7,9 @@ type ConversationEventProps = {
|
|
|
7
7
|
availableAIAgents: AvailableAIAgent[];
|
|
8
8
|
availableHumanAgents: AvailableHumanAgent[];
|
|
9
9
|
createdAt?: string;
|
|
10
|
+
compact?: boolean;
|
|
11
|
+
showAvatar?: boolean;
|
|
12
|
+
className?: string;
|
|
10
13
|
};
|
|
11
14
|
declare const ConversationEvent: React.FC<ConversationEventProps>;
|
|
12
15
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-event.d.ts","names":[],"sources":["../../../src/support/components/conversation-event.tsx"],"sourcesContent":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"conversation-event.d.ts","names":[],"sources":["../../../src/support/components/conversation-event.tsx"],"sourcesContent":[],"mappings":";;;;KAWY,sBAAA;SACJ;EADI,iBAAA,EAEQ,gBAFc,EAAA;EAC1B,oBAAA,EAEe,mBAFf,EAAA;EACY,SAAA,CAAA,EAAA,MAAA;EACG,OAAA,CAAA,EAAA,OAAA;EAAmB,UAAA,CAAA,EAAA,OAAA;EAO7B,SAAA,CAAA,EAAA,MAAA;;cAAA,mBAAmB,KAAA,CAAM,GAAG"}
|