@copilotz/chat-ui 0.4.0 → 0.5.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 (166) hide show
  1. package/README.md +42 -32
  2. package/dist/components/chat/AgentSelectors.d.ts +50 -0
  3. package/dist/components/chat/AgentSelectors.d.ts.map +1 -0
  4. package/dist/components/chat/AgentSelectors.js +67 -0
  5. package/dist/components/chat/AgentSelectors.js.map +1 -0
  6. package/dist/components/chat/AssistantActivity.d.ts +11 -0
  7. package/dist/components/chat/AssistantActivity.d.ts.map +1 -0
  8. package/dist/components/chat/AssistantActivity.js +82 -0
  9. package/dist/components/chat/AssistantActivity.js.map +1 -0
  10. package/dist/components/chat/ChatHeader.d.ts +56 -0
  11. package/dist/components/chat/ChatHeader.d.ts.map +1 -0
  12. package/dist/components/chat/ChatHeader.js +71 -0
  13. package/dist/components/chat/ChatHeader.js.map +1 -0
  14. package/dist/components/chat/ChatInput.d.ts +25 -0
  15. package/dist/components/chat/ChatInput.d.ts.map +1 -0
  16. package/dist/components/chat/ChatInput.js +732 -0
  17. package/dist/components/chat/ChatInput.js.map +1 -0
  18. package/dist/components/chat/ChatUI.d.ts +4 -0
  19. package/dist/components/chat/ChatUI.d.ts.map +1 -0
  20. package/dist/components/chat/ChatUI.js +470 -0
  21. package/dist/components/chat/ChatUI.js.map +1 -0
  22. package/dist/components/chat/Message.d.ts +37 -0
  23. package/dist/components/chat/Message.d.ts.map +1 -0
  24. package/dist/components/chat/Message.js +262 -0
  25. package/dist/components/chat/Message.js.map +1 -0
  26. package/dist/components/chat/Sidebar.d.ts +52 -0
  27. package/dist/components/chat/Sidebar.d.ts.map +1 -0
  28. package/dist/components/chat/Sidebar.js +112 -0
  29. package/dist/components/chat/Sidebar.js.map +1 -0
  30. package/dist/components/chat/ThreadManager.d.ts +18 -0
  31. package/dist/components/chat/ThreadManager.d.ts.map +1 -0
  32. package/dist/components/chat/ThreadManager.js +108 -0
  33. package/dist/components/chat/ThreadManager.js.map +1 -0
  34. package/dist/components/chat/UserContext.d.ts +15 -0
  35. package/dist/components/chat/UserContext.d.ts.map +1 -0
  36. package/dist/components/chat/UserContext.js +39 -0
  37. package/dist/components/chat/UserContext.js.map +1 -0
  38. package/dist/components/chat/UserMenu.d.ts +38 -0
  39. package/dist/components/chat/UserMenu.d.ts.map +1 -0
  40. package/dist/components/chat/UserMenu.js +44 -0
  41. package/dist/components/chat/UserMenu.js.map +1 -0
  42. package/dist/components/chat/UserProfile.d.ts +51 -0
  43. package/dist/components/chat/UserProfile.d.ts.map +1 -0
  44. package/dist/components/chat/UserProfile.js +206 -0
  45. package/dist/components/chat/UserProfile.js.map +1 -0
  46. package/dist/components/chat/VoiceComposer.d.ts +29 -0
  47. package/dist/components/chat/VoiceComposer.d.ts.map +1 -0
  48. package/dist/components/chat/VoiceComposer.js +99 -0
  49. package/dist/components/chat/VoiceComposer.js.map +1 -0
  50. package/dist/components/ui/Spinner.d.ts +7 -0
  51. package/dist/components/ui/Spinner.d.ts.map +1 -0
  52. package/dist/components/ui/Spinner.js +14 -0
  53. package/dist/components/ui/Spinner.js.map +1 -0
  54. package/dist/components/ui/accordion.d.ts +8 -0
  55. package/dist/components/ui/accordion.d.ts.map +1 -0
  56. package/dist/components/ui/accordion.js +14 -0
  57. package/dist/components/ui/accordion.js.map +1 -0
  58. package/dist/components/ui/alert-dialog.d.ts +15 -0
  59. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  60. package/dist/components/ui/alert-dialog.js +66 -0
  61. package/dist/components/ui/alert-dialog.js.map +1 -0
  62. package/dist/components/ui/avatar.d.ts +7 -0
  63. package/dist/components/ui/avatar.d.ts.map +1 -0
  64. package/dist/components/ui/avatar.js +15 -0
  65. package/dist/components/ui/avatar.js.map +1 -0
  66. package/dist/components/ui/badge.d.ts +10 -0
  67. package/dist/components/ui/badge.d.ts.map +1 -0
  68. package/dist/components/ui/badge.js +23 -0
  69. package/dist/components/ui/badge.js.map +1 -0
  70. package/dist/components/ui/button.d.ts +11 -0
  71. package/dist/components/ui/button.d.ts.map +1 -0
  72. package/dist/components/ui/button.js +32 -0
  73. package/dist/components/ui/button.js.map +1 -0
  74. package/dist/components/ui/card.d.ts +10 -0
  75. package/dist/components/ui/card.d.ts.map +1 -0
  76. package/dist/components/ui/card.js +25 -0
  77. package/dist/components/ui/card.js.map +1 -0
  78. package/dist/components/ui/collapsible.d.ts +6 -0
  79. package/dist/components/ui/collapsible.d.ts.map +1 -0
  80. package/dist/components/ui/collapsible.js +6 -0
  81. package/dist/components/ui/collapsible.js.map +1 -0
  82. package/dist/components/ui/context-menu.d.ts +26 -0
  83. package/dist/components/ui/context-menu.d.ts.map +1 -0
  84. package/dist/components/ui/context-menu.js +51 -0
  85. package/dist/components/ui/context-menu.js.map +1 -0
  86. package/dist/components/ui/dialog.d.ts +16 -0
  87. package/dist/components/ui/dialog.d.ts.map +1 -0
  88. package/dist/components/ui/dialog.js +63 -0
  89. package/dist/components/ui/dialog.js.map +1 -0
  90. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  91. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  92. package/dist/components/ui/dropdown-menu.js +51 -0
  93. package/dist/components/ui/dropdown-menu.js.map +1 -0
  94. package/dist/components/ui/input.d.ts +4 -0
  95. package/dist/components/ui/input.d.ts.map +1 -0
  96. package/dist/components/ui/input.js +7 -0
  97. package/dist/components/ui/input.js.map +1 -0
  98. package/dist/components/ui/progress.d.ts +5 -0
  99. package/dist/components/ui/progress.d.ts.map +1 -0
  100. package/dist/components/ui/progress.js +8 -0
  101. package/dist/components/ui/progress.js.map +1 -0
  102. package/dist/components/ui/scroll-area.d.ts +8 -0
  103. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  104. package/dist/components/ui/scroll-area.js +16 -0
  105. package/dist/components/ui/scroll-area.js.map +1 -0
  106. package/dist/components/ui/select.d.ts +12 -0
  107. package/dist/components/ui/select.d.ts.map +1 -0
  108. package/dist/components/ui/select.js +21 -0
  109. package/dist/components/ui/select.js.map +1 -0
  110. package/dist/components/ui/separator.d.ts +5 -0
  111. package/dist/components/ui/separator.d.ts.map +1 -0
  112. package/dist/components/ui/separator.js +9 -0
  113. package/dist/components/ui/separator.js.map +1 -0
  114. package/dist/components/ui/sheet.d.ts +14 -0
  115. package/dist/components/ui/sheet.d.ts.map +1 -0
  116. package/dist/components/ui/sheet.js +66 -0
  117. package/dist/components/ui/sheet.js.map +1 -0
  118. package/dist/components/ui/sidebar.d.ts +70 -0
  119. package/dist/components/ui/sidebar.d.ts.map +1 -0
  120. package/dist/components/ui/sidebar.js +212 -0
  121. package/dist/components/ui/sidebar.js.map +1 -0
  122. package/dist/components/ui/skeleton.d.ts +3 -0
  123. package/dist/components/ui/skeleton.d.ts.map +1 -0
  124. package/dist/components/ui/skeleton.js +7 -0
  125. package/dist/components/ui/skeleton.js.map +1 -0
  126. package/dist/components/ui/textarea.d.ts +4 -0
  127. package/dist/components/ui/textarea.d.ts.map +1 -0
  128. package/dist/components/ui/textarea.js +7 -0
  129. package/dist/components/ui/textarea.js.map +1 -0
  130. package/dist/components/ui/tooltip.d.ts +8 -0
  131. package/dist/components/ui/tooltip.d.ts.map +1 -0
  132. package/dist/components/ui/tooltip.js +18 -0
  133. package/dist/components/ui/tooltip.js.map +1 -0
  134. package/dist/config/chatConfig.d.ts +4 -0
  135. package/dist/config/chatConfig.d.ts.map +1 -0
  136. package/dist/config/chatConfig.js +173 -0
  137. package/dist/config/chatConfig.js.map +1 -0
  138. package/dist/hooks/use-mobile.d.ts +2 -0
  139. package/dist/hooks/use-mobile.d.ts.map +1 -0
  140. package/dist/hooks/use-mobile.js +16 -0
  141. package/dist/hooks/use-mobile.js.map +1 -0
  142. package/dist/index.cjs +1000 -1340
  143. package/dist/index.cjs.map +1 -1
  144. package/dist/index.d.cts +36 -345
  145. package/dist/index.d.ts +36 -345
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +943 -1285
  148. package/dist/index.js.map +1 -1
  149. package/dist/lib/chatUtils.d.ts +18 -0
  150. package/dist/lib/chatUtils.d.ts.map +1 -0
  151. package/dist/lib/chatUtils.js +64 -0
  152. package/dist/lib/chatUtils.js.map +1 -0
  153. package/dist/lib/utils.d.ts +6 -0
  154. package/dist/lib/utils.d.ts.map +1 -0
  155. package/dist/lib/utils.js +46 -0
  156. package/dist/lib/utils.js.map +1 -0
  157. package/dist/lib/voiceCompose.d.ts +6 -0
  158. package/dist/lib/voiceCompose.d.ts.map +1 -0
  159. package/dist/lib/voiceCompose.js +344 -0
  160. package/dist/lib/voiceCompose.js.map +1 -0
  161. package/dist/styles.css +58 -106
  162. package/dist/types/chatTypes.d.ts +386 -0
  163. package/dist/types/chatTypes.d.ts.map +1 -0
  164. package/dist/types/chatTypes.js +2 -0
  165. package/dist/types/chatTypes.js.map +1 -0
  166. package/package.json +2 -1
