@liveblocks/react-ui 2.25.0-aiprivatebeta7 → 2.25.0-aiprivatebeta8

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 (70) hide show
  1. package/dist/_private/index.cjs +10 -4
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +76 -10
  4. package/dist/_private/index.d.ts +76 -10
  5. package/dist/_private/index.js +4 -2
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +24 -27
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +24 -27
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/AiToolDebugger.cjs +74 -0
  12. package/dist/components/AiToolDebugger.cjs.map +1 -0
  13. package/dist/components/AiToolDebugger.js +72 -0
  14. package/dist/components/AiToolDebugger.js.map +1 -0
  15. package/dist/components/Thread.cjs +3 -3
  16. package/dist/components/Thread.cjs.map +1 -1
  17. package/dist/components/Thread.js +3 -3
  18. package/dist/components/Thread.js.map +1 -1
  19. package/dist/components/internal/AiChatAssistantMessage.cjs +127 -147
  20. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  21. package/dist/components/internal/AiChatAssistantMessage.js +129 -149
  22. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  23. package/dist/components/internal/AiChatComposer.cjs +28 -16
  24. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  25. package/dist/components/internal/AiChatComposer.js +28 -16
  26. package/dist/components/internal/AiChatComposer.js.map +1 -1
  27. package/dist/icon.cjs +2 -0
  28. package/dist/icon.cjs.map +1 -1
  29. package/dist/icon.js +1 -0
  30. package/dist/icon.js.map +1 -1
  31. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  32. package/dist/icons/CheckCircle.cjs.map +1 -0
  33. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  34. package/dist/icons/CheckCircle.js.map +1 -0
  35. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  36. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  37. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  38. package/dist/icons/CheckCircleFill.js.map +1 -0
  39. package/dist/icons/index.cjs +4 -4
  40. package/dist/icons/index.js +2 -2
  41. package/dist/index.cjs +2 -0
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +27 -14
  44. package/dist/index.d.ts +27 -14
  45. package/dist/index.js +1 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/overrides.cjs +0 -4
  48. package/dist/overrides.cjs.map +1 -1
  49. package/dist/overrides.js +0 -4
  50. package/dist/overrides.js.map +1 -1
  51. package/dist/primitives/AiChatComposer/index.cjs +1 -2
  52. package/dist/primitives/AiChatComposer/index.cjs.map +1 -1
  53. package/dist/primitives/AiChatComposer/index.js +1 -2
  54. package/dist/primitives/AiChatComposer/index.js.map +1 -1
  55. package/dist/primitives/index.d.cts +0 -4
  56. package/dist/primitives/index.d.ts +0 -4
  57. package/dist/primitives/internal/Markdown.cjs +56 -25
  58. package/dist/primitives/internal/Markdown.cjs.map +1 -1
  59. package/dist/primitives/internal/Markdown.js +56 -25
  60. package/dist/primitives/internal/Markdown.js.map +1 -1
  61. package/dist/version.cjs +1 -1
  62. package/dist/version.js +1 -1
  63. package/package.json +5 -5
  64. package/src/styles/index.css +105 -61
  65. package/styles.css +1 -1
  66. package/styles.css.map +1 -1
  67. package/dist/icons/Resolve.cjs.map +0 -1
  68. package/dist/icons/Resolve.js.map +0 -1
  69. package/dist/icons/Resolved.cjs.map +0 -1
  70. package/dist/icons/Resolved.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var components = require('../components.cjs');
3
4
  var AiChatAssistantMessage = require('../components/internal/AiChatAssistantMessage.cjs');
4
5
  var AiChatComposer = require('../components/internal/AiChatComposer.cjs');
5
6
  var AiChatUserMessage = require('../components/internal/AiChatUserMessage.cjs');
@@ -8,6 +9,7 @@ var List = require('../components/internal/List.cjs');
8
9
  var Tooltip = require('../components/internal/Tooltip.cjs');
9
10
  var User = require('../components/internal/User.cjs');
10
11
  require('../icons/index.cjs');
12
+ var index = require('../primitives/AiChatComposer/index.cjs');
11
13
  var capitalize = require('../utils/capitalize.cjs');
12
14
  var useInitial = require('../utils/use-initial.cjs');
13
15
  var useRefs = require('../utils/use-refs.cjs');
@@ -22,6 +24,8 @@ var BellCrossed = require('../icons/BellCrossed.cjs');
22
24
  var Blockquote = require('../icons/Blockquote.cjs');
23
25
  var Bold = require('../icons/Bold.cjs');
24
26
  var Check = require('../icons/Check.cjs');
27
+ var CheckCircle = require('../icons/CheckCircle.cjs');
28
+ var CheckCircleFill = require('../icons/CheckCircleFill.cjs');
25
29
  var ChevronDown = require('../icons/ChevronDown.cjs');
26
30
  var ChevronLeft = require('../icons/ChevronLeft.cjs');
27
31
  var ChevronRight = require('../icons/ChevronRight.cjs');
@@ -45,8 +49,6 @@ var ListUnordered = require('../icons/ListUnordered.cjs');
45
49
  var Mention = require('../icons/Mention.cjs');
46
50
  var QuestionMark = require('../icons/QuestionMark.cjs');
47
51
  var Redo = require('../icons/Redo.cjs');
48
- var Resolve = require('../icons/Resolve.cjs');
49
- var Resolved = require('../icons/Resolved.cjs');
50
52
  var Restore = require('../icons/Restore.cjs');
51
53
  var Retry = require('../icons/Retry.cjs');
52
54
  var Search = require('../icons/Search.cjs');
