@agentuity/workbench 0.0.86 → 0.0.88

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 (271) hide show
  1. package/dist/components/App.d.ts.map +1 -1
  2. package/dist/components/App.js +18 -2
  3. package/dist/components/App.js.map +1 -1
  4. package/dist/components/ai-elements/code-block.d.ts +3 -3
  5. package/dist/components/ai-elements/code-block.d.ts.map +1 -1
  6. package/dist/components/ai-elements/code-block.js +29 -7
  7. package/dist/components/ai-elements/code-block.js.map +1 -1
  8. package/dist/components/internal/Chat.d.ts +3 -2
  9. package/dist/components/internal/Chat.d.ts.map +1 -1
  10. package/dist/components/internal/Chat.js +23 -24
  11. package/dist/components/internal/Chat.js.map +1 -1
  12. package/dist/components/internal/InputSection.d.ts +3 -2
  13. package/dist/components/internal/InputSection.d.ts.map +1 -1
  14. package/dist/components/internal/InputSection.js +68 -6
  15. package/dist/components/internal/InputSection.js.map +1 -1
  16. package/dist/components/internal/MonacoJsonEditor.d.ts +3 -1
  17. package/dist/components/internal/MonacoJsonEditor.d.ts.map +1 -1
  18. package/dist/components/internal/MonacoJsonEditor.js +41 -57
  19. package/dist/components/internal/MonacoJsonEditor.js.map +1 -1
  20. package/dist/components/internal/Schema.d.ts +1 -2
  21. package/dist/components/internal/Schema.d.ts.map +1 -1
  22. package/dist/components/internal/Schema.js +2 -3
  23. package/dist/components/internal/Schema.js.map +1 -1
  24. package/dist/components/internal/WorkbenchProvider.d.ts.map +1 -1
  25. package/dist/components/internal/WorkbenchProvider.js +55 -8
  26. package/dist/components/internal/WorkbenchProvider.js.map +1 -1
  27. package/dist/components/ui/button.d.ts +1 -1
  28. package/dist/components/ui/input-group.js +2 -2
  29. package/dist/components/ui/input-group.js.map +1 -1
  30. package/dist/components/ui/input.d.ts.map +1 -1
  31. package/dist/components/ui/input.js +1 -1
  32. package/dist/components/ui/input.js.map +1 -1
  33. package/dist/index.d.ts +3 -5
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -6
  36. package/dist/index.js.map +1 -1
  37. package/dist/{styles.css → standalone.css} +206 -1554
  38. package/package.json +29 -29
  39. package/src/{styles.css → base.css} +36 -52
  40. package/src/components/App.tsx +41 -5
  41. package/src/components/ai-elements/code-block.tsx +42 -10
  42. package/src/components/internal/Chat.tsx +112 -119
  43. package/src/components/internal/InputSection.tsx +79 -9
  44. package/src/components/internal/MonacoJsonEditor.tsx +59 -65
  45. package/src/components/internal/Schema.tsx +74 -86
  46. package/src/components/internal/WorkbenchProvider.tsx +69 -10
  47. package/src/components/ui/input-group.tsx +2 -2
  48. package/src/components/ui/input.tsx +2 -3
  49. package/src/index.ts +5 -14
  50. package/src/integration.css +15 -0
  51. package/src/standalone.css +25 -0
  52. package/dist/components/ConnectionStatus.d.ts +0 -7
  53. package/dist/components/ConnectionStatus.d.ts.map +0 -1
  54. package/dist/components/ConnectionStatus.js +0 -52
  55. package/dist/components/ConnectionStatus.js.map +0 -1
  56. package/dist/components/Inline.d.ts +0 -10
  57. package/dist/components/Inline.d.ts.map +0 -1
  58. package/dist/components/Inline.js +0 -11
  59. package/dist/components/Inline.js.map +0 -1
  60. package/dist/components/ai-elements/artifact.d.ts +0 -24
  61. package/dist/components/ai-elements/artifact.d.ts.map +0 -1
  62. package/dist/components/ai-elements/artifact.js +0 -21
  63. package/dist/components/ai-elements/artifact.js.map +0 -1
  64. package/dist/components/ai-elements/branch.d.ts +0 -21
  65. package/dist/components/ai-elements/branch.d.ts.map +0 -1
  66. package/dist/components/ai-elements/branch.js +0 -71
  67. package/dist/components/ai-elements/branch.js.map +0 -1
  68. package/dist/components/ai-elements/canvas.d.ts +0 -9
  69. package/dist/components/ai-elements/canvas.d.ts.map +0 -1
  70. package/dist/components/ai-elements/canvas.js +0 -6
  71. package/dist/components/ai-elements/canvas.js.map +0 -1
  72. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  73. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  74. package/dist/components/ai-elements/chain-of-thought.js +0 -52
  75. package/dist/components/ai-elements/chain-of-thought.js.map +0 -1
  76. package/dist/components/ai-elements/confirmation.d.ts +0 -27
  77. package/dist/components/ai-elements/confirmation.d.ts.map +0 -1
  78. package/dist/components/ai-elements/confirmation.js +0 -57
  79. package/dist/components/ai-elements/confirmation.js.map +0 -1
  80. package/dist/components/ai-elements/connection.d.ts +0 -3
  81. package/dist/components/ai-elements/connection.d.ts.map +0 -1
  82. package/dist/components/ai-elements/connection.js +0 -4
  83. package/dist/components/ai-elements/connection.js.map +0 -1
  84. package/dist/components/ai-elements/context.d.ts +0 -33
  85. package/dist/components/ai-elements/context.d.ts.map +0 -1
  86. package/dist/components/ai-elements/context.js +0 -167
  87. package/dist/components/ai-elements/context.js.map +0 -1
  88. package/dist/components/ai-elements/controls.d.ts +0 -5
  89. package/dist/components/ai-elements/controls.d.ts.map +0 -1
  90. package/dist/components/ai-elements/controls.js +0 -6
  91. package/dist/components/ai-elements/controls.js.map +0 -1
  92. package/dist/components/ai-elements/edge.d.ts +0 -6
  93. package/dist/components/ai-elements/edge.d.ts.map +0 -1
  94. package/dist/components/ai-elements/edge.js +0 -83
  95. package/dist/components/ai-elements/edge.js.map +0 -1
  96. package/dist/components/ai-elements/image.d.ts +0 -7
  97. package/dist/components/ai-elements/image.d.ts.map +0 -1
  98. package/dist/components/ai-elements/image.js +0 -4
  99. package/dist/components/ai-elements/image.js.map +0 -1
  100. package/dist/components/ai-elements/inline-citation.d.ts +0 -39
  101. package/dist/components/ai-elements/inline-citation.d.ts.map +0 -1
  102. package/dist/components/ai-elements/inline-citation.js +0 -62
  103. package/dist/components/ai-elements/inline-citation.js.map +0 -1
  104. package/dist/components/ai-elements/loader.d.ts +0 -6
  105. package/dist/components/ai-elements/loader.d.ts.map +0 -1
  106. package/dist/components/ai-elements/loader.js +0 -5
  107. package/dist/components/ai-elements/loader.js.map +0 -1
  108. package/dist/components/ai-elements/node.d.ts +0 -22
  109. package/dist/components/ai-elements/node.d.ts.map +0 -1
  110. package/dist/components/ai-elements/node.js +0 -12
  111. package/dist/components/ai-elements/node.js.map +0 -1
  112. package/dist/components/ai-elements/open-in-chat.d.ts +0 -29
  113. package/dist/components/ai-elements/open-in-chat.d.ts.map +0 -1
  114. package/dist/components/ai-elements/open-in-chat.js +0 -97
  115. package/dist/components/ai-elements/open-in-chat.js.map +0 -1
  116. package/dist/components/ai-elements/panel.d.ts +0 -6
  117. package/dist/components/ai-elements/panel.d.ts.map +0 -1
  118. package/dist/components/ai-elements/panel.js +0 -5
  119. package/dist/components/ai-elements/panel.js.map +0 -1
  120. package/dist/components/ai-elements/plan.d.ts +0 -26
  121. package/dist/components/ai-elements/plan.d.ts.map +0 -1
  122. package/dist/components/ai-elements/plan.js +0 -32
  123. package/dist/components/ai-elements/plan.js.map +0 -1
  124. package/dist/components/ai-elements/queue.d.ts +0 -62
  125. package/dist/components/ai-elements/queue.d.ts.map +0 -1
  126. package/dist/components/ai-elements/queue.js +0 -25
  127. package/dist/components/ai-elements/queue.js.map +0 -1
  128. package/dist/components/ai-elements/reasoning.d.ts +0 -17
  129. package/dist/components/ai-elements/reasoning.d.ts.map +0 -1
  130. package/dist/components/ai-elements/reasoning.js +0 -77
  131. package/dist/components/ai-elements/reasoning.js.map +0 -1
  132. package/dist/components/ai-elements/response.d.ts +0 -6
  133. package/dist/components/ai-elements/response.d.ts.map +0 -1
  134. package/dist/components/ai-elements/response.js +0 -8
  135. package/dist/components/ai-elements/response.js.map +0 -1
  136. package/dist/components/ai-elements/sources.d.ts +0 -13
  137. package/dist/components/ai-elements/sources.d.ts.map +0 -1
  138. package/dist/components/ai-elements/sources.js +0 -10
  139. package/dist/components/ai-elements/sources.js.map +0 -1
  140. package/dist/components/ai-elements/suggestion.d.ts +0 -11
  141. package/dist/components/ai-elements/suggestion.d.ts.map +0 -1
  142. package/dist/components/ai-elements/suggestion.js +0 -13
  143. package/dist/components/ai-elements/suggestion.js.map +0 -1
  144. package/dist/components/ai-elements/task.d.ts +0 -15
  145. package/dist/components/ai-elements/task.d.ts.map +0 -1
  146. package/dist/components/ai-elements/task.js +0 -11
  147. package/dist/components/ai-elements/task.js.map +0 -1
  148. package/dist/components/ai-elements/tool.d.ts +0 -24
  149. package/dist/components/ai-elements/tool.d.ts.map +0 -1
  150. package/dist/components/ai-elements/tool.js +0 -47
  151. package/dist/components/ai-elements/tool.js.map +0 -1
  152. package/dist/components/ai-elements/toolbar.d.ts +0 -6
  153. package/dist/components/ai-elements/toolbar.d.ts.map +0 -1
  154. package/dist/components/ai-elements/toolbar.js +0 -5
  155. package/dist/components/ai-elements/toolbar.js.map +0 -1
  156. package/dist/components/ai-elements/web-preview.d.ts +0 -35
  157. package/dist/components/ai-elements/web-preview.d.ts.map +0 -1
  158. package/dist/components/ai-elements/web-preview.js +0 -63
  159. package/dist/components/ai-elements/web-preview.js.map +0 -1
  160. package/dist/components/ui/alert.d.ts +0 -10
  161. package/dist/components/ui/alert.d.ts.map +0 -1
  162. package/dist/components/ui/alert.js +0 -25
  163. package/dist/components/ui/alert.js.map +0 -1
  164. package/dist/components/ui/badge.d.ts +0 -10
  165. package/dist/components/ui/badge.d.ts.map +0 -1
  166. package/dist/components/ui/badge.js +0 -23
  167. package/dist/components/ui/badge.js.map +0 -1
  168. package/dist/components/ui/card.d.ts +0 -10
  169. package/dist/components/ui/card.d.ts.map +0 -1
  170. package/dist/components/ui/card.js +0 -25
  171. package/dist/components/ui/card.js.map +0 -1
  172. package/dist/components/ui/carousel.d.ts +0 -20
  173. package/dist/components/ui/carousel.d.ts.map +0 -1
  174. package/dist/components/ui/carousel.js +0 -92
  175. package/dist/components/ui/carousel.js.map +0 -1
  176. package/dist/components/ui/checkbox.d.ts +0 -5
  177. package/dist/components/ui/checkbox.d.ts.map +0 -1
  178. package/dist/components/ui/checkbox.js +0 -9
  179. package/dist/components/ui/checkbox.js.map +0 -1
  180. package/dist/components/ui/collapsible.d.ts +0 -6
  181. package/dist/components/ui/collapsible.d.ts.map +0 -1
  182. package/dist/components/ui/collapsible.js +0 -14
  183. package/dist/components/ui/collapsible.js.map +0 -1
  184. package/dist/components/ui/field.d.ts +0 -25
  185. package/dist/components/ui/field.d.ts.map +0 -1
  186. package/dist/components/ui/field.js +0 -74
  187. package/dist/components/ui/field.js.map +0 -1
  188. package/dist/components/ui/form.d.ts +0 -25
  189. package/dist/components/ui/form.d.ts.map +0 -1
  190. package/dist/components/ui/form.js +0 -58
  191. package/dist/components/ui/form.js.map +0 -1
  192. package/dist/components/ui/label.d.ts +0 -5
  193. package/dist/components/ui/label.d.ts.map +0 -1
  194. package/dist/components/ui/label.js +0 -9
  195. package/dist/components/ui/label.js.map +0 -1
  196. package/dist/components/ui/progress.d.ts +0 -5
  197. package/dist/components/ui/progress.d.ts.map +0 -1
  198. package/dist/components/ui/progress.js +0 -9
  199. package/dist/components/ui/progress.js.map +0 -1
  200. package/dist/components/ui/separator.d.ts +0 -5
  201. package/dist/components/ui/separator.d.ts.map +0 -1
  202. package/dist/components/ui/separator.js +0 -9
  203. package/dist/components/ui/separator.js.map +0 -1
  204. package/dist/components/ui/switch.d.ts +0 -5
  205. package/dist/components/ui/switch.d.ts.map +0 -1
  206. package/dist/components/ui/switch.js +0 -8
  207. package/dist/components/ui/switch.js.map +0 -1
  208. package/dist/components/ui/tabs.d.ts +0 -8
  209. package/dist/components/ui/tabs.d.ts.map +0 -1
  210. package/dist/components/ui/tabs.js +0 -17
  211. package/dist/components/ui/tabs.js.map +0 -1
  212. package/dist/components/ui/toggle.d.ts +0 -10
  213. package/dist/components/ui/toggle.d.ts.map +0 -1
  214. package/dist/components/ui/toggle.js +0 -26
  215. package/dist/components/ui/toggle.js.map +0 -1
  216. package/dist/components.d.ts +0 -12
  217. package/dist/components.d.ts.map +0 -1
  218. package/dist/components.js +0 -13
  219. package/dist/components.js.map +0 -1
  220. package/dist/hooks/index.d.ts +0 -7
  221. package/dist/hooks/index.d.ts.map +0 -1
  222. package/dist/hooks/index.js +0 -5
  223. package/dist/hooks/index.js.map +0 -1
  224. package/dist/hooks/useWorkbenchSchemas.d.ts +0 -56
  225. package/dist/hooks/useWorkbenchSchemas.d.ts.map +0 -1
  226. package/dist/hooks/useWorkbenchSchemas.js +0 -63
  227. package/dist/hooks/useWorkbenchSchemas.js.map +0 -1
  228. package/src/components/ConnectionStatus.tsx +0 -67
  229. package/src/components/Inline.tsx +0 -16
  230. package/src/components/ai-elements/artifact.tsx +0 -118
  231. package/src/components/ai-elements/branch.tsx +0 -187
  232. package/src/components/ai-elements/canvas.tsx +0 -24
  233. package/src/components/ai-elements/chain-of-thought.tsx +0 -198
  234. package/src/components/ai-elements/confirmation.tsx +0 -119
  235. package/src/components/ai-elements/connection.tsx +0 -16
  236. package/src/components/ai-elements/context.tsx +0 -357
  237. package/src/components/ai-elements/controls.tsx +0 -18
  238. package/src/components/ai-elements/edge.tsx +0 -131
  239. package/src/components/ai-elements/image.tsx +0 -16
  240. package/src/components/ai-elements/inline-citation.tsx +0 -246
  241. package/src/components/ai-elements/loader.tsx +0 -88
  242. package/src/components/ai-elements/node.tsx +0 -66
  243. package/src/components/ai-elements/open-in-chat.tsx +0 -333
  244. package/src/components/ai-elements/panel.tsx +0 -12
  245. package/src/components/ai-elements/plan.tsx +0 -123
  246. package/src/components/ai-elements/queue.tsx +0 -231
  247. package/src/components/ai-elements/reasoning.tsx +0 -163
  248. package/src/components/ai-elements/response.tsx +0 -19
  249. package/src/components/ai-elements/sources.tsx +0 -53
  250. package/src/components/ai-elements/suggestion.tsx +0 -47
  251. package/src/components/ai-elements/task.tsx +0 -64
  252. package/src/components/ai-elements/tool.tsx +0 -136
  253. package/src/components/ai-elements/toolbar.tsx +0 -13
  254. package/src/components/ai-elements/web-preview.tsx +0 -238
  255. package/src/components/ui/alert.tsx +0 -60
  256. package/src/components/ui/badge.tsx +0 -40
  257. package/src/components/ui/card.tsx +0 -41
  258. package/src/components/ui/carousel.tsx +0 -234
  259. package/src/components/ui/checkbox.tsx +0 -27
  260. package/src/components/ui/collapsible.tsx +0 -21
  261. package/src/components/ui/field.tsx +0 -234
  262. package/src/components/ui/form.tsx +0 -154
  263. package/src/components/ui/label.tsx +0 -21
  264. package/src/components/ui/progress.tsx +0 -28
  265. package/src/components/ui/separator.tsx +0 -28
  266. package/src/components/ui/switch.tsx +0 -26
  267. package/src/components/ui/tabs.tsx +0 -52
  268. package/src/components/ui/toggle.tsx +0 -44
  269. package/src/components.tsx +0 -29
  270. package/src/hooks/index.ts +0 -20
  271. package/src/hooks/useWorkbenchSchemas.ts +0 -69
