@copilotz/chat-ui 0.7.4 → 0.7.5

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 (163) hide show
  1. package/dist/index.cjs +3 -3
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +3 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/styles.css +6 -3
  6. package/package.json +1 -1
  7. package/dist/components/chat/AgentSelectors.d.ts +0 -50
  8. package/dist/components/chat/AgentSelectors.d.ts.map +0 -1
  9. package/dist/components/chat/AgentSelectors.js +0 -67
  10. package/dist/components/chat/AgentSelectors.js.map +0 -1
  11. package/dist/components/chat/AssistantActivity.d.ts +0 -11
  12. package/dist/components/chat/AssistantActivity.d.ts.map +0 -1
  13. package/dist/components/chat/AssistantActivity.js +0 -82
  14. package/dist/components/chat/AssistantActivity.js.map +0 -1
  15. package/dist/components/chat/ChatHeader.d.ts +0 -56
  16. package/dist/components/chat/ChatHeader.d.ts.map +0 -1
  17. package/dist/components/chat/ChatHeader.js +0 -71
  18. package/dist/components/chat/ChatHeader.js.map +0 -1
  19. package/dist/components/chat/ChatInput.d.ts +0 -25
  20. package/dist/components/chat/ChatInput.d.ts.map +0 -1
  21. package/dist/components/chat/ChatInput.js +0 -732
  22. package/dist/components/chat/ChatInput.js.map +0 -1
  23. package/dist/components/chat/ChatUI.d.ts +0 -4
  24. package/dist/components/chat/ChatUI.d.ts.map +0 -1
  25. package/dist/components/chat/ChatUI.js +0 -470
  26. package/dist/components/chat/ChatUI.js.map +0 -1
  27. package/dist/components/chat/Message.d.ts +0 -37
  28. package/dist/components/chat/Message.d.ts.map +0 -1
  29. package/dist/components/chat/Message.js +0 -262
  30. package/dist/components/chat/Message.js.map +0 -1
  31. package/dist/components/chat/Sidebar.d.ts +0 -52
  32. package/dist/components/chat/Sidebar.d.ts.map +0 -1
  33. package/dist/components/chat/Sidebar.js +0 -112
  34. package/dist/components/chat/Sidebar.js.map +0 -1
  35. package/dist/components/chat/ThreadManager.d.ts +0 -18
  36. package/dist/components/chat/ThreadManager.d.ts.map +0 -1
  37. package/dist/components/chat/ThreadManager.js +0 -108
  38. package/dist/components/chat/ThreadManager.js.map +0 -1
  39. package/dist/components/chat/UserContext.d.ts +0 -15
  40. package/dist/components/chat/UserContext.d.ts.map +0 -1
  41. package/dist/components/chat/UserContext.js +0 -39
  42. package/dist/components/chat/UserContext.js.map +0 -1
  43. package/dist/components/chat/UserMenu.d.ts +0 -38
  44. package/dist/components/chat/UserMenu.d.ts.map +0 -1
  45. package/dist/components/chat/UserMenu.js +0 -44
  46. package/dist/components/chat/UserMenu.js.map +0 -1
  47. package/dist/components/chat/UserProfile.d.ts +0 -51
  48. package/dist/components/chat/UserProfile.d.ts.map +0 -1
  49. package/dist/components/chat/UserProfile.js +0 -206
  50. package/dist/components/chat/UserProfile.js.map +0 -1
  51. package/dist/components/chat/VoiceComposer.d.ts +0 -29
  52. package/dist/components/chat/VoiceComposer.d.ts.map +0 -1
  53. package/dist/components/chat/VoiceComposer.js +0 -99
  54. package/dist/components/chat/VoiceComposer.js.map +0 -1
  55. package/dist/components/ui/Spinner.d.ts +0 -7
  56. package/dist/components/ui/Spinner.d.ts.map +0 -1
  57. package/dist/components/ui/Spinner.js +0 -14
  58. package/dist/components/ui/Spinner.js.map +0 -1
  59. package/dist/components/ui/accordion.d.ts +0 -8
  60. package/dist/components/ui/accordion.d.ts.map +0 -1
  61. package/dist/components/ui/accordion.js +0 -14
  62. package/dist/components/ui/accordion.js.map +0 -1
  63. package/dist/components/ui/alert-dialog.d.ts +0 -15
  64. package/dist/components/ui/alert-dialog.d.ts.map +0 -1
  65. package/dist/components/ui/alert-dialog.js +0 -66
  66. package/dist/components/ui/alert-dialog.js.map +0 -1
  67. package/dist/components/ui/avatar.d.ts +0 -7
  68. package/dist/components/ui/avatar.d.ts.map +0 -1
  69. package/dist/components/ui/avatar.js +0 -15
  70. package/dist/components/ui/avatar.js.map +0 -1
  71. package/dist/components/ui/badge.d.ts +0 -10
  72. package/dist/components/ui/badge.d.ts.map +0 -1
  73. package/dist/components/ui/badge.js +0 -23
  74. package/dist/components/ui/badge.js.map +0 -1
  75. package/dist/components/ui/button.d.ts +0 -11
  76. package/dist/components/ui/button.d.ts.map +0 -1
  77. package/dist/components/ui/button.js +0 -32
  78. package/dist/components/ui/button.js.map +0 -1
  79. package/dist/components/ui/card.d.ts +0 -10
  80. package/dist/components/ui/card.d.ts.map +0 -1
  81. package/dist/components/ui/card.js +0 -25
  82. package/dist/components/ui/card.js.map +0 -1
  83. package/dist/components/ui/collapsible.d.ts +0 -6
  84. package/dist/components/ui/collapsible.d.ts.map +0 -1
  85. package/dist/components/ui/collapsible.js +0 -6
  86. package/dist/components/ui/collapsible.js.map +0 -1
  87. package/dist/components/ui/context-menu.d.ts +0 -26
  88. package/dist/components/ui/context-menu.d.ts.map +0 -1
  89. package/dist/components/ui/context-menu.js +0 -51
  90. package/dist/components/ui/context-menu.js.map +0 -1
  91. package/dist/components/ui/dialog.d.ts +0 -16
  92. package/dist/components/ui/dialog.d.ts.map +0 -1
  93. package/dist/components/ui/dialog.js +0 -63
  94. package/dist/components/ui/dialog.js.map +0 -1
  95. package/dist/components/ui/dropdown-menu.d.ts +0 -26
  96. package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
  97. package/dist/components/ui/dropdown-menu.js +0 -51
  98. package/dist/components/ui/dropdown-menu.js.map +0 -1
  99. package/dist/components/ui/input.d.ts +0 -4
  100. package/dist/components/ui/input.d.ts.map +0 -1
  101. package/dist/components/ui/input.js +0 -7
  102. package/dist/components/ui/input.js.map +0 -1
  103. package/dist/components/ui/progress.d.ts +0 -5
  104. package/dist/components/ui/progress.d.ts.map +0 -1
  105. package/dist/components/ui/progress.js +0 -8
  106. package/dist/components/ui/progress.js.map +0 -1
  107. package/dist/components/ui/scroll-area.d.ts +0 -8
  108. package/dist/components/ui/scroll-area.d.ts.map +0 -1
  109. package/dist/components/ui/scroll-area.js +0 -16
  110. package/dist/components/ui/scroll-area.js.map +0 -1
  111. package/dist/components/ui/select.d.ts +0 -12
  112. package/dist/components/ui/select.d.ts.map +0 -1
  113. package/dist/components/ui/select.js +0 -21
  114. package/dist/components/ui/select.js.map +0 -1
  115. package/dist/components/ui/separator.d.ts +0 -5
  116. package/dist/components/ui/separator.d.ts.map +0 -1
  117. package/dist/components/ui/separator.js +0 -9
  118. package/dist/components/ui/separator.js.map +0 -1
  119. package/dist/components/ui/sheet.d.ts +0 -14
  120. package/dist/components/ui/sheet.d.ts.map +0 -1
  121. package/dist/components/ui/sheet.js +0 -66
  122. package/dist/components/ui/sheet.js.map +0 -1
  123. package/dist/components/ui/sidebar.d.ts +0 -70
  124. package/dist/components/ui/sidebar.d.ts.map +0 -1
  125. package/dist/components/ui/sidebar.js +0 -212
  126. package/dist/components/ui/sidebar.js.map +0 -1
  127. package/dist/components/ui/skeleton.d.ts +0 -3
  128. package/dist/components/ui/skeleton.d.ts.map +0 -1
  129. package/dist/components/ui/skeleton.js +0 -7
  130. package/dist/components/ui/skeleton.js.map +0 -1
  131. package/dist/components/ui/textarea.d.ts +0 -4
  132. package/dist/components/ui/textarea.d.ts.map +0 -1
  133. package/dist/components/ui/textarea.js +0 -7
  134. package/dist/components/ui/textarea.js.map +0 -1
  135. package/dist/components/ui/tooltip.d.ts +0 -8
  136. package/dist/components/ui/tooltip.d.ts.map +0 -1
  137. package/dist/components/ui/tooltip.js +0 -18
  138. package/dist/components/ui/tooltip.js.map +0 -1
  139. package/dist/config/chatConfig.d.ts +0 -4
  140. package/dist/config/chatConfig.d.ts.map +0 -1
  141. package/dist/config/chatConfig.js +0 -173
  142. package/dist/config/chatConfig.js.map +0 -1
  143. package/dist/hooks/use-mobile.d.ts +0 -2
  144. package/dist/hooks/use-mobile.d.ts.map +0 -1
  145. package/dist/hooks/use-mobile.js +0 -16
  146. package/dist/hooks/use-mobile.js.map +0 -1
  147. package/dist/index.d.ts.map +0 -1
  148. package/dist/lib/chatUtils.d.ts +0 -18
  149. package/dist/lib/chatUtils.d.ts.map +0 -1
  150. package/dist/lib/chatUtils.js +0 -64
  151. package/dist/lib/chatUtils.js.map +0 -1
  152. package/dist/lib/utils.d.ts +0 -6
  153. package/dist/lib/utils.d.ts.map +0 -1
  154. package/dist/lib/utils.js +0 -46
  155. package/dist/lib/utils.js.map +0 -1
  156. package/dist/lib/voiceCompose.d.ts +0 -6
  157. package/dist/lib/voiceCompose.d.ts.map +0 -1
  158. package/dist/lib/voiceCompose.js +0 -344
  159. package/dist/lib/voiceCompose.js.map +0 -1
  160. package/dist/types/chatTypes.d.ts +0 -386
  161. package/dist/types/chatTypes.d.ts.map +0 -1
  162. package/dist/types/chatTypes.js +0 -2
  163. package/dist/types/chatTypes.js.map +0 -1