@@ -65,6 +67,7 @@ var Warning = require('../icons/Warning.cjs');
65
67
 
66
68
 
67
69
 
70
+ exports.useComponents = components.useComponents;
68
71
  exports.AiChatAssistantMessage = AiChatAssistantMessage.AiChatAssistantMessage;
69
72
  exports.AiChatComposer = AiChatComposer.AiChatComposer;
70
73
  exports.AiChatUserMessage = AiChatUserMessage.AiChatUserMessage;
@@ -74,6 +77,9 @@ exports.List = List.List;
74
77
  exports.ShortcutTooltip = Tooltip.ShortcutTooltip;
75
78
  exports.Tooltip = Tooltip.Tooltip;
76
79
  exports.User = User.User;
80
+ exports.AiChatComposerEditor = index.AiChatComposerEditor;
81
+ exports.AiChatComposerForm = index.AiChatComposerForm;
82
+ exports.AiChatComposerSubmit = index.AiChatComposerSubmit;
77
83
  exports.capitalize = capitalize.capitalize;
78
84
  exports.useInitial = useInitial.useInitial;
79
85
  exports.useRefs = useRefs.useRefs;
@@ -91,6 +97,8 @@ exports.BellCrossedIcon = BellCrossed.BellCrossedIcon;
91
97
  exports.BlockquoteIcon = Blockquote.BlockquoteIcon;
92
98
  exports.BoldIcon = Bold.BoldIcon;
93
99
  exports.CheckIcon = Check.CheckIcon;
100
+ exports.CheckCircleIcon = CheckCircle.CheckCircleIcon;
101
+ exports.CheckCircleFillIcon = CheckCircleFill.CheckCircleFillIcon;
94
102
  exports.ChevronDownIcon = ChevronDown.ChevronDownIcon;
95
103
  exports.ChevronLeftIcon = ChevronLeft.ChevronLeftIcon;
96
104
  exports.ChevronRightIcon = ChevronRight.ChevronRightIcon;
@@ -114,8 +122,6 @@ exports.ListUnorderedIcon = ListUnordered.ListUnorderedIcon;
114
122
  exports.MentionIcon = Mention.MentionIcon;
115
123
  exports.QuestionMarkIcon = QuestionMark.QuestionMarkIcon;
116
124
  exports.RedoIcon = Redo.RedoIcon;
117
- exports.ResolveIcon = Resolve.ResolveIcon;
118
- exports.ResolvedIcon = Resolved.ResolvedIcon;
119
125
  exports.RestoreIcon = Restore.RestoreIcon;
120
126
  exports.RetryIcon = Retry.RetryIcon;
121
127
  exports.SearchIcon = Search.SearchIcon;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,10 +1,16 @@
1
1
  import * as react from 'react';
2
- import { ElementType, ComponentPropsWithoutRef, ReactNode, ComponentProps, FormEvent, Ref, RefCallback } from 'react';
2
+ import { ComponentType, ComponentPropsWithoutRef, ElementType, ReactNode, ComponentProps, FormEvent, Ref, RefCallback } from 'react';
3
3
  import { UiAssistantMessage, CopilotId, UiUserMessage } from '@liveblocks/core';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
5
  export { TooltipProvider } from '@radix-ui/react-tooltip';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
 
8
+ interface GlobalComponents {
9
+ Anchor: ComponentType<ComponentPropsWithoutRef<"a">> | "a";
10
+ }
11
+ type Components = GlobalComponents;
12
+ declare function useComponents(components?: Partial<Components>): Components;
13
+
8
14
  type SlotProp = {
9
15
  /**
10
16
  * Replace the rendered element by the one passed as a child.
@@ -29,15 +35,11 @@ interface GlobalOverrides {
29
35
  interface AiChatComposerOverrides {
30
36
  AI_CHAT_COMPOSER_PLACEHOLDER: string;
31
37
  AI_CHAT_COMPOSER_SEND: string;
32
- AI_CHAT_COMPOSER_ATTACH_FILES: string;
33
- AI_CHAT_COMPOSER_REMOVE_ATTACHMENT: string;
34
38
  AI_CHAT_COMPOSER_ABORT: string;
35
39
  }
36
40
  interface AiChatMessageOverrides {
37
41
  AI_CHAT_MESSAGE_DELETED: string;
38
42
  AI_CHAT_MESSAGE_THINKING: string;
39
- AI_CHAT_MESSAGE_COPY: string;
40
- AI_CHAT_MESSAGE_TRY_AGAIN: string;
41
43
  }
42
44
 
43
45
  interface AiChatAssistantMessageProps extends ComponentProps<"div"> {
@@ -49,6 +51,10 @@ interface AiChatAssistantMessageProps extends ComponentProps<"div"> {
49
51
  * Override the component's strings.
50
52
  */
51
53
  overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;
54
+ /**
55
+ * Override the component's components.
56
+ */
57
+ components?: Partial<GlobalComponents>;
52
58
  }
53
59
  declare const AiChatAssistantMessage: react.MemoExoticComponent<react.ForwardRefExoticComponent<Omit<AiChatAssistantMessageProps, "ref"> & react.RefAttributes<HTMLDivElement>>>;
54
60
 
@@ -160,6 +166,10 @@ declare function BoldIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.E
160
166
 
161
167
  declare function CheckIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
162
168
 
169
+ declare function CheckCircleIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
170
+
171
+ declare function CheckCircleFillIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
172
+
163
173
  declare function ChevronDownIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
164
174
 
165
175
  declare function ChevronLeftIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
@@ -206,10 +216,6 @@ declare function QuestionMarkIcon(props: ComponentProps<"svg">): react_jsx_runti
206
216
 
