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

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 (113) hide show
  1. package/dist/_private/index.cjs +10 -12
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +141 -112
  4. package/dist/_private/index.d.ts +141 -112
  5. package/dist/_private/index.js +8 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +74 -106
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +75 -107
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/AiTool.cjs +164 -0
  12. package/dist/components/AiTool.cjs.map +1 -0
  13. package/dist/components/AiTool.js +162 -0
  14. package/dist/components/AiTool.js.map +1 -0
  15. package/dist/components/Comment.cjs +5 -3
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +6 -4
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/InboxNotificationList.cjs +11 -3
  20. package/dist/components/InboxNotificationList.cjs.map +1 -1
  21. package/dist/components/InboxNotificationList.js +12 -4
  22. package/dist/components/InboxNotificationList.js.map +1 -1
  23. package/dist/components/internal/AiChatAssistantMessage.cjs +43 -199
  24. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  25. package/dist/components/internal/AiChatAssistantMessage.js +44 -200
  26. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  27. package/dist/components/internal/AiChatComposer.cjs +1 -1
  28. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  29. package/dist/components/internal/AiChatComposer.js +1 -1
  30. package/dist/components/internal/AiChatComposer.js.map +1 -1
  31. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  32. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  33. package/dist/components/internal/AiChatUserMessage.js +17 -10
  34. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  35. package/dist/components/internal/Button.cjs.map +1 -1
  36. package/dist/components/internal/Button.js.map +1 -1
  37. package/dist/components/internal/CodeBlock.cjs +72 -0
  38. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  39. package/dist/components/internal/CodeBlock.js +70 -0
  40. package/dist/components/internal/CodeBlock.js.map +1 -0
  41. package/dist/components/internal/Emoji.cjs +12 -4
  42. package/dist/components/internal/Emoji.cjs.map +1 -1
  43. package/dist/components/internal/Emoji.js +12 -4
  44. package/dist/components/internal/Emoji.js.map +1 -1
  45. package/dist/components/internal/Prose.cjs +37 -0
  46. package/dist/components/internal/Prose.cjs.map +1 -0
  47. package/dist/components/internal/Prose.js +35 -0
  48. package/dist/components/internal/Prose.js.map +1 -0
  49. package/dist/index.cjs +2 -2
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +50 -9
  52. package/dist/index.d.ts +50 -9
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/overrides.cjs +2 -4
  56. package/dist/overrides.cjs.map +1 -1
  57. package/dist/overrides.js +2 -4
  58. package/dist/overrides.js.map +1 -1
  59. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  60. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  61. package/dist/primitives/AiMessage/contexts.js +15 -0
  62. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  63. package/dist/primitives/AiMessage/index.cjs +133 -0
  64. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  65. package/dist/primitives/AiMessage/index.js +131 -0
  66. package/dist/primitives/AiMessage/index.js.map +1 -0
  67. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  68. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  69. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  70. package/dist/primitives/Collapsible/index.js.map +1 -0
  71. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +99 -63
  72. package/dist/primitives/Markdown.cjs.map +1 -0
  73. package/dist/primitives/{internal/Markdown.js → Markdown.js} +100 -63
  74. package/dist/primitives/Markdown.js.map +1 -0
  75. package/dist/primitives/index.cjs +4 -6
  76. package/dist/primitives/index.cjs.map +1 -1
  77. package/dist/primitives/index.d.cts +2 -75
  78. package/dist/primitives/index.d.ts +2 -75
  79. package/dist/primitives/index.js +4 -6
  80. package/dist/primitives/index.js.map +1 -1
  81. package/dist/utils/ErrorBoundary.cjs +48 -0
  82. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  83. package/dist/utils/ErrorBoundary.js +45 -0
  84. package/dist/utils/ErrorBoundary.js.map +1 -0
  85. package/dist/utils/use-visible.cjs +63 -45
  86. package/dist/utils/use-visible.cjs.map +1 -1
  87. package/dist/utils/use-visible.js +64 -46
  88. package/dist/utils/use-visible.js.map +1 -1
  89. package/dist/version.cjs +1 -1
  90. package/dist/version.js +1 -1
  91. package/package.json +4 -4
  92. package/src/styles/constants.css +1 -1
  93. package/src/styles/dark/index.css +7 -3
  94. package/src/styles/index.css +555 -253
  95. package/src/styles/utils.css +1 -1
  96. package/styles/dark/attributes.css +1 -1
  97. package/styles/dark/attributes.css.map +1 -1
  98. package/styles/dark/media-query.css +1 -1
  99. package/styles/dark/media-query.css.map +1 -1
  100. package/styles.css +1 -1
  101. package/styles.css.map +1 -1
  102. package/dist/components/AiToolDebugger.cjs +0 -74
  103. package/dist/components/AiToolDebugger.cjs.map +0 -1
  104. package/dist/components/AiToolDebugger.js +0 -72
  105. package/dist/components/AiToolDebugger.js.map +0 -1
  106. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  107. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  108. package/dist/primitives/internal/Emoji.cjs +0 -32
  109. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  110. package/dist/primitives/internal/Emoji.js +0 -30
  111. package/dist/primitives/internal/Emoji.js.map +0 -1
  112. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  113. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1,26 +1,19 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var core = require('@liveblocks/core');