@@ -0,0 +1,18 @@
1
+ import { ChatMessage, ChatThread, MediaAttachment, AgentOption } from '../types/chatTypes';
2
+ export declare const chatUtils: {
3
+ generateId: () => string;
4
+ generateMessageId: () => string;
5
+ generateThreadId: () => string;
6
+ createMessage: (role: "user" | "assistant" | "system", content: string, attachments?: MediaAttachment[]) => ChatMessage;
7
+ createThread: (title: string) => ChatThread;
8
+ generateThreadTitle: (firstMessage: string) => string;
9
+ };
10
+ /** Deterministic color for an agent based on its ID. */
11
+ export declare function getAgentColor(agentId: string): string;
12
+ /** Up to 2-letter initials from an agent name. */
13
+ export declare function getAgentInitials(name: string): string;
14
+ /** Assign colors to agents that don't have a custom color. Returns a new array. */
15
+ export declare function assignAgentColors(agents: AgentOption[]): (AgentOption & {
16
+ color: string;
17
+ })[];
18
+ //# sourceMappingURL=chatUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatUtils.d.ts","sourceRoot":"","sources":["../../src/lib/chatUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE3F,eAAO,MAAM,SAAS;sBACJ,MAAM;6BAGC,MAAM;4BACP,MAAM;0BAGpB,MAAM,GAAG,WAAW,GAAG,QAAQ,WAC5B,MAAM,gBACD,eAAe,EAAE,KAC9B,WAAW;0BASQ,MAAM,KAAG,UAAU;wCAQL,MAAM,KAAG,MAAM;CAKpD,CAAC;AAmBF,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAK5F"}
@@ -0,0 +1,64 @@
1
+ export const chatUtils = {
2
+ generateId: () => (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`),
3
+ generateMessageId: () => chatUtils.generateId(),
4
+ generateThreadId: () => chatUtils.generateId(),
5
+ createMessage: (role, content, attachments) => ({
6
+ id: chatUtils.generateMessageId(),
7
+ role,
8
+ content,
9
+ timestamp: Date.now(),
10
+ attachments,
11
+ isComplete: true,
12
+ }),
13
+ createThread: (title) => ({
14
+ id: chatUtils.generateThreadId(),
15
+ title,
16
+ createdAt: Date.now(),
17
+ updatedAt: Date.now(),
18
+ messageCount: 0,
19
+ }),
20
+ generateThreadTitle: (firstMessage) => {
21
+ const cleaned = firstMessage.replace(/[^\w\s]/g, '').trim();
22
+ const words = cleaned.split(/\s+/).slice(0, 6);
23
+ return words.join(' ') || 'Nova Conversa';
24
+ },
25
+ };
26
+ // ============================================================================
27
+ // Multi-agent color/display utilities
28
+ // ============================================================================
29
+ const AGENT_COLORS = [
30
+ '#6366f1', // indigo
31
+ '#8b5cf6', // violet
32
+ '#ec4899', // pink
33
+ '#f59e0b', // amber
34
+ '#10b981', // emerald
35
+ '#3b82f6', // blue
36
+ '#ef4444', // red
37
+ '#14b8a6', // teal
38
+ '#f97316', // orange
39
+ '#84cc16', // lime
40
+ ];
41
+ /** Deterministic color for an agent based on its ID. */
42
+ export function getAgentColor(agentId) {
43
+ let hash = 0;
44
+ for (let i = 0; i < agentId.length; i++) {
45
+ hash = ((hash << 5) - hash + agentId.charCodeAt(i)) | 0;
46
+ }
47
+ return AGENT_COLORS[Math.abs(hash) % AGENT_COLORS.length];
48
+ }
49
+ /** Up to 2-letter initials from an agent name. */
50
+ export function getAgentInitials(name) {
51
+ const parts = name.trim().split(/\s+/);
52
+ if (parts.length >= 2) {
53
+ return (parts[0][0] + parts[1][0]).toUpperCase();
54
+ }
55
+ return name.slice(0, 2).toUpperCase();
56
+ }
57
+ /** Assign colors to agents that don't have a custom color. Returns a new array. */
58
+ export function assignAgentColors(agents) {
59
+ return agents.map((agent) => ({
60
+ ...agent,
61
+ color: agent.color || getAgentColor(agent.id),
62
+ }));
63
+ }
64
+ //# sourceMappingURL=chatUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatUtils.js","sourceRoot":"","sources":["../../src/lib/chatUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ClassValue } from "clsx";
2
+ import type { ChatConfig } from "../types/chatTypes";
3
+ export declare function cn(...inputs: ClassValue[]): string;
4
+ export declare const formatDate: (timestamp: number, labels?: ChatConfig["labels"]) => string;
5
+ export declare const createObjectUrlFromDataUrl: (dataUrl: string) => string | null;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAED,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,EAAE,SAAS,UAAU,CAAC,QAAQ,CAAC,WAkB1E,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,IAoBrE,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ export const formatDate = (timestamp, labels) => {
7
+ const date = new Date(timestamp);
8
+ const now = new Date();
9
+ const diffMs = now.getTime() - date.getTime();
10
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
11
+ if (diffDays === 0) {
12
+ return labels?.today || 'Today';
13
+ }
14
+ else if (diffDays === 1) {
15
+ return labels?.yesterday || 'Yesterday';
16
+ }
17
+ else if (diffDays < 7) {
18
+ return `${diffDays} ${labels?.daysAgo || 'days ago'}`;
19
+ }
20
+ else {
21
+ return date.toLocaleDateString('en-US', {
22
+ day: '2-digit',
23
+ month: 'short',
24
+ });
25
+ }
26
+ };
27
+ export const createObjectUrlFromDataUrl = (dataUrl) => {
28
+ const match = dataUrl.match(/^data:(.+?);base64,(.+)$/s);
29
+ if (!match) {
30
+ return null;
31
+ }
32
+ try {
33
+ const [, mimeType, base64] = match;
34
+ const binary = atob(base64);
35
+ const bytes = new Uint8Array(binary.length);
36
+ for (let i = 0; i < binary.length; i += 1) {
37
+ bytes[i] = binary.charCodeAt(i);
38
+ }
39
+ const blob = new Blob([bytes], { type: mimeType || 'application/octet-stream' });
40
+ return URL.createObjectURL(blob);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ };
46
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAGxC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,MAA6B,EAAE,EAAE;IAC7E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE5D,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC;IAClC,CAAC;SAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,EAAE,SAAS,IAAI,WAAW,CAAC;IAC1C,CAAC;SAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,OAAO,IAAI,UAAU,EAAE,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtC,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,OAAe,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,0BAA0B,EAAE,CAAC,CAAC;QACjF,OAAO,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CreateVoiceProvider, VoiceSegment, VoiceTranscript } from '../types/chatTypes';
2
+ export declare const mergeVoiceTranscripts: (previous?: VoiceTranscript, incoming?: VoiceTranscript) => VoiceTranscript;
3
+ export declare const appendVoiceSegments: (previous: VoiceSegment, incoming: VoiceSegment) => Promise<VoiceSegment>;
4
+ export declare const createManualVoiceProvider: CreateVoiceProvider;
5
+ export declare const resolveVoiceProviderFactory: (createProvider?: CreateVoiceProvider) => CreateVoiceProvider;
6
+ //# sourceMappingURL=voiceCompose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceCompose.d.ts","sourceRoot":"","sources":["../../src/lib/voiceCompose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EAInB,YAAY,EACZ,eAAe,EAChB,MAAM,oBAAoB,CAAC;AA4I5B,eAAO,MAAM,qBAAqB,GAChC,WAAW,eAAe,EAC1B,WAAW,eAAe,KACzB,eAGD,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,YAAY,EACtB,UAAU,YAAY,KACrB,OAAO,CAAC,YAAY,CA2BtB,CAAC;AAqBF,eAAO,MAAM,yBAAyB,EAAE,mBA+MvC,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,iBAAiB,mBAAmB,KACnC,mBAAkE,CAAC"}
@@ -0,0 +1,344 @@
1
+ const AUDIO_MIME_TYPES = [
2
+ 'audio/webm;codecs=opus',
3
+ 'audio/webm',
4
+ 'audio/mp4',
5
+ 'audio/ogg;codecs=opus',
6
+ ];
7
+ const pickRecorderMimeType = () => {
8
+ if (typeof MediaRecorder === 'undefined')
9
+ return undefined;
10
+ for (const mimeType of AUDIO_MIME_TYPES) {
11
+ if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported(mimeType)) {
12
+ return mimeType;
13
+ }
14
+ }
15
+ return undefined;
16
+ };
17
+ const blobToDataUrl = (blob) => new Promise((resolve, reject) => {
18
+ const reader = new FileReader();
19
+ reader.onload = () => resolve(reader.result);
20
+ reader.onerror = () => reject(reader.error ?? new Error('Failed to read recorded audio'));
21
+ reader.readAsDataURL(blob);
22
+ });
23
+ const joinTranscriptParts = (...parts) => {
24
+ const value = parts
25
+ .map((part) => part?.trim())
26
+ .filter((part) => Boolean(part && part.length > 0))
27
+ .join(' ')
28
+ .trim();
29
+ return value.length > 0 ? value : undefined;
30
+ };
31
+ const getAudioContextCtor = () => globalThis.AudioContext ||
32
+ globalThis.webkitAudioContext;
33
+ const getOfflineAudioContextCtor = () => globalThis.OfflineAudioContext ||
34
+ globalThis.webkitOfflineAudioContext;
35
+ const attachmentToArrayBuffer = async (attachment) => {
36
+ const response = await fetch(attachment.dataUrl);
37
+ return response.arrayBuffer();
38
+ };
39
+ const decodeAudioAttachment = async (attachment) => {
40
+ const AudioContextCtor = getAudioContextCtor();
41
+ if (!AudioContextCtor) {
42
+ throw new Error('Audio decoding is not supported in this browser');
43
+ }
44
+ const audioContext = new AudioContextCtor();
45
+ try {
46
+ const arrayBuffer = await attachmentToArrayBuffer(attachment);
47
+ return await audioContext.decodeAudioData(arrayBuffer.slice(0));
48
+ }
49
+ finally {
50
+ await closeAudioContext(audioContext);
51
+ }
52
+ };
53
+ const renderMergedBuffer = async (buffers) => {
54
+ const OfflineAudioContextCtor = getOfflineAudioContextCtor();
55
+ if (!OfflineAudioContextCtor) {
56
+ throw new Error('Offline audio rendering is not supported in this browser');
57
+ }
58
+ const numberOfChannels = Math.max(...buffers.map((buffer) => buffer.numberOfChannels));
59
+ const sampleRate = Math.max(...buffers.map((buffer) => buffer.sampleRate));
60
+ const totalFrames = Math.max(1, Math.ceil(buffers.reduce((sum, buffer) => sum + (buffer.duration * sampleRate), 0)));
61
+ const offlineContext = new OfflineAudioContextCtor(numberOfChannels, totalFrames, sampleRate);
62
+ let offsetSeconds = 0;
63
+ for (const buffer of buffers) {
64
+ const source = offlineContext.createBufferSource();
65
+ source.buffer = buffer;
66
+ source.connect(offlineContext.destination);
67
+ source.start(offsetSeconds);
68
+ offsetSeconds += buffer.duration;
69
+ }
70
+ return offlineContext.startRendering();
71
+ };
72
+ const encodeWav = (audioBuffer) => {
73
+ const numberOfChannels = audioBuffer.numberOfChannels;
74
+ const sampleRate = audioBuffer.sampleRate;
75
+ const bitsPerSample = 16;
76
+ const bytesPerSample = bitsPerSample / 8;
77
+ const dataLength = audioBuffer.length * numberOfChannels * bytesPerSample;
78
+ const buffer = new ArrayBuffer(44 + dataLength);
79
+ const view = new DataView(buffer);
80
+ const writeString = (offset, value) => {
81
+ for (let index = 0; index < value.length; index += 1) {
82
+ view.setUint8(offset + index, value.charCodeAt(index));
83
+ }
84
+ };
85
+ writeString(0, 'RIFF');
86
+ view.setUint32(4, 36 + dataLength, true);
87
+ writeString(8, 'WAVE');
88
+ writeString(12, 'fmt ');
89
+ view.setUint32(16, 16, true);
90
+ view.setUint16(20, 1, true);
91
+ view.setUint16(22, numberOfChannels, true);
92
+ view.setUint32(24, sampleRate, true);
93
+ view.setUint32(28, sampleRate * numberOfChannels * bytesPerSample, true);
94
+ view.setUint16(32, numberOfChannels * bytesPerSample, true);
95
+ view.setUint16(34, bitsPerSample, true);
96
+ writeString(36, 'data');
97
+ view.setUint32(40, dataLength, true);
98
+ let offset = 44;
99
+ const channelData = Array.from({ length: numberOfChannels }, (_, index) => audioBuffer.getChannelData(index));
100
+ for (let sampleIndex = 0; sampleIndex < audioBuffer.length; sampleIndex += 1) {
101
+ for (let channelIndex = 0; channelIndex < numberOfChannels; channelIndex += 1) {
102
+ const sample = Math.max(-1, Math.min(1, channelData[channelIndex][sampleIndex]));
103
+ const pcmValue = sample < 0 ? sample * 0x8000 : sample * 0x7fff;
104
+ view.setInt16(offset, pcmValue, true);
105
+ offset += 2;
106
+ }
107
+ }
108
+ return new Blob([buffer], { type: 'audio/wav' });
109
+ };
110
+ const resolveSegmentCount = (segment) => {
111
+ const candidate = segment?.metadata?.segmentCount;
112
+ return typeof candidate === 'number' && Number.isFinite(candidate) && candidate > 0 ? candidate : (segment ? 1 : 0);
113
+ };
114
+ export const mergeVoiceTranscripts = (previous, incoming) => ({
115
+ final: joinTranscriptParts(previous?.final, incoming?.final),
116
+ partial: joinTranscriptParts(previous?.final, incoming?.partial),
117
+ });
118
+ export const appendVoiceSegments = async (previous, incoming) => {
119
+ const [previousBuffer, incomingBuffer] = await Promise.all([
120
+ decodeAudioAttachment(previous.attachment),
121
+ decodeAudioAttachment(incoming.attachment),
122
+ ]);
123
+ const mergedBuffer = await renderMergedBuffer([previousBuffer, incomingBuffer]);
124
+ const mergedBlob = encodeWav(mergedBuffer);
125
+ const dataUrl = await blobToDataUrl(mergedBlob);
126
+ const segmentCount = resolveSegmentCount(previous) + resolveSegmentCount(incoming);
127
+ return {
128
+ attachment: {
129
+ kind: 'audio',
130
+ dataUrl,
131
+ mimeType: mergedBlob.type,
132
+ durationMs: Math.round(mergedBuffer.duration * 1000),
133
+ fileName: `voice-${new Date().toISOString().replace(/[:.]/g, '-')}.wav`,
134
+ size: mergedBlob.size,
135
+ },
136
+ transcript: mergeVoiceTranscripts(previous.transcript, incoming.transcript),
137
+ metadata: {
138
+ ...previous.metadata,
139
+ ...incoming.metadata,
140
+ segmentCount,
141
+ source: segmentCount > 1 ? 'merged' : (incoming.metadata?.source ?? previous.metadata?.source),
142
+ },
143
+ };
144
+ };
145
+ const stopStream = (stream) => {
146
+ if (!stream)
147
+ return;
148
+ stream.getTracks().forEach((track) => track.stop());
149
+ };
150
+ const closeAudioContext = async (audioContext) => {
151
+ if (!audioContext)
152
+ return;
153
+ try {
154
+ await audioContext.close();
155
+ }
156
+ catch {
157
+ // Ignore close errors from partially-initialized contexts.
158
+ }
159
+ };
160
+ const emitDuration = (handlers, startedAt) => {
161
+ handlers.onDurationChange?.(Math.max(0, Date.now() - startedAt));
162
+ };
163
+ export const createManualVoiceProvider = async (handlers, options = {}) => {
164
+ let mediaRecorder = null;
165
+ let mediaStream = null;
166
+ let audioContext = null;
167
+ let analyser = null;
168
+ let levelData = null;
169
+ let levelFrame = 0;
170
+ let durationTimer = null;
171
+ let maxDurationTimer = null;
172
+ let startedAt = 0;
173
+ let shouldEmitSegment = true;
174
+ let isStarting = false;
175
+ const clearTimers = () => {
176
+ if (durationTimer) {
177
+ clearInterval(durationTimer);
178
+ durationTimer = null;
179
+ }
180
+ if (maxDurationTimer) {
181
+ clearTimeout(maxDurationTimer);
182
+ maxDurationTimer = null;
183
+ }
184
+ };
185
+ const stopLevelLoop = () => {
186
+ if (levelFrame) {
187
+ cancelAnimationFrame(levelFrame);
188
+ levelFrame = 0;
189
+ }
190
+ handlers.onAudioLevelChange?.(0);
191
+ };
192
+ const startLevelLoop = () => {
193
+ if (!analyser || !levelData)
194
+ return;
195
+ const tick = () => {
196
+ if (!analyser || !levelData)
197
+ return;
198
+ analyser.getByteTimeDomainData(levelData);
199
+ let sum = 0;
200
+ for (let index = 0; index < levelData.length; index += 1) {
201
+ const centered = (levelData[index] - 128) / 128;
202
+ sum += centered * centered;
203
+ }
204
+ const rms = Math.sqrt(sum / levelData.length);
205
+ handlers.onAudioLevelChange?.(Math.min(1, rms * 4));
206
+ levelFrame = requestAnimationFrame(tick);
207
+ };
208
+ tick();
209
+ };
210
+ const cleanupActiveResources = async () => {
211
+ clearTimers();
212
+ stopLevelLoop();
213
+ stopStream(mediaStream);
214
+ mediaStream = null;
215
+ analyser = null;
216
+ levelData = null;
217
+ await closeAudioContext(audioContext);
218
+ audioContext = null;
219
+ };
220
+ const finalizeStop = async () => {
221
+ mediaRecorder = null;
222
+ isStarting = false;
223
+ await cleanupActiveResources();
224
+ };
225
+ const start = async () => {
226
+ if (isStarting || mediaRecorder?.state === 'recording') {
227
+ return;
228
+ }
229
+ if (!navigator.mediaDevices?.getUserMedia) {
230
+ throw new Error('Audio capture is not supported in this browser');
231
+ }
232
+ if (typeof MediaRecorder === 'undefined') {
233
+ throw new Error('MediaRecorder is not supported in this browser');
234
+ }
235
+ isStarting = true;
236
+ shouldEmitSegment = true;
237
+ handlers.onTranscriptChange?.({});
238
+ handlers.onDurationChange?.(0);
239
+ handlers.onAudioLevelChange?.(0);
240
+ handlers.onStateChange?.('preparing');
241
+ try {
242
+ mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
243
+ const mimeType = pickRecorderMimeType();
244
+ mediaRecorder = mimeType
245
+ ? new MediaRecorder(mediaStream, { mimeType })
246
+ : new MediaRecorder(mediaStream);
247
+ const chunks = [];
248
+ mediaRecorder.ondataavailable = (event) => {
249
+ if (event.data.size > 0) {
250
+ chunks.push(event.data);
251
+ }
252
+ };
253
+ mediaRecorder.onerror = (event) => {
254
+ const error = event.error ?? new Error('Audio recorder failed');
255
+ handlers.onError?.(error);
256
+ };
257
+ mediaRecorder.onstop = async () => {
258
+ const durationMs = startedAt > 0 ? Math.max(0, Date.now() - startedAt) : 0;
259
+ try {
260
+ if (shouldEmitSegment && chunks.length > 0) {
261
+ const blob = new Blob(chunks, {
262
+ type: mediaRecorder?.mimeType || mimeType || 'audio/webm',
263
+ });
264
+ const dataUrl = await blobToDataUrl(blob);
265
+ handlers.onSegmentReady?.({
266
+ attachment: {
267
+ kind: 'audio',
268
+ dataUrl,
269
+ mimeType: blob.type || 'audio/webm',
270
+ durationMs,
271
+ fileName: `voice-${new Date().toISOString().replace(/[:.]/g, '-')}.webm`,
272
+ size: blob.size,
273
+ },
274
+ metadata: { source: 'manual', segmentCount: 1 },
275
+ });
276
+ }
277
+ else {
278
+ handlers.onStateChange?.('idle');
279
+ }
280
+ }
281
+ catch (error) {
282
+ handlers.onError?.(error);
283
+ }
284
+ finally {
285
+ await finalizeStop();
286
+ }
287
+ };
288
+ const AudioContextCtor = globalThis.AudioContext ||
289
+ globalThis.webkitAudioContext;
290
+ if (AudioContextCtor) {
291
+ audioContext = new AudioContextCtor();
292
+ await audioContext.resume().catch(() => undefined);
293
+ const sourceNode = audioContext.createMediaStreamSource(mediaStream);
294
+ analyser = audioContext.createAnalyser();
295
+ analyser.fftSize = 1024;
296
+ levelData = new Uint8Array(analyser.fftSize);
297
+ sourceNode.connect(analyser);
298
+ startLevelLoop();
299
+ }
300
+ startedAt = Date.now();
301
+ emitDuration(handlers, startedAt);
302
+ durationTimer = setInterval(() => emitDuration(handlers, startedAt), 200);
303
+ if (options.maxRecordingMs && options.maxRecordingMs > 0) {
304
+ maxDurationTimer = setTimeout(() => {
305
+ void stop();
306
+ }, options.maxRecordingMs);
307
+ }
308
+ mediaRecorder.start();
309
+ handlers.onStateChange?.('listening');
310
+ }
311
+ catch (error) {
312
+ isStarting = false;
313
+ await cleanupActiveResources();
314
+ throw error;
315
+ }
316
+ };
317
+ const stop = async () => {
318
+ if (!mediaRecorder || mediaRecorder.state === 'inactive') {
319
+ return;
320
+ }
321
+ handlers.onStateChange?.('finishing');
322
+ mediaRecorder.stop();
323
+ };
324
+ const cancel = async () => {
325
+ shouldEmitSegment = false;
326
+ if (mediaRecorder && mediaRecorder.state !== 'inactive') {
327
+ mediaRecorder.stop();
328
+ return;
329
+ }
330
+ await finalizeStop();
331
+ handlers.onStateChange?.('idle');
332
+ };
333
+ const destroy = async () => {
334
+ await cancel();
335
+ };
336
+ return {
337
+ start,
338
+ stop,
339
+ cancel,
340
+ destroy,
341
+ };
342
+ };
343
+ export const resolveVoiceProviderFactory = (createProvider) => createProvider ?? createManualVoiceProvider;
344
+ //# sourceMappingURL=voiceCompose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceCompose.js","sourceRoot":"","sources":["../../src/lib/voiceCompose.ts"],"names":[],"mappings":"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"}