207
217
  declare function RedoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
208
218
 
209
- declare function ResolveIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
210
-
211
- declare function ResolvedIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
212
-
213
219
  declare function RestoreIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
214
220
 
215
221
  declare function RetryIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
@@ -240,6 +246,66 @@ declare function UndoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.E
240
246
 
241
247
  declare function WarningIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
242
248
 
249
+ interface AiChatComposerFormProps extends ComponentPropsWithSlot<"form"> {
250
+ /**
251
+ * The event handler called when a chat message is submitted.
252
+ */
253
+ onComposerSubmit?: (message: {
254
+ /**
255
+ * The submitted message text.
256
+ */
257
+ text: string;
258
+ }, event: FormEvent<HTMLFormElement>) => void;
259
+ /**
260
+ * Whether the composer is disabled.
261
+ */
262
+ disabled?: boolean;
263
+ }
264
+ interface AiChatComposerEditorProps extends Omit<ComponentPropsWithoutRef<"div">, "defaultValue"> {
265
+ /**
266
+ * The editor's initial value.
267
+ */
268
+ defaultValue?: string;
269
+ /**
270
+ * The text to display when the editor is empty.
271
+ */
272
+ placeholder?: string;
273
+ /**
274
+ * Whether the editor is disabled.
275
+ */
276
+ disabled?: boolean;
277
+ /**
278
+ * Whether to focus the editor on mount.
279
+ */
280
+ autoFocus?: boolean;
281
+ }
282
+ type AiChatComposerSubmitProps = ComponentPropsWithSlot<"button">;
283
+
284
+ /**
285
+ * Surrounds the chat composer's content and handles submissions.
286
+ *
287
+ * @example
288
+ * <AiChatComposer.Form onComposerSubmit={({ text }) => {}}>
289
+ * <AiChatComposer.Editor />
290
+ * <AiChatComposer.Submit />
291
+ * </AiChatComposer.Form>
292
+ */
293
+ declare const AiChatComposerForm: react.ForwardRefExoticComponent<AiChatComposerFormProps & react.RefAttributes<HTMLFormElement>>;
294
+ /**
295
+ * Displays the chat composer's editor.
296
+ *
297
+ * @example
298
+ * <AiChatComposer.Editor placeholder="Write a message…" />
299
+ */
300
+ declare const AiChatComposerEditor: react.ForwardRefExoticComponent<AiChatComposerEditorProps & react.RefAttributes<HTMLDivElement>>;
301
+ /**
302
+ * A button to submit a chat message.
303
+ *
304
+ * @example
305
+ * <AiChatComposer.Submit>Send</AiChatComposer.Submit>
306
+ */
307
+ declare const AiChatComposerSubmit: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & react.RefAttributes<HTMLButtonElement>>;
308
+
243
309
  declare function capitalize(string: string): string;
244
310
 
245
311
  /**
@@ -252,4 +318,4 @@ declare function useInitial<T>(value: T | (() => T)): T;
252
318
 
253
319
  declare function useRefs<T>(...refs: Ref<T>[]): RefCallback<T>;
254
320
 
255
- export { AiChatAssistantMessage, AiChatAssistantMessageProps, AiChatComposer, AiChatComposerProps, AiChatUserMessage, AiChatUserMessageProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, CommentIcon, CopyIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, MentionIcon, QuestionMarkIcon, RedoIcon, ResolveIcon, ResolvedIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, WarningIcon, capitalize, useInitial, useRefs };
321
+ export { AiChatAssistantMessage, AiChatAssistantMessageProps, AiChatComposer, AiChatComposerEditor, AiChatComposerEditorProps, AiChatComposerForm, AiChatComposerFormProps, AiChatComposerProps, AiChatComposerSubmit, AiChatComposerSubmitProps, AiChatUserMessage, AiChatUserMessageProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, CommentIcon, CopyIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobalComponents, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, MentionIcon, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, WarningIcon, capitalize, useComponents, useInitial, useRefs };
@@ -1,10 +1,16 @@
1
1
  import * as react from 'react';
2
- import { ElementType, ComponentPropsWithoutRef, ReactNode, ComponentProps, FormEvent, Ref, RefCallback } from 'react';
2
+ import { ComponentType, ComponentPropsWithoutRef, ElementType, ReactNode, ComponentProps, FormEvent, Ref, RefCallback } from 'react';
3
3
  import { UiAssistantMessage, CopilotId, UiUserMessage } from '@liveblocks/core';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
5
  export { TooltipProvider } from '@radix-ui/react-tooltip';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
 
8
+ interface GlobalComponents {
9
+ Anchor: ComponentType<ComponentPropsWithoutRef<"a">> | "a";
10
+ }
11
+ type Components = GlobalComponents;
12
+ declare function useComponents(components?: Partial<Components>): Components;
13
+
8
14
  type SlotProp = {
9
15
  /**
10
16
  * Replace the rendered element by the one passed as a child.
@@ -29,15 +35,11 @@ interface GlobalOverrides {
29
35
  interface AiChatComposerOverrides {
30
36
  AI_CHAT_COMPOSER_PLACEHOLDER: string;
31
37
  AI_CHAT_COMPOSER_SEND: string;
32
- AI_CHAT_COMPOSER_ATTACH_FILES: string;
33
- AI_CHAT_COMPOSER_REMOVE_ATTACHMENT: string;
34
38
  AI_CHAT_COMPOSER_ABORT: string;
35
39
  }
36
40
  interface AiChatMessageOverrides {
37
41
  AI_CHAT_MESSAGE_DELETED: string;
38
42
  AI_CHAT_MESSAGE_THINKING: string;
39
- AI_CHAT_MESSAGE_COPY: string;
40
- AI_CHAT_MESSAGE_TRY_AGAIN: string;
41
43
  }
42
44
 
43
45
  interface AiChatAssistantMessageProps extends ComponentProps<"div"> {
@@ -49,6 +51,10 @@ interface AiChatAssistantMessageProps extends ComponentProps<"div"> {
49
51
  * Override the component's strings.
50
52
  */
