@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.
Files changed (145) hide show
  1. package/README.md +3 -3
  2. package/hooks/index.d.ts +2 -2
  3. package/hooks/index.js +2 -2
  4. package/hooks/private/store/use-store-selector.d.ts.map +1 -1
  5. package/hooks/private/store/use-store-selector.js +8 -4
  6. package/hooks/private/store/use-store-selector.js.map +1 -1
  7. package/hooks/private/use-client-query.js +5 -2
  8. package/hooks/private/use-client-query.js.map +1 -1
  9. package/hooks/private/use-grouped-messages.d.ts +27 -2
  10. package/hooks/private/use-grouped-messages.d.ts.map +1 -1
  11. package/hooks/private/use-grouped-messages.js +154 -106
  12. package/hooks/private/use-grouped-messages.js.map +1 -1
  13. package/hooks/private/use-rest-client.js +2 -1
  14. package/hooks/private/use-rest-client.js.map +1 -1
  15. package/hooks/use-conversation-auto-seen.d.ts.map +1 -1
  16. package/hooks/use-conversation-auto-seen.js +9 -3
  17. package/hooks/use-conversation-auto-seen.js.map +1 -1
  18. package/hooks/use-conversation-page.d.ts.map +1 -1
  19. package/hooks/use-conversation-page.js +13 -3
  20. package/hooks/use-conversation-page.js.map +1 -1
  21. package/hooks/use-new-message-sound.d.ts.map +1 -1
  22. package/hooks/use-new-message-sound.js +2 -2
  23. package/hooks/use-new-message-sound.js.map +1 -1
  24. package/hooks/use-typing-sound.d.ts.map +1 -1
  25. package/hooks/use-typing-sound.js +2 -2
  26. package/hooks/use-typing-sound.js.map +1 -1
  27. package/index.d.ts +3 -3
  28. package/index.js +3 -3
  29. package/package.json +6 -12
  30. package/packages/tiny-markdown/src/context/index.d.ts +1 -0
  31. package/packages/tiny-markdown/src/context/tiny-markdown-context.d.ts +3 -0
  32. package/packages/tiny-markdown/src/hooks/index.d.ts +4 -0
  33. package/packages/tiny-markdown/src/hooks/use-caret-position.d.ts +1 -0
  34. package/packages/tiny-markdown/src/hooks/use-tiny-markdown.d.ts +1 -0
  35. package/packages/tiny-markdown/src/hooks/use-tiny-mention.d.ts +1 -0
  36. package/packages/tiny-markdown/src/hooks/use-tiny-shortcuts.d.ts +1 -0
  37. package/packages/tiny-markdown/src/index.d.ts +4 -0
  38. package/packages/tiny-markdown/src/types.d.ts +75 -0
  39. package/packages/tiny-markdown/src/types.d.ts.map +1 -0
  40. package/packages/tiny-markdown/src/utils/index.d.ts +3 -0
  41. package/packages/tiny-markdown/src/utils/markdown-parser.d.ts +1 -0
  42. package/packages/tiny-markdown/src/utils/mention-parser.d.ts +1 -0
  43. package/packages/tiny-markdown/src/utils/merge-refs.d.ts +1 -0
  44. package/packages/types/src/api/conversation.d.ts +300 -0
  45. package/packages/types/src/api/conversation.d.ts.map +1 -1
  46. package/packages/types/src/api/timeline-item.d.ts +225 -0
  47. package/packages/types/src/api/timeline-item.d.ts.map +1 -1
  48. package/packages/types/src/realtime-events.d.ts +228 -3
  49. package/packages/types/src/realtime-events.d.ts.map +1 -1
  50. package/packages/types/src/schemas.d.ts +75 -0
  51. package/packages/types/src/schemas.d.ts.map +1 -1
  52. package/primitives/avatar/image.d.ts +1 -1
  53. package/primitives/command-block-utils.d.ts +26 -0
  54. package/primitives/command-block-utils.d.ts.map +1 -0
  55. package/primitives/command-block-utils.js +310 -0
  56. package/primitives/command-block-utils.js.map +1 -0
  57. package/primitives/index.d.ts +7 -3
  58. package/primitives/index.js +11 -2
  59. package/primitives/index.parts.d.ts +6 -2
  60. package/primitives/index.parts.js +5 -1
  61. package/primitives/timeline-code-block.d.ts +32 -0
  62. package/primitives/timeline-code-block.d.ts.map +1 -0
  63. package/primitives/timeline-code-block.js +66 -0
  64. package/primitives/timeline-code-block.js.map +1 -0
  65. package/primitives/timeline-command-block.d.ts +29 -0
  66. package/primitives/timeline-command-block.d.ts.map +1 -0
  67. package/primitives/timeline-command-block.js +97 -0
  68. package/primitives/timeline-command-block.js.map +1 -0
  69. package/primitives/timeline-item-group.d.ts.map +1 -1
  70. package/primitives/timeline-item-group.js +5 -15
  71. package/primitives/timeline-item-group.js.map +1 -1
  72. package/primitives/timeline-item.d.ts +21 -1
  73. package/primitives/timeline-item.d.ts.map +1 -1
  74. package/primitives/timeline-item.js +148 -83
  75. package/primitives/timeline-item.js.map +1 -1
  76. package/primitives/timeline-message-layout.d.ts +9 -0
  77. package/primitives/timeline-message-layout.d.ts.map +1 -0
  78. package/primitives/timeline-message-layout.js +20 -0
  79. package/primitives/timeline-message-layout.js.map +1 -0
  80. package/provider.d.ts.map +1 -1
  81. package/provider.js +1 -7
  82. package/provider.js.map +1 -1
  83. package/realtime/event-filter.js +4 -3
  84. package/realtime/event-filter.js.map +1 -1
  85. package/realtime/provider.d.ts +0 -1
  86. package/realtime/provider.d.ts.map +1 -1
  87. package/realtime/provider.js +29 -34
  88. package/realtime/provider.js.map +1 -1
  89. package/sounds/sound-data.d.ts +6 -0
  90. package/sounds/sound-data.d.ts.map +1 -0
  91. package/sounds/sound-data.js +7 -0
  92. package/sounds/sound-data.js.map +1 -0
  93. package/styles.css +2 -0
  94. package/support/components/avatar.js +3 -3
  95. package/support/components/avatar.js.map +1 -1
  96. package/support/components/button.d.ts +2 -2
  97. package/support/components/button.d.ts.map +1 -1
  98. package/support/components/button.js +1 -0
  99. package/support/components/button.js.map +1 -1
  100. package/support/components/conversation-event.d.ts +3 -0
  101. package/support/components/conversation-event.d.ts.map +1 -1
  102. package/support/components/conversation-event.js +47 -16
  103. package/support/components/conversation-event.js.map +1 -1
  104. package/support/components/conversation-timeline.d.ts.map +1 -1
  105. package/support/components/conversation-timeline.js +12 -0
  106. package/support/components/conversation-timeline.js.map +1 -1
  107. package/support/components/index.d.ts +2 -1
  108. package/support/components/index.js +2 -1
  109. package/support/components/timeline-activity-group.d.ts +25 -0
  110. package/support/components/timeline-activity-group.d.ts.map +1 -0
  111. package/support/components/timeline-activity-group.js +104 -0
  112. package/support/components/timeline-activity-group.js.map +1 -0
  113. package/support/components/timeline-code-block.d.ts +14 -0
  114. package/support/components/timeline-code-block.d.ts.map +1 -0
  115. package/support/components/timeline-code-block.js +44 -0
  116. package/support/components/timeline-code-block.js.map +1 -0
  117. package/support/components/timeline-command-block.d.ts +12 -0
  118. package/support/components/timeline-command-block.d.ts.map +1 -0
  119. package/support/components/timeline-command-block.js +42 -0
  120. package/support/components/timeline-command-block.js.map +1 -0
  121. package/support/components/timeline-message-item.d.ts +2 -1
  122. package/support/components/timeline-message-item.d.ts.map +1 -1
  123. package/support/components/timeline-message-item.js +23 -3
  124. package/support/components/timeline-message-item.js.map +1 -1
  125. package/support/pages/home.js +1 -1
  126. package/support/pages/home.js.map +1 -1
  127. package/support/store/support-store.d.ts.map +1 -1
  128. package/support/store/support-store.js +4 -4
  129. package/support/store/support-store.js.map +1 -1
  130. package/support/{support-DmViRaga.css → support-Dc5L__HC.css} +15 -15
  131. package/support/{support-DmViRaga.css.map → support-Dc5L__HC.css.map} +1 -1
  132. package/{tailwind.css → support/support.css} +14 -14
  133. package/support-config.d.ts +31 -4
  134. package/support-config.d.ts.map +1 -1
  135. package/support-config.js +52 -4
  136. package/support-config.js.map +1 -1
  137. package/support.css +1 -2
  138. package/utils/metadata-hash.d.ts +1 -1
  139. package/utils/metadata-hash.js +9 -4
  140. package/utils/metadata-hash.js.map +1 -1
  141. package/utils/timeline-item-sender.d.ts +17 -0
  142. package/utils/timeline-item-sender.d.ts.map +1 -0
  143. package/utils/timeline-item-sender.js +43 -0
  144. package/utils/timeline-item-sender.js.map +1 -0
  145. package/utils/use-render-element.d.ts.map +1 -1