@@ -1,16 +0,0 @@
1
- import * as React from "react";
2
- const MOBILE_BREAKPOINT = 768;
3
- export function useIsMobile() {
4
- const [isMobile, setIsMobile] = React.useState(undefined);
5
- React.useEffect(() => {
6
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
7
- const onChange = () => {
8
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
9
- };
10
- mql.addEventListener("change", onChange);
11
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
12
- return () => mql.removeEventListener("change", onChange);
13
- }, []);
14
- return !!isMobile;
15
- }
16
- //# sourceMappingURL=use-mobile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-mobile.js","sourceRoot":"","sources":["../../src/hooks/use-mobile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsB,SAAS,CAAC,CAAA;IAE9E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,iBAAiB,GAAG,CAAC,KAAK,CAAC,CAAA;QACxE,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAA;QACpD,CAAC,CAAA;QACD,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACxC,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAA;QAClD,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC1D,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CAAC,CAAC,QAAQ,CAAA;AACnB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
@@ -1,18 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,64 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"chatUtils.js","sourceRoot":"","sources":["../../src/lib/chatUtils.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
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
@@ -1 +0,0 @@
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"}
package/dist/lib/utils.js DELETED
@@ -1,46 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,6 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,344 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"voiceCompose.js","sourceRoot":"","sources":["../../src/lib/voiceCompose.ts"],"names":[],"mappings":"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"}