@@ -1,231 +0,0 @@
1
- 'use client';
2
-
3
- import { Button } from '../ui/button';
4
- import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';
5
- import { ScrollArea } from '../ui/scroll-area';
6
- import { cn } from '../../lib/utils';
7
- import { ChevronDownIcon, PaperclipIcon } from 'lucide-react';
8
- import type { ComponentProps } from 'react';
9
-
10
- export type QueueMessagePart = {
11
- type: string;
12
- text?: string;
13
- url?: string;
14
- filename?: string;
15
- mediaType?: string;
16
- };
17
-
18
- export type QueueMessage = {
19
- id: string;
20
- parts: QueueMessagePart[];
21
- };
22
-
23
- export type QueueTodo = {
24
- id: string;
25
- title: string;
26
- description?: string;
27
- status?: 'pending' | 'completed';
28
- };
29
-
30
- export type QueueItemProps = ComponentProps<'li'>;
31
-
32
- export const QueueItem = ({ className, ...props }: QueueItemProps) => (
33
- <li
34
- className={cn(
35
- 'group flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors hover:bg-muted',
36
- className
37
- )}
38
- {...props}
39
- />
40
- );
41
-
42
- export type QueueItemIndicatorProps = ComponentProps<'span'> & {
43
- completed?: boolean;
44
- };
45
-
46
- export const QueueItemIndicator = ({
47
- completed = false,
48
- className,
49
- ...props
50
- }: QueueItemIndicatorProps) => (
51
- <span
52
- className={cn(
53
- 'mt-0.5 inline-block size-2.5 rounded-full border',
54
- completed
55
- ? 'border-muted-foreground/20 bg-muted-foreground/10'
56
- : 'border-muted-foreground/50',
57
- className
58
- )}
59
- {...props}
60
- />
61
- );
62
-
63
- export type QueueItemContentProps = ComponentProps<'span'> & {
64
- completed?: boolean;
65
- };
66
-
67
- export const QueueItemContent = ({
68
- completed = false,
69
- className,
70
- ...props
71
- }: QueueItemContentProps) => (
72
- <span
73
- className={cn(
74
- 'line-clamp-1 grow break-words',
75
- completed ? 'text-muted-foreground/50 line-through' : 'text-muted-foreground',
76
- className
77
- )}
78
- {...props}
79
- />
80
- );
81
-
82
- export type QueueItemDescriptionProps = ComponentProps<'div'> & {
83
- completed?: boolean;
84
- };
85
-
86
- export const QueueItemDescription = ({
87
- completed = false,
88
- className,
89
- ...props
90
- }: QueueItemDescriptionProps) => (
91
- <div
92
- className={cn(
93
- 'ml-6 text-xs',
94
- completed ? 'text-muted-foreground/40 line-through' : 'text-muted-foreground',
95
- className
96
- )}
97
- {...props}
98
- />
99
- );
100
-
101
- export type QueueItemActionsProps = ComponentProps<'div'>;
102
-
103
- export const QueueItemActions = ({ className, ...props }: QueueItemActionsProps) => (
104
- <div className={cn('flex gap-1', className)} {...props} />
105
- );
106
-
107
- export type QueueItemActionProps = Omit<ComponentProps<typeof Button>, 'variant' | 'size'>;
108
-
109
- export const QueueItemAction = ({ className, ...props }: QueueItemActionProps) => (
110
- <Button
111
- className={cn(
112
- 'size-auto rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:bg-muted-foreground/10 hover:text-foreground group-hover:opacity-100',
113
- className
114
- )}
115
- size="icon"
116
- type="button"
117
- variant="ghost"
118
- {...props}
119
- />
120
- );
121
-
122
- export type QueueItemAttachmentProps = ComponentProps<'div'>;
123
-
124
- export const QueueItemAttachment = ({ className, ...props }: QueueItemAttachmentProps) => (
125
- <div className={cn('mt-1 flex flex-wrap gap-2', className)} {...props} />
126
- );
127
-
128
- export type QueueItemImageProps = ComponentProps<'img'>;
129
-
130
- export const QueueItemImage = ({ className, ...props }: QueueItemImageProps) => (
131
- <img
132
- alt=""
133
- className={cn('h-8 w-8 rounded border object-cover', className)}
134
- height={32}
135
- width={32}
136
- {...props}
137
- />
138
- );
139
-
140
- export type QueueItemFileProps = ComponentProps<'span'>;
141
-
142
- export const QueueItemFile = ({ children, className, ...props }: QueueItemFileProps) => (
143
- <span
144
- className={cn('flex items-center gap-1 rounded border bg-muted px-2 py-1 text-xs', className)}
145
- {...props}
146
- >
147
- <PaperclipIcon size={12} />
148
- <span className="max-w-[100px] truncate">{children}</span>
149
- </span>
150
- );
151
-
152
- export type QueueListProps = ComponentProps<typeof ScrollArea>;
153
-
154
- export const QueueList = ({ children, className, ...props }: QueueListProps) => (
155
- <ScrollArea className={cn('-mb-1 mt-2', className)} {...props}>
156
- <div className="max-h-40 pr-4">
157
- <ul>{children}</ul>
158
- </div>
159
- </ScrollArea>
160
- );
161
-
162
- // QueueSection - collapsible section container
163
- export type QueueSectionProps = ComponentProps<typeof Collapsible>;
164
-
165
- export const QueueSection = ({ className, defaultOpen = true, ...props }: QueueSectionProps) => (
166
- <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />
167
- );
168
-
169
- // QueueSectionTrigger - section header/trigger
170
- export type QueueSectionTriggerProps = ComponentProps<'button'>;
171
-
172
- export const QueueSectionTrigger = ({
173
- children,
174
- className,
175
- ...props
176
- }: QueueSectionTriggerProps) => (
177
- <CollapsibleTrigger asChild>
178
- <button
179
- className={cn(
180
- 'group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-left font-medium text-muted-foreground text-sm transition-colors hover:bg-muted',
181
- className
182
- )}
183
- type="button"
184
- {...props}
185
- >
186
- {children}
187
- </button>
188
- </CollapsibleTrigger>
189
- );
190
-
191
- // QueueSectionLabel - label content with icon and count
192
- export type QueueSectionLabelProps = ComponentProps<'span'> & {
193
- count?: number;
194
- label: string;
195
- icon?: React.ReactNode;
196
- };
197
-
198
- export const QueueSectionLabel = ({
199
- count,
200
- label,
201
- icon,
202
- className,
203
- ...props
204
- }: QueueSectionLabelProps) => (
205
- <span className={cn('flex items-center gap-2', className)} {...props}>
206
- <ChevronDownIcon className="group-data-[state=closed]:-rotate-90 size-4 transition-transform" />
207
- {icon}
208
- <span>
209
- {count} {label}
210
- </span>
211
- </span>
212
- );
213
-
214
- // QueueSectionContent - collapsible content area
215
- export type QueueSectionContentProps = ComponentProps<typeof CollapsibleContent>;
216
-
217
- export const QueueSectionContent = ({ className, ...props }: QueueSectionContentProps) => (
218
- <CollapsibleContent className={cn(className)} {...props} />
219
- );
220
-
221
- export type QueueProps = ComponentProps<'div'>;
222
-
223
- export const Queue = ({ className, ...props }: QueueProps) => (
224
- <div
225
- className={cn(
226
- 'flex flex-col gap-2 rounded-xl border border-border bg-background px-3 pt-2 pb-2 shadow-xs',
227
- className
228
- )}
229
- {...props}
230
- />
231
- );
@@ -1,163 +0,0 @@
1
- 'use client';
2
-
3
- import { useControllableState } from '@radix-ui/react-use-controllable-state';
4
- import { BrainIcon, ChevronDownIcon } from 'lucide-react';
5
- import type { ComponentProps } from 'react';
6
- import { createContext, memo, useContext, useEffect, useState } from 'react';
7
- import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';
8
- import { cn } from '../../lib/utils';
9
- import { Response } from './response';
10
- import { Shimmer } from './shimmer';
11
-
12
- type ReasoningContextValue = {
13
- isStreaming: boolean;
14
- isOpen: boolean;
15
- setIsOpen: (open: boolean) => void;
16
- duration: number;
17
- };
18
-
19
- const ReasoningContext = createContext<ReasoningContextValue | null>(null);
20
-
21
- const useReasoning = () => {
22
- const context = useContext(ReasoningContext);
23
- if (!context) {
24
- throw new Error('Reasoning components must be used within Reasoning');
25
- }
26
- return context;
27
- };
28
-
29
- export type ReasoningProps = ComponentProps<typeof Collapsible> & {
30
- isStreaming?: boolean;
31
- open?: boolean;
32
- defaultOpen?: boolean;
33
- onOpenChange?: (open: boolean) => void;
34
- duration?: number;
35
- };
36
-
37
- const AUTO_CLOSE_DELAY = 1000;
38
- const MS_IN_S = 1000;
39
-
40
- export const Reasoning = memo(
41
- ({
42
- className,
43
- isStreaming = false,
44
- open,
45
- defaultOpen = true,
46
- onOpenChange,
47
- duration: durationProp,
48
- children,
49
- ...props
50
- }: ReasoningProps) => {
51
- const [isOpen, setIsOpen] = useControllableState({
52
- prop: open,
53
- defaultProp: defaultOpen,
54
- onChange: onOpenChange,
55
- });
56
- const [duration, setDuration] = useControllableState({
57
- prop: durationProp,
58
- defaultProp: 0,
59
- });
60
-
61
- const [hasAutoClosed, setHasAutoClosed] = useState(false);
62
- const [startTime, setStartTime] = useState<number | null>(null);
63
-
64
- // Track duration when streaming starts and ends
65
- useEffect(() => {
66
- if (isStreaming) {
67
- if (startTime === null) {
68
- setStartTime(Date.now());
69
- }
70
- } else if (startTime !== null) {
71
- setDuration(Math.ceil((Date.now() - startTime) / MS_IN_S));
72
- setStartTime(null);
73
- }
74
- }, [isStreaming, startTime, setDuration]);
75
-
76
- // Auto-open when streaming starts, auto-close when streaming ends (once only)
77
- useEffect(() => {
78
- if (defaultOpen && !isStreaming && isOpen && !hasAutoClosed) {
79
- // Add a small delay before closing to allow user to see the content
80
- const timer = setTimeout(() => {
81
- setIsOpen(false);
82
- setHasAutoClosed(true);
83
- }, AUTO_CLOSE_DELAY);
84
-
85
- return () => clearTimeout(timer);
86
- }
87
- }, [isStreaming, isOpen, defaultOpen, setIsOpen, hasAutoClosed]);
88
-
89
- const handleOpenChange = (newOpen: boolean) => {
90
- setIsOpen(newOpen);
91
- };
92
-
93
- return (
94
- <ReasoningContext.Provider value={{ isStreaming, isOpen, setIsOpen, duration }}>
95
- <Collapsible
96
- className={cn('not-prose mb-4', className)}
97
- onOpenChange={handleOpenChange}
98
- open={isOpen}
99
- {...props}
100
- >
101
- {children}
102
- </Collapsible>
103
- </ReasoningContext.Provider>
104
- );
105
- }
106
- );
107
-
108
- export type ReasoningTriggerProps = ComponentProps<typeof CollapsibleTrigger>;
109
-
110
- const getThinkingMessage = (isStreaming: boolean, duration?: number) => {
111
- if (isStreaming || duration === 0) {
112
- return <Shimmer duration={1}>Thinking...</Shimmer>;
113
- }
114
- if (duration === undefined) {
115
- return <p>Thought for a few seconds</p>;
116
- }
117
- return <p>Thought for {duration} seconds</p>;
118
- };
119
-
120
- export const ReasoningTrigger = memo(({ className, children, ...props }: ReasoningTriggerProps) => {
121
- const { isStreaming, isOpen, duration } = useReasoning();
122
-
123
- return (
124
- <CollapsibleTrigger
125
- className={cn(
126
- 'flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground',
127
- className
128
- )}
129
- {...props}
130
- >
131
- {children ?? (
132
- <>
133
- <BrainIcon className="size-4" />
134
- {getThinkingMessage(isStreaming, duration)}
135
- <ChevronDownIcon
136
- className={cn('size-4 transition-transform', isOpen ? 'rotate-180' : 'rotate-0')}
137
- />
138
- </>
139
- )}
140
- </CollapsibleTrigger>
141
- );
142
- });
143
-
144
- export type ReasoningContentProps = ComponentProps<typeof CollapsibleContent> & {
145
- children: string;
146
- };
147
-
148
- export const ReasoningContent = memo(({ className, children, ...props }: ReasoningContentProps) => (
149
- <CollapsibleContent
150
- className={cn(
151
- 'mt-4 text-sm',
152
- 'data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-muted-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in',
153
- className
154
- )}
155
- {...props}
156
- >
157
- <Response className="grid gap-2">{children}</Response>
158
- </CollapsibleContent>
159
- ));
160
-
161
- Reasoning.displayName = 'Reasoning';
162
- ReasoningTrigger.displayName = 'ReasoningTrigger';
163
- ReasoningContent.displayName = 'ReasoningContent';
@@ -1,19 +0,0 @@
1
- 'use client';
2
-
3
- import { cn } from '../../lib/utils';
4
- import { type ComponentProps, memo } from 'react';
5
- import { Streamdown } from 'streamdown';
6
-
7
- type ResponseProps = ComponentProps<typeof Streamdown>;
8
-
9
- export const Response = memo(
10
- ({ className, ...props }: ResponseProps) => (
11
- <Streamdown
12
- className={cn('size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0', className)}
13
- {...props}
14
- />
15
- ),
16
- (prevProps, nextProps) => prevProps.children === nextProps.children
17
- );
18
-
19
- Response.displayName = 'Response';
@@ -1,53 +0,0 @@
1
- 'use client';
2
-
3
- import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';
4
- import { cn } from '../../lib/utils';
5
- import { BookIcon, ChevronDownIcon } from 'lucide-react';
6
- import type { ComponentProps } from 'react';
7
-
8
- export type SourcesProps = ComponentProps<'div'>;
9
-
10
- export const Sources = ({ className, ...props }: SourcesProps) => (
11
- <Collapsible className={cn('not-prose mb-4 text-primary text-xs', className)} {...props} />
12
- );
13
-
14
- export type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {
15
- count: number;
16
- };
17
-
18
- export const SourcesTrigger = ({ className, count, children, ...props }: SourcesTriggerProps) => (
19
- <CollapsibleTrigger className={cn('flex items-center gap-2', className)} {...props}>
20
- {children ?? (
21
- <>
22
- <p className="font-medium">Used {count} sources</p>
23
- <ChevronDownIcon className="h-4 w-4" />
24
- </>
25
- )}
26
- </CollapsibleTrigger>
27
- );
28
-
29
- export type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;
30
-
31
- export const SourcesContent = ({ className, ...props }: SourcesContentProps) => (
32
- <CollapsibleContent
33
- className={cn(
34
- 'mt-3 flex w-fit flex-col gap-2',
35
- 'data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in',
36
- className
37
- )}
38
- {...props}
39
- />
40
- );
41
-
42
- export type SourceProps = ComponentProps<'a'>;
43
-
44
- export const Source = ({ href, title, children, ...props }: SourceProps) => (
45
- <a className="flex items-center gap-2" href={href} rel="noreferrer" target="_blank" {...props}>
46
- {children ?? (
47
- <>
48
- <BookIcon className="h-4 w-4" />
49
- <span className="block font-medium">{title}</span>
50
- </>
51
- )}
52
- </a>
53
- );
@@ -1,47 +0,0 @@
1
- 'use client';
2
-
3
- import type { ComponentProps } from 'react';
4
- import { Button } from '../ui/button';
5
- import { ScrollArea, ScrollBar } from '../ui/scroll-area';
6
- import { cn } from '../../lib/utils';
7
-
8
- export type SuggestionsProps = ComponentProps<typeof ScrollArea>;
9
-
10
- export const Suggestions = ({ className, children, ...props }: SuggestionsProps) => (
11
- <ScrollArea className="w-full overflow-x-auto whitespace-nowrap" {...props}>
12
- <div className={cn('flex w-max flex-nowrap items-center gap-2', className)}>{children}</div>
13
- <ScrollBar className="hidden" orientation="horizontal" />
14
- </ScrollArea>
15
- );
16
-
17
- export type SuggestionProps = Omit<ComponentProps<typeof Button>, 'onClick'> & {
18
- suggestion: string;
19
- onClick?: (suggestion: string) => void;
20
- };
21
-
22
- export const Suggestion = ({
23
- suggestion,
24
- onClick,
25
- className,
26
- variant = 'outline',
27
- size = 'sm',
28
- children,
29
- ...props
30
- }: SuggestionProps) => {
31
- const handleClick = () => {
32
- onClick?.(suggestion);
33
- };
34
-
35
- return (
36
- <Button
37
- className={cn('cursor-pointer rounded-full px-4', className)}
38
- onClick={handleClick}
39
- size={size}
40
- type="button"
41
- variant={variant}
42
- {...props}
43
- >
44
- {children || suggestion}
45
- </Button>
46
- );
47
- };
@@ -1,64 +0,0 @@
1
- 'use client';
2
-
3
- import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';
4
- import { cn } from '../../lib/utils';
5
- import { ChevronDownIcon, SearchIcon } from 'lucide-react';
6
- import type { ComponentProps } from 'react';
7
-
8
- export type TaskItemFileProps = ComponentProps<'div'>;
9
-
10
- export const TaskItemFile = ({ children, className, ...props }: TaskItemFileProps) => (
11
- <div
12
- className={cn(
13
- 'inline-flex items-center gap-1 rounded-md border bg-secondary px-1.5 py-0.5 text-foreground text-xs',
14
- className
15
- )}
16
- {...props}
17
- >
18
- {children}
19
- </div>
20
- );
21
-
22
- export type TaskItemProps = ComponentProps<'div'>;
23
-
24
- export const TaskItem = ({ children, className, ...props }: TaskItemProps) => (
25
- <div className={cn('text-muted-foreground text-sm', className)} {...props}>
26
- {children}
27
- </div>
28
- );
29
-
30
- export type TaskProps = ComponentProps<typeof Collapsible>;
31
-
32
- export const Task = ({ defaultOpen = true, className, ...props }: TaskProps) => (
33
- <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />
34
- );
35
-
36
- export type TaskTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {
37
- title: string;
38
- };
39
-
40
- export const TaskTrigger = ({ children, className, title, ...props }: TaskTriggerProps) => (
41
- <CollapsibleTrigger asChild className={cn('group', className)} {...props}>
42
- {children ?? (
43
- <div className="flex w-full cursor-pointer items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground">
44
- <SearchIcon className="size-4" />
45
- <p className="text-sm">{title}</p>
46
- <ChevronDownIcon className="size-4 transition-transform group-data-[state=open]:rotate-180" />
47
- </div>
48
- )}
49
- </CollapsibleTrigger>
50
- );
51
-
52
- export type TaskContentProps = ComponentProps<typeof CollapsibleContent>;
53
-
54
- export const TaskContent = ({ children, className, ...props }: TaskContentProps) => (
55
- <CollapsibleContent
56
- className={cn(
57
- 'data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in',
58
- className
59
- )}
60
- {...props}
61
- >
62
- <div className="mt-4 space-y-2 border-muted border-l-2 pl-4">{children}</div>
63
- </CollapsibleContent>
64
- );