51
53
  overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;
54
+ /**
55
+ * Override the component's components.
56
+ */
57
+ components?: Partial<GlobalComponents>;
52
58
  }
53
59
  declare const AiChatAssistantMessage: react.MemoExoticComponent<react.ForwardRefExoticComponent<Omit<AiChatAssistantMessageProps, "ref"> & react.RefAttributes<HTMLDivElement>>>;
54
60
 
@@ -160,6 +166,10 @@ declare function BoldIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.E
160
166
 
161
167
  declare function CheckIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
162
168
 
169
+ declare function CheckCircleIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
170
+
171
+ declare function CheckCircleFillIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
172
+
163
173
  declare function ChevronDownIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
164
174
 
165
175
  declare function ChevronLeftIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
@@ -206,10 +216,6 @@ declare function QuestionMarkIcon(props: ComponentProps<"svg">): react_jsx_runti
206
216
 
207
217
  declare function RedoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
208
218
 
209
- declare function ResolveIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
210
-
211
- declare function ResolvedIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
212
-
213
219
  declare function RestoreIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
214
220
 
215
221
  declare function RetryIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
@@ -240,6 +246,66 @@ declare function UndoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.E
240
246
 
241
247
  declare function WarningIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
242
248
 
249
+ interface AiChatComposerFormProps extends ComponentPropsWithSlot<"form"> {
250
+ /**
251
+ * The event handler called when a chat message is submitted.
252
+ */
253
+ onComposerSubmit?: (message: {
254
+ /**
255
+ * The submitted message text.
256
+ */
257
+ text: string;
258
+ }, event: FormEvent<HTMLFormElement>) => void;
259
+ /**
260
+ * Whether the composer is disabled.
261
+ */
262
+ disabled?: boolean;
263
+ }
264
+ interface AiChatComposerEditorProps extends Omit<ComponentPropsWithoutRef<"div">, "defaultValue"> {
265
+ /**
266
+ * The editor's initial value.
267
+ */
268
+ defaultValue?: string;
269
+ /**
270
+ * The text to display when the editor is empty.
271
+ */
272
+ placeholder?: string;
273
+ /**
274
+ * Whether the editor is disabled.
275
+ */
276
+ disabled?: boolean;
277
+ /**
278
+ * Whether to focus the editor on mount.
279
+ */
280
+ autoFocus?: boolean;
281
+ }
282
+ type AiChatComposerSubmitProps = ComponentPropsWithSlot<"button">;
283
+
284
+ /**
285
+ * Surrounds the chat composer's content and handles submissions.
286
+ *
287
+ * @example
288
+ * <AiChatComposer.Form onComposerSubmit={({ text }) => {}}>
289
+ * <AiChatComposer.Editor />
290
+ * <AiChatComposer.Submit />
291
+ * </AiChatComposer.Form>
292
+ */
293
+ declare const AiChatComposerForm: react.ForwardRefExoticComponent<AiChatComposerFormProps & react.RefAttributes<HTMLFormElement>>;
294
+ /**
295
+ * Displays the chat composer's editor.
296
+ *
297
+ * @example
298
+ * <AiChatComposer.Editor placeholder="Write a message…" />
299
+ */
300
+ declare const AiChatComposerEditor: react.ForwardRefExoticComponent<AiChatComposerEditorProps & react.RefAttributes<HTMLDivElement>>;
301
+ /**
302
+ * A button to submit a chat message.
303
+ *
304
+ * @example
305
+ * <AiChatComposer.Submit>Send</AiChatComposer.Submit>
306
+ */
307
+ declare const AiChatComposerSubmit: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & react.RefAttributes<HTMLButtonElement>>;
308
+
243
309
  declare function capitalize(string: string): string;
244
310
 