5
- var react$1 = require('@liveblocks/react');
6
- var _private = require('@liveblocks/react/_private');
7
- var marked = require('marked');
8
4
  var react = require('react');
9
- require('../../_private/index.cjs');
10
5
  var components = require('../../components.cjs');
11
- var Check = require('../../icons/Check.cjs');
12
6
  var ChevronRight = require('../../icons/ChevronRight.cjs');
13
- var Copy = require('../../icons/Copy.cjs');
14
7
  var Warning = require('../../icons/Warning.cjs');
15
8
  var overrides = require('../../overrides.cjs');
16
- var index = require('../../primitives/internal/Collapsible/index.cjs');
17
- var Markdown = require('../../primitives/internal/Markdown.cjs');
9
+ var index = require('../../primitives/AiMessage/index.cjs');
10
+ var index$1 = require('../../primitives/Collapsible/index.cjs');
18
11
  var classNames = require('../../utils/class-names.cjs');
19
- var Button = require('./Button.cjs');
12
+ var Prose = require('./Prose.cjs');
20
13
 
21
14
  const AiChatAssistantMessage = react.memo(
22
15
  react.forwardRef(
23
- ({ message, className, overrides: overrides$1, components, ...props }, forwardedRef) => {
16
+ ({ message, className, overrides: overrides$1, components: components$1, ...props }, forwardedRef) => {
24
17
  const $ = overrides.useOverrides(overrides$1);
25
18
  let children = null;
26
19
  if (message.deletedAt !== void 0) {
@@ -36,35 +29,23 @@ const AiChatAssistantMessage = react.memo(
36
29
  });
37
30
  } else {
38
31
  children = /* @__PURE__ */ jsxRuntime.jsx(AssistantMessageContent, {
39
- content: message.contentSoFar,
40
- chatId: message.chatId,
41
- messageId: message.id,
42
- components
32
+ message
43
33
  });
44
34
  }
45
35
  } else if (message.status === "completed") {
46
36
  children = /* @__PURE__ */ jsxRuntime.jsx(AssistantMessageContent, {
47
- content: message.content,
48
- chatId: message.chatId,
49
- messageId: message.id,
50
- components
37
+ message
51
38
  });
52
39
  } else if (message.status === "failed") {
53
40
  if (message.errorReason === "Aborted by user") {
54
41
  children = /* @__PURE__ */ jsxRuntime.jsx(AssistantMessageContent, {
55
- content: message.contentSoFar,
56
- chatId: message.chatId,
57
- messageId: message.id,
58
- components
42
+ message
59
43
  });
60
44
  } else {
61
45
  children = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
62
46
  children: [
63
47
  /* @__PURE__ */ jsxRuntime.jsx(AssistantMessageContent, {
64
- content: message.contentSoFar,
65
- chatId: message.chatId,
66
- messageId: message.id,
67
- components
48
+ message
68
49
  }),
69
50
  /* @__PURE__ */ jsxRuntime.jsxs("div", {
70
51
  className: "lb-ai-chat-message-error",
@@ -87,206 +68,69 @@ const AiChatAssistantMessage = react.memo(
87
68
  ),
88
69
  ...props,
89
70
  ref: forwardedRef,
90
- children
71
+ children: /* @__PURE__ */ jsxRuntime.jsx(components.ComponentsProvider, {
72
+ components: components$1,
73
+ children
74
+ })
91
75
  });
92
76
  }
93
77
  )
94
78
  );
95
- function AssistantMessageContent({
96
- content,
97
- chatId,
98
- messageId,
99
- components
100
- }) {
101
- const isReasoning = content.some((part) => part.type === "reasoning") && content.every((part) => part.type === "reasoning");
102
- return /* @__PURE__ */ jsxRuntime.jsx("div", {
103
- className: "lb-ai-chat-message-content",
104
- children: content.map((part, index) => {
105
- switch (part.type) {
106
- case "text": {
107
- return /* @__PURE__ */ jsxRuntime.jsx(TextPart, {
108
- text: part.text,
109
- components,
110
- className: "lb-ai-chat-message-text"
111
- }, index);
112
- }
113
- case "tool-invocation": {
114
- return /* @__PURE__ */ jsxRuntime.jsx(ToolInvocationPart, {
115
- chatId,
116
- messageId,
117
- part
118
- }, index);
119
- }
120
- case "reasoning": {
121
- return /* @__PURE__ */ jsxRuntime.jsx(ReasoningPart, {
122
- text: part.text,
123
- isPending: isReasoning,
124
- components
125
- }, index);
126
- }
127
- default: {
128
- return null;
129
- }
130
- }
131
- })
132
- });
133
- }
134
- const TextPart = react.forwardRef(
135
- ({ text, components, ...props }, forwardedRef) => {
136
- const tokens = react.useMemo(() => {
137
- return new marked.Lexer().lex(text);
138
- }, [text]);
139
- return /* @__PURE__ */ jsxRuntime.jsx("div", {
140
- ref: forwardedRef,
141
- ...props,
142
- children: tokens.map((token, index) => {
143
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlockTokenComp, {
144
- token,
145
- components
146
- }, index);
147
- })
148
- });
149
- }
150
- );
151
- function CodeBlock({
152
- language,
153
- code
154
- }) {
155
- const [isCopied, setCopied] = react.useState(false);
156
- const timeoutRef = react.useRef(null);
157
- react.useEffect(() => {
158
- if (isCopied) {
159
- timeoutRef.current = setTimeout(() => {
160
- setCopied(false);
161
- }, 1e3);
162
- }
163
- return () => {
164
- if (timeoutRef.current) {
165
- clearTimeout(timeoutRef.current);
166
- }
167
- };
168
- }, [isCopied]);
169
- return /* @__PURE__ */ jsxRuntime.jsxs("div", {
170
- className: "lb-code-block",
171
- children: [
172
- /* @__PURE__ */ jsxRuntime.jsxs("div", {
173
- className: "lb-code-block-header",
174
- children: [
175
- /* @__PURE__ */ jsxRuntime.jsx("span", {
176
- className: "lb-code-block-title",
177
- children: language ?? "Plain text"
178
- }),
179
- /* @__PURE__ */ jsxRuntime.jsx("div", {
180
- className: "lb-code-block-header-actions",
181
- children: /* @__PURE__ */ jsxRuntime.jsx(Button.Button, {
182
- className: "lb-code-block-header-action",
183
- icon: isCopied ? /* @__PURE__ */ jsxRuntime.jsx(Check.CheckIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(Copy.CopyIcon, {}),
184
- onClick: () => {
185
- setCopied(true);
186
- navigator.clipboard.writeText(code);
187
- }
188
- })
189
- })
190
- ]
191
- }),
192
- /* @__PURE__ */ jsxRuntime.jsx("pre", {
193
- className: "lb-code-block-content",
194
- children: /* @__PURE__ */ jsxRuntime.jsx("code", {
195
- children: code
196
- })
197
- })
198
- ]
79
+ function AssistantMessageContent({ message }) {
80
+ return /* @__PURE__ */ jsxRuntime.jsx(index.Content, {
81
+ message,
82
+ components: {
83
+ TextPart,
84
+ ReasoningPart,
85
+ ToolInvocationPart
86
+ },
87
+ className: "lb-ai-chat-message-content"
199
88
  });
200
89
  }
201
- const MemoizedBlockTokenComp = react.memo(
202
- function BlockTokenComp({
203
- token,
204
- components: components$1
205
- }) {
206
- const { Anchor } = components.useComponents(components$1);
207
- return /* @__PURE__ */ jsxRuntime.jsx(Markdown.BlockTokenComp, {
208
- token,
209
- components: { CodeBlock, Anchor }
210
- });
211
- },
212
- (prevProps, nextProps) => {
213
- const prevToken = prevProps.token;
214
- const nextToken = nextProps.token;
215
- if (prevToken.raw.length !== nextToken.raw.length) {
216
- return false;
217
- }
218
- if (prevToken.type !== nextToken.type) {
219
- return false;
220
- }
221
- return prevToken.raw === nextToken.raw;
222
- }
223
- );
224
- function noop() {
225
- }
226
- function ToolInvocationPart({
227
- chatId,
228
- messageId,
229
- part
230
- }) {
231
- const client = react$1.useClient();
232
- const ai = client[core.kInternal].ai;
233
- const tool = _private.useSignal(ai.signals.getToolDefinition\u03A3(chatId, part.toolName));
234
- const respond = react.useCallback(
235
- (result) => {
236
- ai.setToolResult(
237
- chatId,
238
- messageId,
239
- part.toolCallId,
240
- result
241
- );
242
- },
243
- [ai, chatId, messageId, part.toolCallId]
244
- );
245
- if (tool === void 0 || tool.render === void 0)
246
- return null;
247
- const { type: _, ...rest } = part;
248
- return /* @__PURE__ */ jsxRuntime.jsx("div", {
249
- className: "lb-ai-chat-message-tool",
250
- children: /* @__PURE__ */ jsxRuntime.jsx(tool.render, {
251
- ...rest,
252
- respond: part.status === "executing" ? respond : noop
253
- })
90
+ function TextPart({ part }) {
91
+ return /* @__PURE__ */ jsxRuntime.jsx(Prose.Prose, {
92
+ content: part.text,
93
+ className: "lb-ai-chat-message-text"
254
94
  });
255
95
  }
256
96
  function ReasoningPart({
257
- text,
258
- isPending,
259
- components
97
+ part,
98
+ isStreaming
260
99
  }) {
261
100
  const [isOpen, setIsOpen] = react.useState(false);
262
- return /* @__PURE__ */ jsxRuntime.jsxs(index.Root, {
263
- className: "lb-ai-chat-message-collapsible lb-ai-chat-message-reasoning",
101
+ return /* @__PURE__ */ jsxRuntime.jsxs(index$1.Root, {
102
+ className: "lb-collapsible lb-ai-chat-message-reasoning",
264
103
  open: isOpen,
265
104
  onOpenChange: setIsOpen,
266
105
  children: [
267
- /* @__PURE__ */ jsxRuntime.jsxs(index.Trigger, {
106
+ /* @__PURE__ */ jsxRuntime.jsxs(index$1.Trigger, {
268
107
  className: classNames.classNames(
269
- "lb-ai-chat-message-collapsible-trigger",
270
- isPending && "lb-ai-chat-pending"
108
+ "lb-collapsible-trigger",
109
+ isStreaming && "lb-ai-chat-pending"
271
110
  ),
272
111
  children: [
273
112
  "Reasoning",
274
113
  /* @__PURE__ */ jsxRuntime.jsx("span", {
275
- className: "lb-ai-chat-message-collapsible-chevron lb-icon-container",
114
+ className: "lb-collapsible-chevron lb-icon-container",
276
115
  children: /* @__PURE__ */ jsxRuntime.jsx(ChevronRight.ChevronRightIcon, {})
277
116
  })
278
117
  ]
279
118
  }),
280
- /* @__PURE__ */ jsxRuntime.jsx(index.Content, {
281
- className: "lb-ai-chat-message-collapsible-content",
282
- children: /* @__PURE__ */ jsxRuntime.jsx(TextPart, {
283
- text,
284
- components
119
+ /* @__PURE__ */ jsxRuntime.jsx(index$1.Content, {
120
+ className: "lb-collapsible-content",
121
+ children: /* @__PURE__ */ jsxRuntime.jsx(Prose.Prose, {
122
+ content: part.text
285
123
  })
286
124
  })
287
125
  ]
288
126
  });
289
127
  }
128
+ function ToolInvocationPart({ children }) {
129
+ return /* @__PURE__ */ jsxRuntime.jsx("div", {
130
+ className: "lb-ai-chat-message-tool-invocation",
131
+ children
132
+ });
133
+ }
290
134
 
291
135
  exports.AiChatAssistantMessage = AiChatAssistantMessage;
292
136
  //# sourceMappingURL=AiChatAssistantMessage.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiChatAssistantMessage.cjs","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import type {\n AiAssistantContentPart,\n AiToolInvocationPart,\n Json,\n MessageId,\n UiAssistantMessage,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport { Lexer } from \"marked\";\nimport {\n type ComponentProps,\n forwardRef,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { Button } from \"../../_private\";\nimport { type GlobalComponents, useComponents } from \"../../components\";\nimport { CheckIcon } from \"../../icons/Check\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { CopyIcon } from \"../../icons/Copy\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport {\n type AiChatMessageOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../../overrides\";\nimport * as CollapsiblePrimitive from \"../../primitives/internal/Collapsible\";\nimport {\n type BlockToken,\n BlockTokenComp as BlockTokenCompPrimitive,\n type MarkdownComponents,\n} from \"../../primitives/internal/Markdown\";\nimport { classNames } from \"../../utils/class-names\";\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatAssistantMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatAssistantMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiAssistantMessage;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents>;\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n ({ message, className, overrides, components, ...props }, forwardedRef) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n if (message.deletedAt !== undefined) {\n children = (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n );\n } else if (\n message.status === \"generating\" ||\n message.status === \"awaiting-tool\"\n ) {\n if (message.contentSoFar.length === 0) {\n children = (\n <div className=\"lb-ai-chat-message-thinking lb-ai-chat-pending\">\n {$.AI_CHAT_MESSAGE_THINKING}\n </div>\n );\n } else {\n children = (\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\n messageId={message.id}\n components={components}\n />\n );\n }\n } else if (message.status === \"completed\") {\n children = (\n <AssistantMessageContent\n content={message.content}\n chatId={message.chatId}\n messageId={message.id}\n components={components}\n />\n );\n } else if (message.status === \"failed\") {\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = (\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\n messageId={message.id}\n components={components}\n />\n );\n } else {\n children = (\n <>\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\n messageId={message.id}\n components={components}\n />\n\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n {message.errorReason}\n </div>\n </>\n );\n }\n }\n\n return (\n <div\n className={classNames(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </div>\n );\n }\n )\n);\n\nfunction AssistantMessageContent({\n content,\n chatId,\n messageId,\n components,\n}: {\n content: AiAssistantContentPart[];\n chatId: string;\n messageId: MessageId;\n components: Partial<GlobalComponents> | undefined;\n}) {\n // A message is considered to be in \"reasoning\" state if it only contains reasoning parts and no other parts.\n const isReasoning =\n content.some((part) => part.type === \"reasoning\") &&\n content.every((part) => part.type === \"reasoning\");\n\n return (\n <div className=\"lb-ai-chat-message-content\">\n {content.map((part, index) => {\n switch (part.type) {\n case \"text\": {\n return (\n <TextPart\n key={index}\n text={part.text}\n components={components}\n className=\"lb-ai-chat-message-text\"\n />\n );\n }\n case \"tool-invocation\": {\n return (\n <ToolInvocationPart\n key={index}\n chatId={chatId}\n messageId={messageId}\n part={part}\n />\n );\n }\n case \"reasoning\": {\n return (\n <ReasoningPart\n key={index}\n text={part.text}\n isPending={isReasoning}\n components={components}\n />\n );\n }\n default: {\n return null;\n }\n }\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * TextPart\n * -----------------------------------------------------------------------------------------------*/\ninterface TextPartProps extends ComponentProps<\"div\"> {\n text: string;\n components: Partial<GlobalComponents> | undefined;\n}\n\nconst TextPart = forwardRef<HTMLDivElement, TextPartProps>(\n ({ text, components, ...props }, forwardedRef) => {\n const tokens = useMemo(() => {\n return new Lexer().lex(text);\n }, [text]);\n\n return (\n <div ref={forwardedRef} {...props}>\n {tokens.map((token, index) => {\n return (\n <MemoizedBlockTokenComp\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n })}\n </div>\n );\n }\n);\n\n// TODO: Improve (better copy handling, tooltips, etc)\nfunction CodeBlock({\n language,\n code,\n}: ComponentProps<MarkdownComponents[\"CodeBlock\"]>) {\n const [isCopied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isCopied) {\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 1000);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isCopied]);\n\n return (\n <div className=\"lb-code-block\">\n <div className=\"lb-code-block-header\">\n <span className=\"lb-code-block-title\">{language ?? \"Plain text\"}</span>\n <div className=\"lb-code-block-header-actions\">\n <Button\n className=\"lb-code-block-header-action\"\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n onClick={() => {\n setCopied(true);\n navigator.clipboard.writeText(code);\n }}\n />\n </div>\n </div>\n <pre className=\"lb-code-block-content\">\n <code>{code}</code>\n </pre>\n </div>\n );\n}\n\nconst MemoizedBlockTokenComp = memo(\n function BlockTokenComp({\n token,\n components,\n }: {\n token: BlockToken;\n components?: Partial<GlobalComponents>;\n }) {\n const { Anchor } = useComponents(components);\n\n return (\n <BlockTokenCompPrimitive\n token={token}\n components={{ CodeBlock, Anchor }}\n />\n );\n },\n (prevProps, nextProps) => {\n const prevToken = prevProps.token;\n const nextToken = nextProps.token;\n if (prevToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n if (prevToken.type !== nextToken.type) {\n return false;\n }\n return prevToken.raw === nextToken.raw;\n }\n);\n\nfunction noop() {\n // Do nothing\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ToolInvocationPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolInvocationPart({\n chatId,\n messageId,\n part,\n}: {\n chatId: string;\n messageId: MessageId;\n part: AiToolInvocationPart;\n}) {\n const client = useClient();\n const ai = client[kInternal].ai;\n const tool = useSignal(ai.signals.getToolDefinitionΣ(chatId, part.toolName));\n const respond = useCallback(\n (result: Json) => {\n ai.setToolResult(\n chatId,\n messageId,\n part.toolCallId,\n result\n // TODO Pass in AiGenerationOptions here?\n );\n },\n [ai, chatId, messageId, part.toolCallId]\n );\n\n if (tool === undefined || tool.render === undefined) return null;\n\n const { type: _, ...rest } = part;\n return (\n <div className=\"lb-ai-chat-message-tool\">\n <tool.render\n {...rest}\n respond={\n // It only makes sense and is safe to call `respond()` in \"executing\" state.\n part.status === \"executing\" ? respond : noop\n }\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({\n text,\n isPending,\n components,\n}: {\n text: string;\n isPending: boolean;\n components: Partial<GlobalComponents> | undefined;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <CollapsiblePrimitive.Root\n className=\"lb-ai-chat-message-collapsible lb-ai-chat-message-reasoning\"\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <CollapsiblePrimitive.Trigger\n className={classNames(\n \"lb-ai-chat-message-collapsible-trigger\",\n isPending && \"lb-ai-chat-pending\"\n )}\n >\n {/* TODO: If `isPending` is true, show \"Reasoning…\"/\"Thinking…\", otherwise show \"Reasoned/thought for x seconds\"? */}\n Reasoning\n <span className=\"lb-ai-chat-message-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n </CollapsiblePrimitive.Trigger>\n\n <CollapsiblePrimitive.Content className=\"lb-ai-chat-message-collapsible-content\">\n <TextPart text={text} components={components} />\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n"],"names":["memo","forwardRef","overrides","useOverrides","jsx","jsxs","Fragment","WarningIcon","classNames","useMemo","Lexer","useState","useRef","useEffect","Button","CheckIcon","CopyIcon","components","useComponents","BlockTokenCompPrimitive","useClient","kInternal","useSignal","useCallback","CollapsiblePrimitive.Root","CollapsiblePrimitive.Trigger","ChevronRightIcon","CollapsiblePrimitive.Content"],"mappings":"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"}
1
+ {"version":3,"file":"AiChatAssistantMessage.cjs","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import type { UiAssistantMessage } from \"@liveblocks/core\";\nimport {\n type ComponentProps,\n forwardRef,\n memo,\n type PropsWithChildren,\n type ReactNode,\n useState,\n} from \"react\";\n\nimport { ComponentsProvider, type GlobalComponents } from \"../../components\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport {\n type AiChatMessageOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../../overrides\";\nimport * as AiMessage from \"../../primitives/AiMessage\";\nimport type {\n AiMessageContentReasoningPartProps,\n AiMessageContentTextPartProps,\n} from \"../../primitives/AiMessage/types\";\nimport * as Collapsible from \"../../primitives/Collapsible\";\nimport { classNames } from \"../../utils/class-names\";\nimport { Prose } from \"./Prose\";\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatAssistantMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatAssistantMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiAssistantMessage;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents>;\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n ({ message, className, overrides, components, ...props }, forwardedRef) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n if (message.deletedAt !== undefined) {\n children = (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n );\n } else if (\n message.status === \"generating\" ||\n message.status === \"awaiting-tool\"\n ) {\n if (message.contentSoFar.length === 0) {\n children = (\n <div className=\"lb-ai-chat-message-thinking lb-ai-chat-pending\">\n {$.AI_CHAT_MESSAGE_THINKING}\n </div>\n );\n } else {\n children = <AssistantMessageContent message={message} />;\n }\n } else if (message.status === \"completed\") {\n children = <AssistantMessageContent message={message} />;\n } else if (message.status === \"failed\") {\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = <AssistantMessageContent message={message} />;\n } else {\n children = (\n <>\n <AssistantMessageContent message={message} />\n\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n {message.errorReason}\n </div>\n </>\n );\n }\n }\n\n return (\n <div\n className={classNames(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n <ComponentsProvider components={components}>\n {children}\n </ComponentsProvider>\n </div>\n );\n }\n )\n);\n\nfunction AssistantMessageContent({ message }: { message: UiAssistantMessage }) {\n return (\n <AiMessage.Content\n message={message}\n components={{\n TextPart,\n ReasoningPart,\n ToolInvocationPart,\n }}\n className=\"lb-ai-chat-message-content\"\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * TextPart\n * -----------------------------------------------------------------------------------------------*/\nfunction TextPart({ part }: AiMessageContentTextPartProps) {\n return <Prose content={part.text} className=\"lb-ai-chat-message-text\" />;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({\n part,\n isStreaming,\n}: AiMessageContentReasoningPartProps) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <Collapsible.Root\n className=\"lb-collapsible lb-ai-chat-message-reasoning\"\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <Collapsible.Trigger\n className={classNames(\n \"lb-collapsible-trigger\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {/* TODO: If `isStreaming` is true, show \"Reasoning…\"/\"Thinking…\", otherwise show \"Reasoned/thought for x seconds\"? */}\n Reasoning\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n </Collapsible.Trigger>\n\n <Collapsible.Content className=\"lb-collapsible-content\">\n <Prose content={part.text} />\n </Collapsible.Content>\n </Collapsible.Root>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ToolInvocationPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolInvocationPart({ children }: PropsWithChildren) {\n return <div className=\"lb-ai-chat-message-tool-invocation\">{children}</div>;\n}\n"],"names":["memo","forwardRef","overrides","components","useOverrides","jsx","jsxs","Fragment","WarningIcon","classNames","ComponentsProvider","AiMessage.Content","Prose","useState","Collapsible.Root","Collapsible.Trigger","ChevronRightIcon","Collapsible.Content"],"mappings":"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"}