@@ -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 normalized = (process.env.NEXT_PUBLIC_COSSISTANT_API_KEY || process.env.COSSISTANT_API_KEY || null)?.trim();
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,
@@ -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":";;;;;;;;AAoBA,MAAM,gCAAgC;AACtC,MAAM,+BAA+B;AAsFrC,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;CAUR,MAAM,cAJL,QAAQ,IAAI,kCACZ,QAAQ,IAAI,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,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;;;;;;;AAQT,SAAS,yBAAyB,EACjC,UACA,QAAQ,gBACR,MACA,aACA,WACA,cACA,WAC6C;CAC7C,MAAM,iBAAiB,cAAc,KAAK;CAE1C,MAAM,YAAY,eAAe,OAAO,eAAe;CACvD,MAAM,mBAAmB,uBAA8B,IAAI,KAAK,CAAC;CACjE,MAAM,mBAAmB,OAAe,EAAE;CAC1C,MAAM,eAAe,OAAO,MAAM;CAClC,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;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;;;;;;AAQ7B,SAAgB,iBAAiB,EAChC,UACA,QAAQ,gBACR,MACA,cAAc,MACd,WACA,cACA,WAC6C;CAC7C,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;AAEjD,iBAAgB;AACf,eAAa,KAAK;IAChB,EAAE,CAAC;CAEN,MAAM,iBAAiB,cAAc,KAAK;CAG1C,MAAM,eAAe,eACb;EACN,aAAa;EACb,cAAc;EACd,OAAO;EACP,YAAY;AACX,SAAM,IAAI,MAAM,kDAAkD;;EAEnE,eAAe;AACd,SAAM,IAAI,MAAM,kDAAkD;;EAEnE,uBAAuB;EACvB,WAAW;EACX,cAAc;EACd,iBAAiB;EACjB,WAAW,gBAAgB,aAAa;EACxC,WAAW,gBAAgB,aAAa;EACxC,QAAQ,gBAAgB,UAAU;EAClC,GACD;EACC,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,CACD;AAGD,KAAI,CAAC,UACJ,QACC,oBAAC,gBAAgB;EAAS,OAAO;EAC/B;GACyB;AAK7B,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"}
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+gAFgICAAhKQBoCAgAECAAAAD3NidGQAAAAASTE2AAAAGHN0dHMAAAAAAAAAAQAAAAkAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAJAAAAAQAAADhzdHN6AAAAAAAAAAAAAAAJAAAABgAAAFYAAAG6AAABKgAAAQsAAACxAAAAewAAAKQAAABMAAAAFHN0Y28AAAAAAAAAAQAAEAAAAAD6dWR0YQAAAPJtZXRhAAAAAAAAACJoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAADEaWxzdAAAALwtLS0tAAAAHG1lYW4AAAAAY29tLmFwcGxlLmlUdW5lcwAAABRuYW1lAAAAAGlUdW5TTVBCAAAAhGRhdGEAAAABAAAAACAwMDAwMDAwMCAwMDAwMDg0MCAwMDAwMDFEMiAwMDAwMDAwMDAwMDAxOUVFIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwAAAMhmZyZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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\";\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,EAChD,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"}
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?: "default" | "tab" | "secondary" | "ghost" | "outline" | "tab-selected" | null | undefined;
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,wBA4BZ;;;AA5BD,CAAA,GA4BC,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
+ {"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"}
@@ -17,6 +17,7 @@ const coButtonVariants = cva("group/btn inline-flex shrink-0 items-center justif
17
17
  size: {
18
18
  default: "h-8 px-4 py-2 has-[>svg]:px-3",
19
19
  large: "h-14 px-6 has-[>svg]:px-4",
20
+ small: "h-6 px-1 text-xs has-[>svg]:px-1.5",
20
21
  icon: "size-6"
21
22
  }
22
23
  },
@@ -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":";;;;KAUY,sBAAA;SACJ;EADI,iBAAA,EAEQ,gBAFc,EAAA;EAC1B,oBAAA,EAEe,mBAFf,EAAA;EACY,SAAA,CAAA,EAAA,MAAA;CACG;AAAmB,cAI7B,iBAJ6B,EAIV,KAAA,CAAM,EAJI,CAID,sBAJC,CAAA"}
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"}