245
311
  /**
@@ -252,4 +318,4 @@ declare function useInitial<T>(value: T | (() => T)): T;
252
318
 
253
319
  declare function useRefs<T>(...refs: Ref<T>[]): RefCallback<T>;
254
320
 
255
- export { AiChatAssistantMessage, AiChatAssistantMessageProps, AiChatComposer, AiChatComposerProps, AiChatUserMessage, AiChatUserMessageProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, CommentIcon, CopyIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, MentionIcon, QuestionMarkIcon, RedoIcon, ResolveIcon, ResolvedIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, WarningIcon, capitalize, useInitial, useRefs };
321
+ export { AiChatAssistantMessage, AiChatAssistantMessageProps, AiChatComposer, AiChatComposerEditor, AiChatComposerEditorProps, AiChatComposerForm, AiChatComposerFormProps, AiChatComposerProps, AiChatComposerSubmit, AiChatComposerSubmitProps, AiChatUserMessage, AiChatUserMessageProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, CommentIcon, CopyIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobalComponents, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, MentionIcon, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, WarningIcon, capitalize, useComponents, useInitial, useRefs };
@@ -1,3 +1,4 @@
1
+ export { useComponents } from '../components.js';
1
2
  export { AiChatAssistantMessage } from '../components/internal/AiChatAssistantMessage.js';
2
3
  export { AiChatComposer } from '../components/internal/AiChatComposer.js';
3
4
  export { AiChatUserMessage } from '../components/internal/AiChatUserMessage.js';
@@ -6,6 +7,7 @@ export { List } from '../components/internal/List.js';
6
7
  export { ShortcutTooltip, Tooltip } from '../components/internal/Tooltip.js';
7
8
  export { User } from '../components/internal/User.js';
8
9
  import '../icons/index.js';
10
+ export { AiChatComposerEditor, AiChatComposerForm, AiChatComposerSubmit } from '../primitives/AiChatComposer/index.js';
9
11
  export { capitalize } from '../utils/capitalize.js';
10
12
  export { useInitial } from '../utils/use-initial.js';
11
13
  export { useRefs } from '../utils/use-refs.js';
@@ -20,6 +22,8 @@ export { BellCrossedIcon } from '../icons/BellCrossed.js';
20
22
  export { BlockquoteIcon } from '../icons/Blockquote.js';
21
23
  export { BoldIcon } from '../icons/Bold.js';
22
24
  export { CheckIcon } from '../icons/Check.js';
25
+ export { CheckCircleIcon } from '../icons/CheckCircle.js';
26
+ export { CheckCircleFillIcon } from '../icons/CheckCircleFill.js';
23
27
  export { ChevronDownIcon } from '../icons/ChevronDown.js';
24
28
  export { ChevronLeftIcon } from '../icons/ChevronLeft.js';
25
29
  export { ChevronRightIcon } from '../icons/ChevronRight.js';
@@ -43,8 +47,6 @@ export { ListUnorderedIcon } from '../icons/ListUnordered.js';
43
47
  export { MentionIcon } from '../icons/Mention.js';
44
48
  export { QuestionMarkIcon } from '../icons/QuestionMark.js';
45
49
  export { RedoIcon } from '../icons/Redo.js';
46
- export { ResolveIcon } from '../icons/Resolve.js';
47
- export { ResolvedIcon } from '../icons/Resolved.js';
48
50
  export { RestoreIcon } from '../icons/Restore.js';
49
51
  export { RetryIcon } from '../icons/Retry.js';
50
52
  export { SearchIcon } from '../icons/Search.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -20,8 +20,9 @@ const AiChat = react.forwardRef(
20
20
  copilotId,
21
21
  autoFocus,
22
22
  overrides: overrides$1,
23
- knowledgeSources = [],
23
+ knowledge,
24
24
  tools = {},
25
+ components,
25
26
  className,
26
27
  ...props
27
28
  }, forwardedRef) => {
@@ -32,29 +33,23 @@ const AiChat = react.forwardRef(
32
33
  null
33
34
  );
34
35
  const client = react$1.useClient();
36
+ const ai = client[core.kInternal].ai;
37
+ const [lastSendMessageId, setLastSendMessageId] = react.useState(null);
35
38
  react.useImperativeHandle(
36
39
  forwardedRef,
37
40
  () => containerRef.current,
38
41
  []
39
42
  );
40
- react.useEffect(() => {
41
- const unregister = knowledgeSources.map(
42
- (source) => client[core.kInternal].ai.registerKnowledgeSource(chatId, source)
43
- );
44
- return () => {
45
- unregister.forEach((unregister2) => unregister2());
46
- };
47
- }, [client, chatId, knowledgeSources]);
48
43
  react.useEffect(() => {
49
44
  Object.entries(tools).map(
50
- ([key, value]) => client[core.kInternal].ai.registerChatTool(chatId, key, value)
45
+ ([key, value]) => ai.registerChatTool(chatId, key, value)
51
46
  );
52
47
  return () => {
53
48
  Object.entries(tools).map(
54
- ([key]) => client[core.kInternal].ai.unregisterChatTool(chatId, key)
49
+ ([key]) => ai.unregisterChatTool(chatId, key)
55
50
  );
56
51
  };
57
- }, [client, chatId, tools]);
52
+ }, [ai, chatId, tools]);
58
53
  react.useEffect(() => {
59
54
  const container = containerRef.current;
60
55
  if (container === null)
@@ -84,16 +79,11 @@ const AiChat = react.forwardRef(
84
79
  const container = containerRef.current;
85
80
  if (container === null)
86
81
  return;
87
- if (messages === void 0)
88
- return;
89
- const lastMessage = messages[messages.length - 1];
90
- if (lastMessage !== void 0 && lastMessage.role === "user") {
91
- container.scrollTo({
92
- top: container.scrollHeight,
93
- behavior: "smooth"
94
- });
95
- }
96
- }, [messages]);
82
+ container.scrollTo({
83
+ top: container.scrollHeight,
84
+ behavior: "smooth"
85
+ });
86
+ }, [lastSendMessageId]);
97
87
  react.useEffect(() => {
98
88
  const container = containerRef.current;
99
89
  if (container === null)
@@ -129,6 +119,10 @@ const AiChat = react.forwardRef(
129
119
  ...props,
130
120
  className: classNames.classNames("lb-root lb-ai-chat", className),
131
121
  children: [
122
+ knowledge ? knowledge.map((source, index) => /* @__PURE__ */ jsxRuntime.jsx(react$1.RegisterAiKnowledge, {
123
+ description: source.description,
124
+ value: source.value
125
+ }, index)) : null,
132
126
  /* @__PURE__ */ jsxRuntime.jsx("div", {
133
127
  className: "lb-ai-chat-content",
134
128
  children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", {
@@ -142,6 +136,7 @@ const AiChat = react.forwardRef(
142
136
  children: /* @__PURE__ */ jsxRuntime.jsx(Messages, {
143
137
  messages,
144
138
  overrides: $,
139
+ components,
145
140
  onDistanceToBottomChange: scrollToBottomCallbackRef.current
146
141
  })
147
142
  })
@@ -179,7 +174,8 @@ const AiChat = react.forwardRef(
179
174
  chatId,
180
175
  copilotId,
181
176
  overrides: $,
182
- autoFocus
177
+ autoFocus,
178
+ onUserMessageCreate: ({ id }) => setLastSendMessageId(id)
183
179
  }, chatId)
