@copilotz/chat-ui 0.4.1 → 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
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **The chat interface your AI agent deserves.**
4
4
 
5
- Chat UI libraries give you message bubbles. Your AI agent has tool calls, streaming responses, file uploads, audio recording, persistent threads, and user memories. This gives you everything else.
5
+ Chat UI libraries give you message bubbles. Your AI agent has live activity, streaming responses, file uploads, audio recording, persistent threads, and user memories. This gives you everything else.
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/@copilotz/chat-ui)](https://www.npmjs.com/package/@copilotz/chat-ui)
8
8
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
@@ -15,7 +15,7 @@ Chat UI libraries give you message bubbles. Your AI agent has tool calls, stream
15
15
 
16
16
  You're building a frontend for your AI agent. You grab a chat UI library. It renders messages. Great.
17
17
 
18
- Then you need to show tool calls — the library doesn't support that. Streaming with a thinking indicator — you'll build it yourself. File uploads with previews — more custom code. Audio recording — even more. Thread management with search and archive — at this point you're maintaining your own chat UI.
18
+ Then you need to show assistant activity — the library doesn't support that. Streaming with a native-feeling activity state — you'll build it yourself. File uploads with previews — more custom code. Audio recording — even more. Thread management with search and archive — at this point you're maintaining your own chat UI.
19
19
 
20
20
  **There's no shadcn for agentic chat. Just parts.**
21
21
 
@@ -25,8 +25,8 @@ Then you need to show tool calls — the library doesn't support that. Streaming
25
25
 
26
26
  | What You Need | What This Gives You |
27
27
  |---------------|---------------------|
28
- | Messages | Markdown with syntax highlighting, streaming with thinking indicator |
29
- | Tool Calls | Expandable cards with args, results, status, and execution time |
28
+ | Messages | Markdown with syntax highlighting, streaming, and unified assistant activity |
29
+ | Assistant Activity | Compact summary, optional details, hidden loader mode |
30
30
  | Media | Image/audio/video attachments with native playback controls |
31
31
  | Input | File upload (drag & drop), audio recording, attachment previews |
32
32
  | Threads | Sidebar with search, archive, date grouping, rename, delete |
@@ -80,7 +80,7 @@ That's it. You have a full-featured chat interface.
80
80
 
81
81
  ### Messages That Do More
82
82
 
83
- Real-time streaming with a thinking indicator while waiting for the first token. Markdown rendering with syntax highlighting. Tool calls displayed as expandable cards showing name, arguments, result, and execution time.
83
+ Real-time streaming with a unified assistant activity model. Markdown rendering with syntax highlighting. Activity can render in `full`, `summary`, or `hidden` modes, with detailed reasoning and tool execution folded into one activity surface.
84
84
 
85
85
  ```tsx
86
86
  const message = {
@@ -89,15 +89,20 @@ const message = {
89
89
  content: 'Here is the chart you requested.',
90
90
  timestamp: Date.now(),
91
91
  isStreaming: false,
92
- toolCalls: [{
93
- id: 'tc-1',
94
- name: 'generate_chart',
95
- arguments: { type: 'bar', data: [1, 2, 3] },
96
- result: { url: 'https://...' },
97
- status: 'completed',
98
- startTime: 1234567890,
99
- endTime: 1234567891,
100
- }],
92
+ activity: {
93
+ isActive: false,
94
+ isComplete: true,
95
+ summary: { kind: 'using_tools', toolName: 'generate_chart' },
96
+ toolCalls: [{
97
+ id: 'tc-1',
98
+ name: 'generate_chart',
99
+ arguments: { type: 'bar', data: [1, 2, 3] },
100
+ result: { url: 'https://...' },
101
+ status: 'completed',
102
+ startTime: 1234567890,
103
+ endTime: 1234567891,
104
+ }],
105
+ },
101
106
  attachments: [{
102
107
  kind: 'image',
103
108
  dataUrl: 'data:image/png;base64,...',
@@ -157,9 +162,10 @@ The configuration system lets you customize everything without touching the comp
157
162
  inputPlaceholder: 'Ask me anything...',
158
163
  sendButton: 'Send',
159
164
  newChat: 'New Conversation',
160
- thinking: 'Thinking...',
161
- toolUsed: 'Tool Used',
162
- // ... 50+ customizable labels for full i18n
165
+ activityThinking: 'Thinking...',
166
+ activityUsingTools: 'Using tools...',
167
+ activityShowDetails: 'Show details',
168
+ activityHideDetails: 'Hide details',
163
169
  },
164
170
  features: {
165
171
  enableThreads: true,
@@ -168,7 +174,7 @@ The configuration system lets you customize everything without touching the comp
168
174
  enableMessageEditing: true,
169
175
  enableMessageCopy: true,
170
176
  enableRegeneration: true,
171
- enableToolCallsDisplay: true,
177
+ activityDisplay: 'full',
172
178
  maxAttachments: 4,
173
179
  maxFileSize: 10 * 1024 * 1024, // 10MB
174
180
  },
@@ -361,11 +367,25 @@ interface ChatMessage {
361
367
  isStreaming?: boolean;
362
368
  isComplete?: boolean;
363
369
  isEdited?: boolean;
364
- toolCalls?: ToolCall[];
370
+ activity?: AssistantActivityState;
365
371
  metadata?: Record<string, any>;
366
372
  }
367
373
  ```
368
374
 
375
+ ```typescript
376
+ interface AssistantActivityState {
377
+ isActive: boolean;
378
+ isComplete?: boolean;
379
+ summary: {
380
+ kind: 'thinking' | 'working' | 'using_tools' | 'preparing_answer';
381
+ toolName?: string;
382
+ toolCount?: number;
383
+ };
384
+ reasoning?: string;
385
+ toolCalls?: ToolCall[];
386
+ }
387
+ ```
388
+
369
389
  ### MediaAttachment
370
390
 
371
391
  ```typescript
@@ -405,26 +425,16 @@ interface AgentOption {
405
425
  ## Exports
406
426
 
407
427
  ```tsx
408
- // Components
428
+ // Primary components
409
429
  export { ChatUI } from './components/chat/ChatUI';
410
- export { ChatHeader } from './components/chat/ChatHeader';
411
- export { ChatInput } from './components/chat/ChatInput';
412
- export { Message } from './components/chat/Message';
413
- export { Sidebar } from './components/chat/Sidebar';
414
- export { ThreadManager } from './components/chat/ThreadManager';
415
- export { UserProfile } from './components/chat/UserProfile';
416
- export { UserMenu } from './components/chat/UserMenu';
430
+ export { AssistantActivity } from './components/chat/AssistantActivity';
417
431
  export { ChatUserContextProvider, useChatUserContext } from './components/chat/UserContext';
418
432
 
419
433
  // Configuration
420
434
  export { defaultChatConfig, mergeConfig } from './config/chatConfig';
421
435
 
422
436
  // Types
423
- export type { ChatMessage, ChatThread, ChatConfig, ChatCallbacks } from './types/chatTypes';
424
- export type { MediaAttachment, ToolCall, ChatState, ChatUserContext, MemoryItem } from './types/chatTypes';
425
-
426
- // Utilities
427
- export { cn } from './lib/utils';
437
+ export type * from './types/chatTypes';
428
438
  ```
429
439
 
430
440
  ---
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { AgentOption } from '../../types/chatTypes';
3
+ interface ParticipantsSelectorProps {
4
+ /** All available agents */
5
+ agents: AgentOption[];
6
+ /** Currently selected participant IDs */
7
+ participantIds: string[];
8
+ /** Callback when participants change */
9
+ onParticipantsChange: (ids: string[]) => void;
10
+ /** Label for the selector */
11
+ label?: string;
12
+ /** Maximum participants to show in collapsed view */
13
+ maxVisible?: number;
14
+ /** Disabled state */
15
+ disabled?: boolean;
16
+ }
17
+ /**
18
+ * Multi-select dropdown for choosing which agents participate in the conversation.
19
+ */
20
+ export declare const ParticipantsSelector: React.FC<ParticipantsSelectorProps>;
21
+ interface TargetAgentSelectorProps {
22
+ /** Available agents (should be filtered to participants only) */
23
+ agents: AgentOption[];
24
+ /** Currently targeted agent ID */
25
+ targetAgentId: string | null;
26
+ /** Callback when target changes */
27
+ onTargetChange: (agentId: string | null) => void;
28
+ /** Label for the selector */
29
+ label?: string;
30
+ /** Placeholder when no target is selected */
31
+ placeholder?: string;
32
+ /** Disabled state */
33
+ disabled?: boolean;
34
+ }
35
+ /**
36
+ * Single-select dropdown for choosing which agent to address with @mention.
37
+ */
38
+ export declare const TargetAgentSelector: React.FC<TargetAgentSelectorProps>;
39
+ interface AgentBadgeProps {
40
+ agent: AgentOption;
41
+ onRemove?: () => void;
42
+ showRemove?: boolean;
43
+ size?: 'sm' | 'md';
44
+ }
45
+ /**
46
+ * Badge displaying an agent with optional remove button.
47
+ */
48
+ export declare const AgentBadge: React.FC<AgentBadgeProps>;
49
+ export {};
50
+ //# sourceMappingURL=AgentSelectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentSelectors.d.ts","sourceRoot":"","sources":["../../../src/components/chat/AgentSelectors.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAcpD,UAAU,yBAAyB;IACjC,2BAA2B;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,yCAAyC;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,wCAAwC;IACxC,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAoHnE,CAAC;AAIH,UAAU,wBAAwB;IAChC,iEAAiE;IACjE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,kCAAkC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mCAAmC;IACnC,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAqFjE,CAAC;AAIH,UAAU,eAAe;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAyC/C,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo, useMemo } from 'react';
3
+ import { Check, ChevronDown, Users, AtSign, X } from 'lucide-react';
4
+ import { Button } from '../ui/button';
5
+ import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';
6
+ import { Badge } from '../ui/badge';
7
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, DropdownMenuLabel, } from '../ui/dropdown-menu';
8
+ import { getAgentColor, getAgentInitials, assignAgentColors } from '../../lib/chatUtils';
9
+ /**
10
+ * Multi-select dropdown for choosing which agents participate in the conversation.
11
+ */
12
+ export const ParticipantsSelector = memo(({ agents, participantIds, onParticipantsChange, label = 'Team', maxVisible = 3, disabled = false, }) => {
13
+ // Assign colors to agents that don't have them
14
+ const agentsWithColors = useMemo(() => assignAgentColors(agents), [agents]);
15
+ // Get selected agents
16
+ const selectedAgents = useMemo(() => agentsWithColors.filter(a => participantIds.includes(a.id)), [agentsWithColors, participantIds]);
17
+ const toggleParticipant = (agentId) => {
18
+ if (participantIds.includes(agentId)) {
19
+ // Don't allow removing the last participant
20
+ if (participantIds.length > 1) {
21
+ onParticipantsChange(participantIds.filter(id => id !== agentId));
22
+ }
23
+ }
24
+ else {
25
+ onParticipantsChange([...participantIds, agentId]);
26
+ }
27
+ };
28
+ const selectAll = () => {
29
+ onParticipantsChange(agentsWithColors.map(a => a.id));
30
+ };
31
+ const visibleAgents = selectedAgents.slice(0, maxVisible);
32
+ const hiddenCount = selectedAgents.length - maxVisible;
33
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", className: "h-9 px-2 gap-1.5 text-sm hover:bg-accent/50", disabled: disabled, children: [_jsx(Users, { className: "h-4 w-4 text-muted-foreground" }), _jsx("div", { className: "flex items-center gap-1", children: visibleAgents.length > 0 ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex -space-x-1.5", children: visibleAgents.map(agent => (_jsxs(Avatar, { className: "h-5 w-5 border-2 border-background", children: [_jsx(AvatarImage, { src: agent.avatarUrl, alt: agent.name }), _jsx(AvatarFallback, { style: { backgroundColor: agent.color || getAgentColor(agent.id), color: 'white' }, className: "text-[8px]", children: getAgentInitials(agent.name) })] }, agent.id))) }), hiddenCount > 0 && (_jsxs("span", { className: "text-xs text-muted-foreground", children: ["+", hiddenCount] }))] })) : (_jsx("span", { className: "text-muted-foreground", children: label })) }), _jsx(ChevronDown, { className: "h-3 w-3 opacity-50" })] }) }), _jsxs(DropdownMenuContent, { align: "start", className: "w-[260px]", children: [_jsxs(DropdownMenuLabel, { className: "flex items-center justify-between", children: [_jsx("span", { children: "Participants" }), selectedAgents.length < agentsWithColors.length && (_jsx(Button, { variant: "ghost", size: "sm", className: "h-6 text-xs", onClick: selectAll, children: "Select All" }))] }), _jsx(DropdownMenuSeparator, {}), agentsWithColors.map(agent => {
34
+ const isSelected = participantIds.includes(agent.id);
35
+ const isLastSelected = isSelected && participantIds.length === 1;
36
+ return (_jsxs(DropdownMenuItem, { onClick: () => toggleParticipant(agent.id), className: "flex items-center gap-3 p-2 cursor-pointer", disabled: isLastSelected, children: [_jsxs(Avatar, { className: "h-6 w-6", children: [_jsx(AvatarImage, { src: agent.avatarUrl, alt: agent.name }), _jsx(AvatarFallback, { style: { backgroundColor: agent.color || getAgentColor(agent.id), color: 'white' }, className: "text-[10px]", children: getAgentInitials(agent.name) })] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "font-medium text-sm truncate", children: agent.name }), agent.description && (_jsx("div", { className: "text-xs text-muted-foreground truncate", children: agent.description }))] }), isSelected && (_jsx(Check, { className: "h-4 w-4 text-primary shrink-0" }))] }, agent.id));
37
+ })] })] }));
38
+ });
39
+ ParticipantsSelector.displayName = 'ParticipantsSelector';
40
+ /**
41
+ * Single-select dropdown for choosing which agent to address with @mention.
42
+ */
43
+ export const TargetAgentSelector = memo(({ agents, targetAgentId, onTargetChange, label = 'Target', placeholder = 'Select agent', disabled = false, }) => {
44
+ // Assign colors to agents
45
+ const agentsWithColors = useMemo(() => assignAgentColors(agents), [agents]);
46
+ // Get selected agent
47
+ const selectedAgent = useMemo(() => agentsWithColors.find(a => a.id === targetAgentId), [agentsWithColors, targetAgentId]);
48
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", className: "h-9 px-3 gap-1.5 font-medium text-base hover:bg-accent/50", disabled: disabled, children: [_jsx(AtSign, { className: "h-4 w-4 text-muted-foreground" }), selectedAgent ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Avatar, { className: "h-5 w-5", children: [_jsx(AvatarImage, { src: selectedAgent.avatarUrl, alt: selectedAgent.name }), _jsx(AvatarFallback, { style: { backgroundColor: selectedAgent.color || getAgentColor(selectedAgent.id), color: 'white' }, className: "text-[10px]", children: getAgentInitials(selectedAgent.name) })] }), _jsx("span", { className: "max-w-[150px] truncate", children: selectedAgent.name })] })) : (_jsx("span", { className: "text-muted-foreground", children: placeholder })), _jsx(ChevronDown, { className: "h-4 w-4 opacity-50" })] }) }), _jsxs(DropdownMenuContent, { align: "start", className: "w-[280px]", children: [_jsx(DropdownMenuLabel, { children: label }), _jsx(DropdownMenuSeparator, {}), agentsWithColors.map(agent => {
49
+ const isSelected = agent.id === targetAgentId;
50
+ return (_jsxs(DropdownMenuItem, { onClick: () => onTargetChange(agent.id), className: "flex items-start gap-3 p-3 cursor-pointer", children: [_jsxs(Avatar, { className: "h-6 w-6 mt-0.5 shrink-0", children: [_jsx(AvatarImage, { src: agent.avatarUrl, alt: agent.name }), _jsx(AvatarFallback, { style: { backgroundColor: agent.color || getAgentColor(agent.id), color: 'white' }, className: "text-[10px]", children: getAgentInitials(agent.name) })] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-medium text-sm", children: agent.name }), isSelected && (_jsx(Check, { className: "h-4 w-4 text-primary shrink-0" }))] }), agent.description && (_jsx("p", { className: "text-xs text-muted-foreground mt-0.5 line-clamp-2", children: agent.description }))] })] }, agent.id));
51
+ })] })] }));
52
+ });
53
+ TargetAgentSelector.displayName = 'TargetAgentSelector';
54
+ /**
55
+ * Badge displaying an agent with optional remove button.
56
+ */
57
+ export const AgentBadge = memo(({ agent, onRemove, showRemove = false, size = 'md', }) => {
58
+ const color = agent.color || getAgentColor(agent.id);
59
+ const avatarSize = size === 'sm' ? 'h-4 w-4' : 'h-5 w-5';
60
+ const textSize = size === 'sm' ? 'text-xs' : 'text-sm';
61
+ return (_jsxs(Badge, { variant: "secondary", className: "flex items-center gap-1.5 pr-1", style: { borderColor: color, borderWidth: 1 }, children: [_jsxs(Avatar, { className: avatarSize, children: [_jsx(AvatarImage, { src: agent.avatarUrl, alt: agent.name }), _jsx(AvatarFallback, { style: { backgroundColor: color, color: 'white' }, className: "text-[8px]", children: getAgentInitials(agent.name) })] }), _jsx("span", { className: textSize, children: agent.name }), showRemove && onRemove && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-4 w-4 ml-0.5 hover:bg-destructive/20", onClick: (e) => {
62
+ e.stopPropagation();
63
+ onRemove();
64
+ }, children: _jsx(X, { className: "h-3 w-3" }) }))] }));
65
+ });
66
+ AgentBadge.displayName = 'AgentBadge';
67
+ //# sourceMappingURL=AgentSelectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentSelectors.js","sourceRoot":"","sources":["../../../src/components/chat/AgentSelectors.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { ActivityDisplayMode, AssistantActivityState, ChatConfig } from '../../types/chatTypes';
3
+ type ActivityLabels = ChatConfig['labels'];
4
+ interface AssistantActivityProps {
5
+ activity?: AssistantActivityState;
6
+ displayMode: ActivityDisplayMode;
7
+ labels?: ActivityLabels;
8
+ }
9
+ export declare const AssistantActivity: React.NamedExoticComponent<AssistantActivityProps>;
10
+ export {};
11
+ //# sourceMappingURL=AssistantActivity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantActivity.d.ts","sourceRoot":"","sources":["../../../src/components/chat/AssistantActivity.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,UAAU,EAAY,MAAM,uBAAuB,CAAC;AAQ/G,KAAK,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;AAE3C,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAgJD,eAAO,MAAM,iBAAiB,oDAwD5B,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useEffect, useMemo, useState } from 'react';
3
+ import { cn } from '../../lib/utils';
4
+ import { Badge } from '../ui/badge';
5
+ import { Button } from '../ui/button';
6
+ import { Card, CardContent } from '../ui/card';
7
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';
8
+ import { Brain, ChevronDown, ChevronRight, LoaderCircle, Sparkles, Wrench } from 'lucide-react';
9
+ const interpolate = (template, replacements) => (Object.entries(replacements).reduce((output, [key, value]) => output.replaceAll(`{{${key}}}`, String(value ?? '')), template));
10
+ const resolveSummaryLabel = (activity, labels) => {
11
+ const summary = activity.summary;
12
+ if (summary.kind === 'using_tools') {
13
+ if (summary.toolName) {
14
+ return interpolate(labels?.activityToolRunning || 'Using {{tool}}...', {
15
+ tool: summary.toolName,
16
+ });
17
+ }
18
+ if (typeof summary.toolCount === 'number' && summary.toolCount > 1) {
19
+ return interpolate(labels?.activityMultipleTools || 'Using {{count}} tools...', {
20
+ count: summary.toolCount,
21
+ });
22
+ }
23
+ return labels?.activityUsingTools || 'Using tools...';
24
+ }
25
+ if (summary.kind === 'preparing_answer') {
26
+ return labels?.activityPreparingAnswer || 'Preparing answer...';
27
+ }
28
+ if (summary.kind === 'working') {
29
+ return labels?.activityWorking || 'Working...';
30
+ }
31
+ return labels?.activityThinking || 'Thinking...';
32
+ };
33
+ const getStatusIcon = (toolCall) => {
34
+ if (toolCall.status === 'failed') {
35
+ return _jsx(Badge, { variant: "destructive", children: "failed" });
36
+ }
37
+ if (toolCall.status === 'completed') {
38
+ return _jsx(Badge, { variant: "secondary", className: "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300", children: "done" });
39
+ }
40
+ if (toolCall.status === 'running') {
41
+ return _jsx(Badge, { variant: "secondary", className: "bg-primary/10 text-primary", children: "running" });
42
+ }
43
+ return _jsx(Badge, { variant: "secondary", children: "pending" });
44
+ };
45
+ const AssistantActivitySkeleton = memo(function AssistantActivitySkeleton() {
46
+ return (_jsxs("div", { className: "mb-3 flex items-center gap-3 rounded-lg border border-border/50 bg-muted/20 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "inline-block h-2 w-2 rounded-full bg-primary/80 animate-pulse" }), _jsx("span", { className: "inline-block h-2 w-2 rounded-full bg-primary/60 animate-pulse [animation-delay:120ms]" }), _jsx("span", { className: "inline-block h-2 w-2 rounded-full bg-primary/40 animate-pulse [animation-delay:240ms]" })] }), _jsx("div", { className: "h-3 w-28 rounded-full bg-muted animate-pulse" })] }));
47
+ });
48
+ const AssistantActivitySummary = memo(function AssistantActivitySummary({ activity, labels, }) {
49
+ const summaryLabel = useMemo(() => resolveSummaryLabel(activity, labels), [activity, labels]);
50
+ const isActive = activity.isActive;
51
+ const icon = activity.summary.kind === 'using_tools'
52
+ ? _jsx(Wrench, { className: cn('h-4 w-4 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground') })
53
+ : activity.summary.kind === 'preparing_answer'
54
+ ? _jsx(Sparkles, { className: cn('h-4 w-4 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground') })
55
+ : _jsx(Brain, { className: cn('h-4 w-4 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground') });
56
+ return (_jsxs("div", { className: cn('flex items-center gap-2 rounded-lg border px-3 py-2 text-sm transition-colors', isActive ? 'border-primary/30 bg-primary/5 text-foreground' : 'border-border/60 bg-muted/20 text-muted-foreground'), children: [icon, _jsx("span", { className: "min-w-0 flex-1 truncate", children: summaryLabel }), isActive && _jsx(LoaderCircle, { className: "h-4 w-4 shrink-0 animate-spin text-primary" })] }));
57
+ });
58
+ const AssistantActivityDetails = memo(function AssistantActivityDetails({ activity, }) {
59
+ return (_jsxs("div", { className: "space-y-3 pt-3", children: [activity.reasoning && (_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Reasoning" }), _jsx("div", { className: "whitespace-pre-wrap break-words text-sm leading-6 text-muted-foreground", children: activity.reasoning })] })), Array.isArray(activity.toolCalls) && activity.toolCalls.length > 0 && (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Tools" }), activity.toolCalls.map((toolCall) => (_jsx(Card, { className: "border-border/60 bg-background/70", children: _jsxs(CardContent, { className: "space-y-2 px-3 py-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("div", { className: "min-w-0", children: _jsx("div", { className: "truncate text-sm font-medium", children: toolCall.name }) }), getStatusIcon(toolCall)] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { children: [_jsx("div", { className: "mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: "Args" }), _jsx("pre", { className: "overflow-x-auto rounded-md bg-muted/70 p-2 text-xs text-muted-foreground", children: JSON.stringify(toolCall.arguments, null, 2) })] }), typeof toolCall.result !== 'undefined' && (_jsxs("div", { children: [_jsx("div", { className: "mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: "Result" }), _jsx("pre", { className: "overflow-x-auto rounded-md bg-muted/70 p-2 text-xs text-muted-foreground", children: JSON.stringify(toolCall.result, null, 2) })] }))] })] }) }, toolCall.id)))] }))] }));
60
+ });
61
+ export const AssistantActivity = memo(function AssistantActivity({ activity, displayMode, labels, }) {
62
+ if (!activity)
63
+ return null;
64
+ if (displayMode === 'hidden') {
65
+ return activity.isActive ? _jsx(AssistantActivitySkeleton, {}) : null;
66
+ }
67
+ if (displayMode === 'summary') {
68
+ if (!activity.isActive && activity.isComplete)
69
+ return null;
70
+ return (_jsx("div", { className: "mb-3", children: _jsx(AssistantActivitySummary, { activity: activity, labels: labels }) }));
71
+ }
72
+ const hasDetails = Boolean(activity.reasoning) || Boolean(activity.toolCalls?.length);
73
+ const defaultOpen = activity.isActive && hasDetails;
74
+ const [open, setOpen] = useState(defaultOpen);
75
+ useEffect(() => {
76
+ if (activity.isActive && hasDetails) {
77
+ setOpen(true);
78
+ }
79
+ }, [activity.isActive, hasDetails]);
80
+ return (_jsx("div", { className: "mb-3", children: _jsx(Collapsible, { open: open, onOpenChange: setOpen, children: _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "min-w-0 flex-1", children: _jsx(AssistantActivitySummary, { activity: activity, labels: labels }) }), hasDetails && (_jsx(CollapsibleTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", size: "sm", className: "h-9 shrink-0 px-2 text-xs text-muted-foreground", children: [open ? (labels?.activityHideDetails || 'Hide details') : (labels?.activityShowDetails || 'Show details'), open ? _jsx(ChevronDown, { className: "ml-1 h-3.5 w-3.5" }) : _jsx(ChevronRight, { className: "ml-1 h-3.5 w-3.5" })] }) }))] }), hasDetails && (_jsx(CollapsibleContent, { className: "overflow-hidden rounded-lg border border-border/60 bg-muted/10 px-3", children: _jsx(AssistantActivityDetails, { activity: activity }) }))] }) }) }));
81
+ });
82
+ //# sourceMappingURL=AssistantActivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantActivity.js","sourceRoot":"","sources":["../../../src/components/chat/AssistantActivity.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { ReactNode } from 'react';
3
+ import type { AgentOption } from '../../types/chatTypes';
4
+ export interface ChatHeaderConfig {
5
+ branding?: {
6
+ logo?: ReactNode;
7
+ title?: string;
8
+ subtitle?: string;
9
+ };
10
+ agentSelector?: {
11
+ enabled?: boolean;
12
+ label?: string;
13
+ hideIfSingle?: boolean;
14
+ };
15
+ labels?: {
16
+ newThread?: string;
17
+ exportData?: string;
18
+ importData?: string;
19
+ clearAll?: string;
20
+ sidebarToggle?: string;
21
+ customComponentToggle?: string;
22
+ settings?: string;
23
+ toggleDarkMode?: string;
24
+ lightMode?: string;
25
+ darkMode?: string;
26
+ };
27
+ customComponent?: {
28
+ label?: string;
29
+ icon?: ReactNode;
30
+ onClick?: () => void;
31
+ };
32
+ /** Additional actions to render in the header (before the settings menu) */
33
+ headerActions?: ReactNode;
34
+ }
35
+ export interface ChatHeaderProps {
36
+ config: ChatHeaderConfig;
37
+ currentThreadTitle?: string | null;
38
+ onSidebarToggle?: () => void;
39
+ onCustomComponentToggle?: () => void;
40
+ onNewThread?: () => void;
41
+ onExportData?: () => void;
42
+ onImportData?: (file: File) => void;
43
+ onClearAll?: () => void;
44
+ showCustomComponentButton?: boolean;
45
+ isMobile?: boolean;
46
+ showAgentSelector?: boolean;
47
+ isMultiAgentMode?: boolean;
48
+ agentOptions?: AgentOption[];
49
+ selectedAgentId?: string | null;
50
+ onSelectAgent?: (agentId: string) => void;
51
+ participantIds?: string[];
52
+ onParticipantsChange?: (ids: string[]) => void;
53
+ className?: string;
54
+ }
55
+ export declare const ChatHeader: React.FC<ChatHeaderProps>;
56
+ //# sourceMappingURL=ChatHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHeader.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAyB1B,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,SAAS,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,SAAS,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;KACtB,CAAC;IACF,4EAA4E;IAC5E,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAmRhD,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Card, CardHeader } from '../ui/card';
4
+ import { Button } from '../ui/button';
5
+ import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';
6
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';
7
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '../ui/dropdown-menu';
8
+ import { Bot, MoreVertical, Download, Upload, Trash2, Plus, Menu, Moon, Sun, ChevronDown, Check, } from 'lucide-react';
9
+ import { SidebarTrigger } from '../ui/sidebar';
10
+ import { ParticipantsSelector } from './AgentSelectors';
11
+ export const ChatHeader = ({ config, currentThreadTitle, onSidebarToggle: _onSidebarToggle, onCustomComponentToggle, onNewThread, onExportData, onImportData, onClearAll, showCustomComponentButton, isMobile, showAgentSelector = false, isMultiAgentMode = false, agentOptions = [], selectedAgentId = null, onSelectAgent, participantIds, onParticipantsChange, className = '', }) => {
12
+ const [isDarkMode, setIsDarkMode] = React.useState(() => {
13
+ if (typeof window === 'undefined')
14
+ return false;
15
+ return document.documentElement.classList.contains('dark');
16
+ });
17
+ React.useEffect(() => {
18
+ const observer = new MutationObserver(() => {
19
+ setIsDarkMode(document.documentElement.classList.contains('dark'));
20
+ });
21
+ observer.observe(document.documentElement, {
22
+ attributes: true,
23
+ attributeFilter: ['class'],
24
+ });
25
+ // Listen for system theme changes
26
+ const mediaQuery = globalThis.matchMedia('(prefers-color-scheme: dark)');
27
+ const handleSystemThemeChange = (e) => {
28
+ const savedTheme = localStorage.getItem('theme');
29
+ if (!savedTheme) {
30
+ // Only update if user hasn't set an explicit preference
31
+ setIsDarkMode(e.matches);
32
+ }
33
+ };
34
+ mediaQuery.addEventListener('change', handleSystemThemeChange);
35
+ return () => {
36
+ observer.disconnect();
37
+ mediaQuery.removeEventListener('change', handleSystemThemeChange);
38
+ };
39
+ }, []);
40
+ const toggleDarkMode = () => {
41
+ const isDark = document.documentElement.classList.contains('dark');
42
+ if (isDark) {
43
+ document.documentElement.classList.remove('dark');
44
+ localStorage.setItem('theme', 'light');
45
+ }
46
+ else {
47
+ document.documentElement.classList.add('dark');
48
+ localStorage.setItem('theme', 'dark');
49
+ }
50
+ setIsDarkMode(!isDark);
51
+ };
52
+ const handleImportClick = () => {
53
+ const input = document.createElement('input');
54
+ input.type = 'file';
55
+ input.accept = '.json';
56
+ input.onchange = (e) => {
57
+ const file = e.target.files?.[0];
58
+ if (file && onImportData) {
59
+ onImportData(file);
60
+ }
61
+ };
62
+ input.click();
63
+ };
64
+ const selectedAgent = agentOptions.find((agent) => agent.id === selectedAgentId) || null;
65
+ const agentPlaceholder = config.agentSelector?.label || 'Select agent';
66
+ return (_jsx(Card, { "data-chat-header": true, className: `py-0 border-b rounded-none relative z-10 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80 ${className}`, style: isMobile ? { paddingTop: 'env(safe-area-inset-top)' } : undefined, children: _jsx(CardHeader, { className: "p-2", children: _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(SidebarTrigger, { className: "-ml-1" }) }), _jsx(TooltipContent, { children: config.labels?.sidebarToggle || 'Toggle Sidebar' })] }), showAgentSelector && isMultiAgentMode && onParticipantsChange && (_jsx(ParticipantsSelector, { agents: agentOptions, participantIds: participantIds ?? agentOptions.map(a => a.id), onParticipantsChange: onParticipantsChange })), showAgentSelector && !isMultiAgentMode && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", className: "h-9 px-3 gap-1.5 font-medium text-base hover:bg-accent/50", children: [selectedAgent?.avatarUrl ? (_jsxs(Avatar, { className: "h-5 w-5", children: [_jsx(AvatarImage, { src: selectedAgent.avatarUrl, alt: selectedAgent.name }), _jsx(AvatarFallback, { className: "text-[10px]", children: selectedAgent.name.charAt(0).toUpperCase() })] })) : null, _jsx("span", { className: "max-w-[200px] truncate", children: selectedAgent?.name || agentPlaceholder }), _jsx(ChevronDown, { className: "h-4 w-4 opacity-50" })] }) }), _jsx(DropdownMenuContent, { align: "start", className: "w-[280px]", children: agentOptions.map((agent) => {
67
+ const isSelected = agent.id === selectedAgentId;
68
+ return (_jsxs(DropdownMenuItem, { onClick: () => onSelectAgent?.(agent.id), className: "flex items-start gap-3 p-3 cursor-pointer", children: [agent.avatarUrl ? (_jsxs(Avatar, { className: "h-6 w-6 mt-0.5 shrink-0", children: [_jsx(AvatarImage, { src: agent.avatarUrl, alt: agent.name }), _jsx(AvatarFallback, { className: "text-[10px]", children: agent.name.charAt(0).toUpperCase() })] })) : (_jsx("div", { className: "h-6 w-6 mt-0.5 shrink-0 flex items-center justify-center rounded-full bg-primary/10", children: _jsx(Bot, { className: "h-3.5 w-3.5 text-primary" }) })), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-medium text-sm", children: agent.name }), isSelected && (_jsx(Check, { className: "h-4 w-4 text-primary shrink-0" }))] }), agent.description && (_jsx("p", { className: "text-xs text-muted-foreground mt-0.5 line-clamp-2", children: agent.description }))] })] }, agent.id));
69
+ }) })] })), !showAgentSelector && isMobile && (_jsx("span", { className: "text-sm font-medium truncate max-w-[150px] ml-2", children: currentThreadTitle || config.branding?.title || 'Chat' }))] }), _jsx("div", { className: "flex-1" }), _jsxs("div", { className: "flex items-center gap-1", children: [showCustomComponentButton && config.customComponent && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: "h-8 w-8", onClick: onCustomComponentToggle, children: config.customComponent.icon || _jsx(Menu, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { children: config.customComponent.label || config.labels?.customComponentToggle || 'Toggle' })] })), config.headerActions, _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: "h-8 w-8", children: _jsx(MoreVertical, { className: "h-4 w-4" }) }) }), _jsxs(DropdownMenuContent, { align: "end", children: [onNewThread && (_jsxs(_Fragment, { children: [_jsxs(DropdownMenuItem, { onClick: () => onNewThread?.(), className: "font-medium text-primary", children: [_jsx(Plus, { className: "h-4 w-4 mr-2" }), config.labels?.newThread || 'New Thread'] }), _jsx(DropdownMenuSeparator, {})] })), onExportData && (_jsxs(DropdownMenuItem, { onClick: onExportData, children: [_jsx(Download, { className: "h-4 w-4 mr-2" }), config.labels?.exportData || 'Export Data'] })), onImportData && (_jsxs(DropdownMenuItem, { onClick: handleImportClick, children: [_jsx(Upload, { className: "h-4 w-4 mr-2" }), config.labels?.importData || 'Import Data'] })), (onExportData || onImportData) && (_jsx(DropdownMenuSeparator, {})), _jsx(DropdownMenuItem, { onClick: toggleDarkMode, children: isDarkMode ? (_jsxs(_Fragment, { children: [_jsx(Sun, { className: "h-4 w-4 mr-2" }), config.labels?.lightMode || 'Light Mode'] })) : (_jsxs(_Fragment, { children: [_jsx(Moon, { className: "h-4 w-4 mr-2" }), config.labels?.darkMode || 'Dark Mode'] })) }), onClearAll && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onClick: onClearAll, className: "text-destructive", children: [_jsx(Trash2, { className: "h-4 w-4 mr-2" }), config.labels?.clearAll || 'Clear All'] })] }))] })] })] })] }) }) }));
70
+ };
71
+ //# sourceMappingURL=ChatHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHeader.js","sourceRoot":"","sources":["../../../src/components/chat/ChatHeader.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { AgentOption, MediaAttachment, ChatConfig } from '../../types/chatTypes';
3
+ interface ChatInputProps {
4
+ value: string;
5
+ onChange: (value: string) => void;
6
+ onSubmit: (content: string, attachments: MediaAttachment[]) => void;
7
+ attachments: MediaAttachment[];
8
+ onAttachmentsChange: (attachments: MediaAttachment[]) => void;
9
+ placeholder?: string;
10
+ disabled?: boolean;
11
+ isGenerating?: boolean;
12
+ onStopGeneration?: () => void;
13
+ enableFileUpload?: boolean;
14
+ enableAudioRecording?: boolean;
15
+ maxAttachments?: number;
16
+ maxFileSize?: number;
17
+ acceptedFileTypes?: string[];
18
+ className?: string;
19
+ config?: ChatConfig;
20
+ mentionAgents?: AgentOption[];
21
+ onTargetAgentChange?: (agentId: string | null) => void;
22
+ }
23
+ export declare const ChatInput: React.FC<ChatInputProps>;
24
+ export {};
25
+ //# sourceMappingURL=ChatInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAE9E,OAAO,EACL,WAAW,EACX,eAAe,EAEf,UAAU,EAKX,MAAM,uBAAuB,CAAC;AAwB/B,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IACpE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,mBAAmB,EAAE,CAAC,WAAW,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACxD;AA+QD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAm5B7C,CAAC"}