184
180
  ]
185
181
  })
@@ -189,10 +185,10 @@ const AiChat = react.forwardRef(
189
185
  );
190
186
  function Messages({
191
187
  messages,
192
- overrides: overrides$1,
188
+ overrides,
189
+ components,
193
190
  onDistanceToBottomChange
194
191
  }) {
195
- const $ = overrides.useOverrides(overrides$1);
196
192
  _private.useLayoutEffect(() => {
197
193
  onDistanceToBottomChange();
198
194
  }, [onDistanceToBottomChange]);
@@ -200,12 +196,13 @@ function Messages({
200
196
  if (message.role === "user") {
201
197
  return /* @__PURE__ */ jsxRuntime.jsx(AiChatUserMessage.AiChatUserMessage, {
202
198
  message,
203
- overrides: $
199
+ overrides
204
200
  }, message.id);
205
201
  } else if (message.role === "assistant") {
206
202
  return /* @__PURE__ */ jsxRuntime.jsx(AiChatAssistantMessage.AiChatAssistantMessage, {
207
203
  message,
208
- overrides: $
204
+ overrides,
205
+ components
209
206
  }, message.id);
210
207
  } else {
211
208
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"AiChat.cjs","sources":["../../src/components/AiChat.tsx"],"sourcesContent":["import type {\n AiKnowledgeSource,\n ClientToolDefinition,\n CopilotId,\n UiChatMessage,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useAiChatMessages, useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n type ComponentProps,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nimport { ArrowDownIcon } from \"../icons/ArrowDown\";\nimport { SpinnerIcon } from \"../icons/Spinner\";\nimport {\n type AiChatComposerOverrides,\n type AiChatMessageOverrides,\n type AiChatOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../overrides\";\nimport { classNames } from \"../utils/class-names\";\nimport { AiChatAssistantMessage } from \"./internal/AiChatAssistantMessage\";\nimport { AiChatComposer } from \"./internal/AiChatComposer\";\nimport { AiChatUserMessage } from \"./internal/AiChatUserMessage\";\n\n/**\n * The number of pixels from the bottom of the messages list to trigger the scroll to bottom.\n */\nconst MIN_DISTANCE_TO_BOTTOM = 50;\n\nexport interface AiChatProps extends ComponentProps<\"div\"> {\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n /**\n * Whether to focus the chat composer on mount.\n */\n autoFocus?: boolean;\n /**\n * The id of the copilot to use to send the message.\n */\n copilotId?: string;\n /**\n * The contextual knowledge to include in the chat. May be used by the assistant when generating responses.\n */\n knowledgeSources?: AiKnowledgeSource[];\n /**\n * Tool definitions to make available within this chat. May be used by the assistant when generating responses.\n */\n tools?: Record<string, ClientToolDefinition>;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<\n GlobalOverrides &\n AiChatMessageOverrides &\n AiChatComposerOverrides &\n AiChatOverrides\n >;\n}\n\nexport const AiChat = forwardRef<HTMLDivElement, AiChatProps>(\n (\n {\n chatId,\n copilotId,\n autoFocus,\n overrides,\n knowledgeSources = [],\n tools = {},\n className,\n ...props\n },\n forwardedRef\n ) => {\n const { messages, isLoading, error } = useAiChatMessages(chatId);\n const $ = useOverrides(overrides);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [distanceToBottom, setDistanceToBottom] = useState<number | null>(\n null\n );\n const client = useClient();\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(\n forwardedRef,\n () => containerRef.current,\n []\n );\n\n // Add the provided contextual information to the chat on mount and remove on unmount\n // Note: 'contexts' will most likely be a new object on each render (unless user passes a stable object), but this won't be an issue as context addition and removal is a quick operation\n useEffect(() => {\n const unregister = knowledgeSources.map((source) =>\n client[kInternal].ai.registerKnowledgeSource(chatId, source)\n );\n return () => {\n unregister.forEach((unregister) => unregister());\n };\n }, [client, chatId, knowledgeSources]);\n\n // Register the provided tools to the chat on mount and unregister them on unmount\n useEffect(() => {\n Object.entries(tools).map(([key, value]) =>\n client[kInternal].ai.registerChatTool(chatId, key, value)\n );\n return () => {\n Object.entries(tools).map(([key]) =>\n client[kInternal].ai.unregisterChatTool(chatId, key)\n );\n };\n }, [client, chatId, tools]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n function handleScrollChange() {\n const container = containerRef.current;\n if (container === null) return;\n\n setDistanceToBottom(\n container.scrollHeight - container.clientHeight - container.scrollTop\n );\n }\n container.addEventListener(\"scroll\", handleScrollChange);\n return () => {\n container.removeEventListener(\"scroll\", handleScrollChange);\n };\n }, []);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n\n setDistanceToBottom(\n container.scrollHeight - container.clientHeight - container.scrollTop\n );\n }, [messages]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n\n if (messages === undefined) return;\n const lastMessage = messages[messages.length - 1];\n if (lastMessage !== undefined && lastMessage.role === \"user\") {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\",\n });\n }\n }, [messages]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n\n const observer = new ResizeObserver(() => {\n const container = containerRef.current;\n if (container === null) return;\n setDistanceToBottom(\n container.scrollHeight - container.clientHeight - container.scrollTop\n );\n });\n observer.observe(container);\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const scrollToBottomCallbackRef = useRef<() => void>(undefined);\n if (scrollToBottomCallbackRef.current === undefined) {\n scrollToBottomCallbackRef.current = function () {\n const container = containerRef.current;\n if (container === null) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"instant\",\n });\n };\n }\n const isScrollIndicatorVisible =\n distanceToBottom !== null && distanceToBottom > MIN_DISTANCE_TO_BOTTOM;\n\n return (\n <div\n ref={containerRef}\n {...props}\n className={classNames(\"lb-root lb-ai-chat\", className)}\n >\n <div className=\"lb-ai-chat-content\">\n {isLoading ? (\n <div className=\"lb-loading lb-ai-chat-loading\">\n <SpinnerIcon />\n </div>\n ) : error !== undefined ? (\n <div className=\"lb-error lb-ai-chat-error\">\n {$.AI_CHAT_MESSAGES_ERROR(error)}\n </div>\n ) : (\n <div className=\"lb-ai-chat-messages\">\n <Messages\n messages={messages}\n overrides={$}\n onDistanceToBottomChange={scrollToBottomCallbackRef.current}\n />\n </div>\n )}\n </div>\n\n <div className=\"lb-ai-chat-footer\">\n <div className=\"lb-ai-chat-footer-actions\">\n <div\n className=\"lb-elevation lb-ai-chat-scroll-indicator\"\n data-visible={isScrollIndicatorVisible ? \"\" : undefined}\n >\n <button\n className=\"lb-ai-chat-scroll-indicator-button\"\n tabIndex={isScrollIndicatorVisible ? 0 : -1}\n aria-hidden={!isScrollIndicatorVisible}\n disabled={!isScrollIndicatorVisible}\n onClick={() => {\n const container = containerRef.current;\n if (container === null) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\",\n });\n }}\n >\n <span className=\"lb-icon-container\">\n <ArrowDownIcon />\n </span>\n </button>\n </div>\n </div>\n <AiChatComposer\n key={chatId}\n chatId={chatId}\n copilotId={copilotId as CopilotId}\n overrides={$}\n autoFocus={autoFocus}\n />\n </div>\n </div>\n );\n }\n);\n\nfunction Messages({\n messages,\n overrides,\n onDistanceToBottomChange,\n}: {\n messages: readonly UiChatMessage[];\n overrides: Partial<GlobalOverrides & AiChatMessageOverrides>;\n onDistanceToBottomChange: () => void;\n}) {\n const $ = useOverrides(overrides);\n\n useLayoutEffect(() => {\n onDistanceToBottomChange();\n }, [onDistanceToBottomChange]);\n\n return messages.map((message) => {\n if (message.role === \"user\") {\n return (\n <AiChatUserMessage key={message.id} message={message} overrides={$} />\n );\n } else if (message.role === \"assistant\") {\n return (\n <AiChatAssistantMessage\n key={message.id}\n message={message}\n overrides={$}\n />\n );\n } else {\n return null;\n }\n });\n}\n"],"names":["forwardRef","overrides","useAiChatMessages","useOverrides","useRef","useState","useClient","useImperativeHandle","useEffect","kInternal","unregister","container","jsxs","classNames","jsx","SpinnerIcon","ArrowDownIcon","AiChatComposer","useLayoutEffect","AiChatUserMessage","AiChatAssistantMessage"],"mappings":"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"}
1
+ {"version":3,"file":"AiChat.cjs","sources":["../../src/components/AiChat.tsx"],"sourcesContent":["import type {\n AiKnowledgeSource,\n AiToolDefinition,\n CopilotId,\n MessageId,\n UiChatMessage,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport {\n RegisterAiKnowledge,\n useAiChatMessages,\n useClient,\n} from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n type ComponentProps,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nimport type { GlobalComponents } from \"../components\";\nimport { ArrowDownIcon } from \"../icons/ArrowDown\";\nimport { SpinnerIcon } from \"../icons/Spinner\";\nimport {\n type AiChatComposerOverrides,\n type AiChatMessageOverrides,\n type AiChatOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../overrides\";\nimport { classNames } from \"../utils/class-names\";\nimport { AiChatAssistantMessage } from \"./internal/AiChatAssistantMessage\";\nimport { AiChatComposer } from \"./internal/AiChatComposer\";\nimport { AiChatUserMessage } from \"./internal/AiChatUserMessage\";\n\n/**\n * The number of pixels from the bottom of the messages list to trigger the scroll to bottom.\n */\nconst MIN_DISTANCE_TO_BOTTOM = 50;\n\nexport interface AiChatProps extends ComponentProps<\"div\"> {\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n /**\n * Whether to focus the chat composer on mount.\n */\n autoFocus?: boolean;\n /**\n * The id of the copilot to use to send the message.\n */\n copilotId?: string;\n /**\n * The contextual knowledge to include in the chat. May be used by the assistant when generating responses.\n * Any knowledge you provide via this prop will be added to any already globally registered knowledge via <RegisterAiKnowledge />.\n */\n knowledge?: AiKnowledgeSource[];\n /**\n * Tool definitions to make available within this chat. May be used by the assistant when generating responses.\n */\n tools?: Record<string, AiToolDefinition>;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<\n GlobalOverrides &\n AiChatMessageOverrides &\n AiChatComposerOverrides &\n AiChatOverrides\n >;\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents>; // TODO: Add more slots than the global ones over time (Markdown tags, the empty state, etc)\n}\n\nexport const AiChat = forwardRef<HTMLDivElement, AiChatProps>(\n (\n {\n chatId,\n copilotId,\n autoFocus,\n overrides,\n knowledge,\n tools = {},\n components,\n className,\n ...props\n },\n forwardedRef\n ) => {\n const { messages, isLoading, error } = useAiChatMessages(chatId);\n const $ = useOverrides(overrides);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [distanceToBottom, setDistanceToBottom] = useState<number | null>(\n null\n );\n const client = useClient();\n const ai = client[kInternal].ai;\n\n const [lastSendMessageId, setLastSendMessageId] =\n useState<MessageId | null>(null);\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(\n forwardedRef,\n () => containerRef.current,\n []\n );\n\n // Register the provided tools to the chat on mount and unregister them on unmount\n useEffect(() => {\n Object.entries(tools).map(([key, value]) =>\n ai.registerChatTool(chatId, key, value)\n );\n return () => {\n Object.entries(tools).map(([key]) =>\n ai.unregisterChatTool(chatId, key)\n );\n };\n }, [ai, chatId, tools]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n function handleScrollChange() {\n const container = containerRef.current;\n if (container === null) return;\n\n setDistanceToBottom(\n container.scrollHeight - container.clientHeight - container.scrollTop\n );\n }\n container.addEventListener(\"scroll\", handleScrollChange);\n return () => {\n container.removeEventListener(\"scroll\", handleScrollChange);\n };\n }, []);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n\n setDistanceToBottom(\n container.scrollHeight - container.clientHeight - container.scrollTop\n );\n }, [messages]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\",\n });\n }, [lastSendMessageId]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container === null) return;\n\n const observer = new ResizeObserver(() => {\n const container = containerRef.current;\n if (container === null) return;\n setDistanceToBottom(\n container.scrollHeight - container.clientHeight - container.scrollTop\n );\n });\n observer.observe(container);\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const scrollToBottomCallbackRef = useRef<() => void>(undefined);\n if (scrollToBottomCallbackRef.current === undefined) {\n scrollToBottomCallbackRef.current = function () {\n const container = containerRef.current;\n if (container === null) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"instant\",\n });\n };\n }\n const isScrollIndicatorVisible =\n distanceToBottom !== null && distanceToBottom > MIN_DISTANCE_TO_BOTTOM;\n\n return (\n <div\n ref={containerRef}\n {...props}\n className={classNames(\"lb-root lb-ai-chat\", className)}\n >\n {knowledge\n ? knowledge.map((source, index) => (\n <RegisterAiKnowledge\n key={index}\n description={source.description}\n value={source.value}\n // knowledgeKey={source.knowledgeKey}\n />\n ))\n : null}\n <div className=\"lb-ai-chat-content\">\n {isLoading ? (\n <div className=\"lb-loading lb-ai-chat-loading\">\n <SpinnerIcon />\n </div>\n ) : error !== undefined ? (\n <div className=\"lb-error lb-ai-chat-error\">\n {$.AI_CHAT_MESSAGES_ERROR(error)}\n </div>\n ) : (\n <div className=\"lb-ai-chat-messages\">\n <Messages\n messages={messages}\n overrides={$}\n components={components}\n onDistanceToBottomChange={scrollToBottomCallbackRef.current}\n />\n </div>\n )}\n </div>\n\n <div className=\"lb-ai-chat-footer\">\n <div className=\"lb-ai-chat-footer-actions\">\n <div\n className=\"lb-elevation lb-ai-chat-scroll-indicator\"\n data-visible={isScrollIndicatorVisible ? \"\" : undefined}\n >\n <button\n className=\"lb-ai-chat-scroll-indicator-button\"\n tabIndex={isScrollIndicatorVisible ? 0 : -1}\n aria-hidden={!isScrollIndicatorVisible}\n disabled={!isScrollIndicatorVisible}\n onClick={() => {\n const container = containerRef.current;\n if (container === null) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\",\n });\n }}\n >\n <span className=\"lb-icon-container\">\n <ArrowDownIcon />\n </span>\n </button>\n </div>\n </div>\n <AiChatComposer\n key={chatId}\n chatId={chatId}\n copilotId={copilotId as CopilotId}\n overrides={$}\n autoFocus={autoFocus}\n onUserMessageCreate={({ id }) => setLastSendMessageId(id)}\n />\n </div>\n </div>\n );\n }\n);\n\nfunction Messages({\n messages,\n overrides,\n components,\n onDistanceToBottomChange,\n}: {\n messages: readonly UiChatMessage[];\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n components?: Partial<GlobalComponents>;\n onDistanceToBottomChange: () => void;\n}) {\n useLayoutEffect(() => {\n onDistanceToBottomChange();\n }, [onDistanceToBottomChange]);\n\n return messages.map((message) => {\n if (message.role === \"user\") {\n return (\n <AiChatUserMessage\n key={message.id}\n message={message}\n overrides={overrides}\n />\n );\n } else if (message.role === \"assistant\") {\n return (\n <AiChatAssistantMessage\n key={message.id}\n message={message}\n overrides={overrides}\n components={components}\n />\n );\n } else {\n return null;\n }\n });\n}\n"],"names":["forwardRef","overrides","useAiChatMessages","useOverrides","useRef","useState","useClient","kInternal","useImperativeHandle","useEffect","container","jsxs","classNames","jsx","RegisterAiKnowledge","SpinnerIcon","ArrowDownIcon","AiChatComposer","useLayoutEffect","AiChatUserMessage","AiChatAssistantMessage"],"mappings":"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"}