@liveblocks/react-ui 2.25.0-aiprivatebeta7 → 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 (135) hide show
  1. package/dist/_private/index.cjs +14 -10
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +200 -105
  4. package/dist/_private/index.d.ts +200 -105
  5. package/dist/_private/index.js +10 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +85 -120
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +87 -122
  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/Thread.cjs +3 -3
  24. package/dist/components/Thread.cjs.map +1 -1
  25. package/dist/components/Thread.js +3 -3
  26. package/dist/components/Thread.js.map +1 -1
  27. package/dist/components/internal/AiChatAssistantMessage.cjs +53 -229
  28. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  29. package/dist/components/internal/AiChatAssistantMessage.js +55 -231
  30. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  31. package/dist/components/internal/AiChatComposer.cjs +29 -17
  32. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  33. package/dist/components/internal/AiChatComposer.js +29 -17
  34. package/dist/components/internal/AiChatComposer.js.map +1 -1
  35. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  36. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  37. package/dist/components/internal/AiChatUserMessage.js +17 -10
  38. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  39. package/dist/components/internal/Button.cjs.map +1 -1
  40. package/dist/components/internal/Button.js.map +1 -1
  41. package/dist/components/internal/CodeBlock.cjs +72 -0
  42. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  43. package/dist/components/internal/CodeBlock.js +70 -0
  44. package/dist/components/internal/CodeBlock.js.map +1 -0
  45. package/dist/components/internal/Emoji.cjs +12 -4
  46. package/dist/components/internal/Emoji.cjs.map +1 -1
  47. package/dist/components/internal/Emoji.js +12 -4
  48. package/dist/components/internal/Emoji.js.map +1 -1
  49. package/dist/components/internal/Prose.cjs +37 -0
  50. package/dist/components/internal/Prose.cjs.map +1 -0
  51. package/dist/components/internal/Prose.js +35 -0
  52. package/dist/components/internal/Prose.js.map +1 -0
  53. package/dist/icon.cjs +2 -0
  54. package/dist/icon.cjs.map +1 -1
  55. package/dist/icon.js +1 -0
  56. package/dist/icon.js.map +1 -1
  57. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  58. package/dist/icons/CheckCircle.cjs.map +1 -0
  59. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  60. package/dist/icons/CheckCircle.js.map +1 -0
  61. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  62. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  63. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  64. package/dist/icons/CheckCircleFill.js.map +1 -0
  65. package/dist/icons/index.cjs +4 -4
  66. package/dist/icons/index.js +2 -2
  67. package/dist/index.cjs +2 -0
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +68 -14
  70. package/dist/index.d.ts +68 -14
  71. package/dist/index.js +1 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/overrides.cjs +2 -8
  74. package/dist/overrides.cjs.map +1 -1
  75. package/dist/overrides.js +2 -8
  76. package/dist/overrides.js.map +1 -1
  77. package/dist/primitives/AiChatComposer/index.cjs +1 -2
  78. package/dist/primitives/AiChatComposer/index.cjs.map +1 -1
  79. package/dist/primitives/AiChatComposer/index.js +1 -2
  80. package/dist/primitives/AiChatComposer/index.js.map +1 -1
  81. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  82. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  83. package/dist/primitives/AiMessage/contexts.js +15 -0
  84. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  85. package/dist/primitives/AiMessage/index.cjs +133 -0
  86. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  87. package/dist/primitives/AiMessage/index.js +131 -0
  88. package/dist/primitives/AiMessage/index.js.map +1 -0
  89. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  90. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  91. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  92. package/dist/primitives/Collapsible/index.js.map +1 -0
  93. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
  94. package/dist/primitives/Markdown.cjs.map +1 -0
  95. package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
  96. package/dist/primitives/Markdown.js.map +1 -0
  97. package/dist/primitives/index.cjs +4 -6
  98. package/dist/primitives/index.cjs.map +1 -1
  99. package/dist/primitives/index.d.cts +2 -79
  100. package/dist/primitives/index.d.ts +2 -79
  101. package/dist/primitives/index.js +4 -6
  102. package/dist/primitives/index.js.map +1 -1
  103. package/dist/utils/ErrorBoundary.cjs +48 -0
  104. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  105. package/dist/utils/ErrorBoundary.js +45 -0
  106. package/dist/utils/ErrorBoundary.js.map +1 -0
  107. package/dist/utils/use-visible.cjs +63 -45
  108. package/dist/utils/use-visible.cjs.map +1 -1
  109. package/dist/utils/use-visible.js +64 -46
  110. package/dist/utils/use-visible.js.map +1 -1
  111. package/dist/version.cjs +1 -1
  112. package/dist/version.js +1 -1
  113. package/package.json +5 -5
  114. package/src/styles/constants.css +1 -1
  115. package/src/styles/dark/index.css +7 -3
  116. package/src/styles/index.css +584 -238
  117. package/src/styles/utils.css +1 -1
  118. package/styles/dark/attributes.css +1 -1
  119. package/styles/dark/attributes.css.map +1 -1
  120. package/styles/dark/media-query.css +1 -1
  121. package/styles/dark/media-query.css.map +1 -1
  122. package/styles.css +1 -1
  123. package/styles.css.map +1 -1
  124. package/dist/icons/Resolve.cjs.map +0 -1
  125. package/dist/icons/Resolve.js.map +0 -1
  126. package/dist/icons/Resolved.cjs.map +0 -1
  127. package/dist/icons/Resolved.js.map +0 -1
  128. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  129. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  130. package/dist/primitives/internal/Emoji.cjs +0 -32
  131. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  132. package/dist/primitives/internal/Emoji.js +0 -30
  133. package/dist/primitives/internal/Emoji.js.map +0 -1
  134. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  135. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AiChatAssistantMessage.cjs","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import {\n type AiAssistantContentPart,\n type CopilotId,\n kInternal,\n type MessageId,\n type UiAssistantMessage,\n} 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 useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { Button } from \"../../components/internal/Button\";\nimport { Tooltip, TooltipProvider } from \"../../components/internal/Tooltip\";\nimport { CheckIcon } from \"../../icons/Check\";\nimport { ChevronDownIcon } from \"../../icons/ChevronDown\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { CopyIcon } from \"../../icons/Copy\";\nimport { RetryIcon } from \"../../icons/Retry\";\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} 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 * Whether to show or hide message actions.\n * @internal\n */\n showActions?: boolean | \"hover\";\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n /**\n * @internal\n * Whether to show or hide the regenerate button.\n */\n showRegenerate?: boolean;\n /**\n * @internal\n * The id of the copilot to use to regenerate the message. Only used if `showRegenerate` is true.\n */\n copilotId?: CopilotId;\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n (\n {\n message,\n showActions = false,\n showRegenerate = false,\n copilotId,\n className,\n overrides,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n function MessageActions({ text }: { text: string }) {\n if (!showActions) return null;\n\n return (\n <div className=\"lb-ai-chat-message-actions\">\n <Tooltip content={$.AI_CHAT_MESSAGE_COPY}>\n <CopyTextButton text={text} label={$.AI_CHAT_MESSAGE_COPY} />\n </Tooltip>\n\n {showRegenerate && (\n <Tooltip content={$.AI_CHAT_MESSAGE_TRY_AGAIN}>\n <RegenerateMessageButton\n chatId={message.chatId}\n messageId={message.id}\n copilotId={copilotId}\n label={$.AI_CHAT_MESSAGE_TRY_AGAIN}\n />\n </Tooltip>\n )}\n </div>\n );\n }\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 (message.status === \"pending\") {\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 />\n );\n }\n } else if (message.status === \"completed\") {\n const text: string = message.content.reduce((acc, part) => {\n if (part.type === \"text\") {\n return acc + part.text;\n }\n return acc;\n }, \"\");\n\n children = (\n <>\n <AssistantMessageContent\n content={message.content}\n chatId={message.chatId}\n />\n\n <MessageActions text={text} />\n </>\n );\n } else if (message.status === \"failed\") {\n const text: string = message.contentSoFar.reduce((acc, part) => {\n if (part.type === \"text\") {\n return acc + part.text;\n }\n return acc;\n }, \"\");\n\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = (\n <>\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\n />\n <MessageActions text={text} />\n </>\n );\n } else {\n children = (\n <>\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\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 <MessageActions text={text} />\n </>\n );\n }\n }\n\n return (\n <TooltipProvider>\n <div\n className={classNames(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n showActions === \"hover\" &&\n \"lb-ai-chat-message:show-actions-hover\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </div>\n </TooltipProvider>\n );\n }\n )\n);\n\nfunction CopyTextButton({ text, label }: { text: string; label: string }) {\n const [isCopied, setIsCopied] = useState(false);\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n return () => {\n clearTimeout(timeoutId);\n };\n }, [isCopied]);\n\n return (\n <Button\n onClick={function () {\n navigator.clipboard.writeText(text);\n setIsCopied(true);\n }}\n className=\"lb-ai-chat-message-action\"\n aria-label={label}\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n />\n );\n}\n\nfunction RegenerateMessageButton({\n chatId,\n messageId,\n copilotId,\n label,\n}: {\n chatId: string;\n messageId: MessageId;\n copilotId?: CopilotId;\n label: string;\n}) {\n const client = useClient();\n\n return (\n <Button\n onClick={function () {\n client[kInternal].ai.regenerateMessage(chatId, messageId, {\n copilotId,\n stream: true,\n });\n }}\n className=\"lb-ai-chat-message-action\"\n aria-label={label}\n icon={<RetryIcon />}\n />\n );\n}\n\nfunction AssistantMessageContent({\n content,\n chatId,\n}: {\n content: AiAssistantContentPart[];\n chatId: string;\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 className=\"lb-ai-chat-message-text\"\n />\n );\n }\n case \"tool-call\": {\n return (\n <ToolCallPart\n key={index}\n chatId={chatId}\n name={part.toolName}\n args={part.args}\n />\n );\n }\n case \"reasoning\": {\n return (\n <ReasoningPart\n key={index}\n text={part.text}\n isPending={isReasoning}\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}\n\nconst TextPart = forwardRef<HTMLDivElement, TextPartProps>(\n ({ text, ...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 token={token as BlockToken} key={index} />\n );\n })}\n </div>\n );\n }\n);\n\nconst MemoizedBlockTokenComp = memo(\n function BlockTokenComp({ token }: { token: BlockToken }) {\n return <BlockTokenCompPrimitive token={token} />;\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\n/* -------------------------------------------------------------------------------------------------\n * ToolCallPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolCallPart({\n chatId,\n name,\n args,\n}: {\n chatId: string;\n name: string;\n args: any;\n}) {\n const client = useClient();\n\n const tool = useSignal(\n client[kInternal].ai.signals.getToolDefinitionΣ(chatId, name)\n );\n if (tool === undefined || tool.render === undefined) return null;\n\n return (\n <div className=\"lb-ai-chat-message-tool\">\n <tool.render args={args as unknown} />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({\n text,\n isPending,\n}: {\n text: string;\n isPending: boolean;\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 Reasoning\n <span className=\"lb-icon-container\">\n {isOpen ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </span>\n </CollapsiblePrimitive.Trigger>\n\n <CollapsiblePrimitive.Content className=\"lb-ai-chat-message-collapsible-content\">\n {text}\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n"],"names":["memo","forwardRef","overrides","useOverrides","jsxs","jsx","Tooltip","Fragment","WarningIcon","TooltipProvider","classNames","useState","useEffect","Button","CheckIcon","CopyIcon","useClient","kInternal","RetryIcon","useMemo","Lexer","BlockTokenCompPrimitive","useSignal","CollapsiblePrimitive.Root","CollapsiblePrimitive.Trigger","ChevronDownIcon","ChevronRightIcon","CollapsiblePrimitive.Content"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqEO,MAAM,sBAAyB,GAAAA,UAAA;AAAA,EACpCC,gBAAA;AAAA,IACE,CACE;AAAA,MACE,OAAA;AAAA,MACA,WAAc,GAAA,KAAA;AAAA,MACd,cAAiB,GAAA,KAAA;AAAA,MACjB,SAAA;AAAA,MACA,SAAA;AAAA,iBACAC,WAAA;AAAA,MACG,GAAA,KAAA;AAAA,OAEL,YACG,KAAA;AACH,MAAM,MAAA,CAAA,GAAIC,uBAAaD,WAAS,CAAA,CAAA;AAEhC,MAAA,IAAI,QAAsB,GAAA,IAAA,CAAA;AAE1B,MAAS,SAAA,cAAA,CAAe,EAAE,IAAA,EAA0B,EAAA;AAClD,QAAA,IAAI,CAAC,WAAA;AAAa,UAAO,OAAA,IAAA,CAAA;AAEzB,QAAA,uBACGE,eAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACb,QAAA,EAAA;AAAA,4BAACC,cAAA,CAAAC,eAAA,EAAA;AAAA,cAAQ,SAAS,CAAE,CAAA,oBAAA;AAAA,cAClB,QAAC,kBAAAD,cAAA,CAAA,cAAA,EAAA;AAAA,gBAAe,IAAA;AAAA,gBAAY,OAAO,CAAE,CAAA,oBAAA;AAAA,eAAsB,CAAA;AAAA,aAC7D,CAAA;AAAA,YAEC,kCACEA,cAAA,CAAAC,eAAA,EAAA;AAAA,cAAQ,SAAS,CAAE,CAAA,yBAAA;AAAA,cAClB,QAAC,kBAAAD,cAAA,CAAA,uBAAA,EAAA;AAAA,gBACC,QAAQ,OAAQ,CAAA,MAAA;AAAA,gBAChB,WAAW,OAAQ,CAAA,EAAA;AAAA,gBACnB,SAAA;AAAA,gBACA,OAAO,CAAE,CAAA,yBAAA;AAAA,eACX,CAAA;AAAA,aACF,CAAA;AAAA,WAAA;AAAA,SAEJ,CAAA,CAAA;AAAA,OAEJ;AAEA,MAAI,IAAA,OAAA,CAAQ,cAAc,KAAW,CAAA,EAAA;AACnC,QAAA,QAAA,mBACGA,cAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACZ,QAAE,EAAA,CAAA,CAAA,uBAAA;AAAA,SACL,CAAA,CAAA;AAAA,OAEJ,MAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,SAAW,EAAA;AACvC,QAAI,IAAA,OAAA,CAAQ,YAAa,CAAA,MAAA,KAAW,CAAG,EAAA;AACrC,UAAA,QAAA,mBACGA,cAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAU,EAAA,gDAAA;AAAA,YACZ,QAAE,EAAA,CAAA,CAAA,wBAAA;AAAA,WACL,CAAA,CAAA;AAAA,SAEG,MAAA;AACL,UAAA,QAAA,mBACGA,cAAA,CAAA,uBAAA,EAAA;AAAA,YACC,SAAS,OAAQ,CAAA,YAAA;AAAA,YACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,WAClB,CAAA,CAAA;AAAA,SAEJ;AAAA,OACF,MAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,WAAa,EAAA;AACzC,QAAA,MAAM,OAAe,OAAQ,CAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,KAAK,IAAS,KAAA;AACzD,UAAI,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA;AACxB,YAAA,OAAO,MAAM,IAAK,CAAA,IAAA,CAAA;AAAA,WACpB;AACA,UAAO,OAAA,GAAA,CAAA;AAAA,WACN,EAAE,CAAA,CAAA;AAEL,QACE,QAAA,mBAAAD,eAAA,CAAAG,mBAAA,EAAA;AAAA,UACE,QAAA,EAAA;AAAA,4BAACF,cAAA,CAAA,uBAAA,EAAA;AAAA,cACC,SAAS,OAAQ,CAAA,OAAA;AAAA,cACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,aAClB,CAAA;AAAA,4BAECA,cAAA,CAAA,cAAA,EAAA;AAAA,cAAe,IAAA;AAAA,aAAY,CAAA;AAAA,WAAA;AAAA,SAC9B,CAAA,CAAA;AAAA,OAEJ,MAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,QAAU,EAAA;AACtC,QAAA,MAAM,OAAe,OAAQ,CAAA,YAAA,CAAa,MAAO,CAAA,CAAC,KAAK,IAAS,KAAA;AAC9D,UAAI,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA;AACxB,YAAA,OAAO,MAAM,IAAK,CAAA,IAAA,CAAA;AAAA,WACpB;AACA,UAAO,OAAA,GAAA,CAAA;AAAA,WACN,EAAE,CAAA,CAAA;AAGL,QAAI,IAAA,OAAA,CAAQ,gBAAgB,iBAAmB,EAAA;AAC7C,UACE,QAAA,mBAAAD,eAAA,CAAAG,mBAAA,EAAA;AAAA,YACE,QAAA,EAAA;AAAA,8BAACF,cAAA,CAAA,uBAAA,EAAA;AAAA,gBACC,SAAS,OAAQ,CAAA,YAAA;AAAA,gBACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,eAClB,CAAA;AAAA,8BACCA,cAAA,CAAA,cAAA,EAAA;AAAA,gBAAe,IAAA;AAAA,eAAY,CAAA;AAAA,aAAA;AAAA,WAC9B,CAAA,CAAA;AAAA,SAEG,MAAA;AACL,UACE,QAAA,mBAAAD,eAAA,CAAAG,mBAAA,EAAA;AAAA,YACE,QAAA,EAAA;AAAA,8BAACF,cAAA,CAAA,uBAAA,EAAA;AAAA,gBACC,SAAS,OAAQ,CAAA,YAAA;AAAA,gBACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,eAClB,CAAA;AAAA,8BAECD,eAAA,CAAA,KAAA,EAAA;AAAA,gBAAI,SAAU,EAAA,0BAAA;AAAA,gBACb,QAAA,EAAA;AAAA,kCAACC,cAAA,CAAA,MAAA,EAAA;AAAA,oBAAK,SAAU,EAAA,mBAAA;AAAA,oBACd,yCAACG,mBAAY,EAAA,EAAA,CAAA;AAAA,mBACf,CAAA;AAAA,kBACC,OAAQ,CAAA,WAAA;AAAA,iBAAA;AAAA,eACX,CAAA;AAAA,8BAECH,cAAA,CAAA,cAAA,EAAA;AAAA,gBAAe,IAAA;AAAA,eAAY,CAAA;AAAA,aAAA;AAAA,WAC9B,CAAA,CAAA;AAAA,SAEJ;AAAA,OACF;AAEA,MAAA,uBACGA,cAAA,CAAAI,gCAAA,EAAA;AAAA,QACC,QAAC,kBAAAJ,cAAA,CAAA,KAAA,EAAA;AAAA,UACC,SAAW,EAAAK,qBAAA;AAAA,YACT,iDAAA;AAAA,YACA,gBAAgB,OACd,IAAA,uCAAA;AAAA,YACF,SAAA;AAAA,WACF;AAAA,UACC,GAAG,KAAA;AAAA,UACJ,GAAK,EAAA,YAAA;AAAA,UAEJ,QAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KAEJ;AAAA,GACF;AACF,EAAA;AAEA,SAAS,cAAe,CAAA,EAAE,IAAM,EAAA,KAAA,EAA0C,EAAA;AACxE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,eAAS,KAAK,CAAA,CAAA;AAE9C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAM,MAAA,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,WAAA,CAAY,KAAK,CAAA,CAAA;AAAA,OAChB,GAAI,CAAA,CAAA;AACP,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,SAAS,CAAA,CAAA;AAAA,KACxB,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAA,uBACGP,cAAA,CAAAQ,aAAA,EAAA;AAAA,IACC,SAAS,WAAY;AACnB,MAAU,SAAA,CAAA,SAAA,CAAU,UAAU,IAAI,CAAA,CAAA;AAClC,MAAA,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,KAClB;AAAA,IACA,SAAU,EAAA,2BAAA;AAAA,IACV,YAAY,EAAA,KAAA;AAAA,IACZ,MAAM,QAAW,mBAAAR,cAAA,CAACS,eAAU,EAAA,EAAA,CAAA,kCAAMC,aAAS,EAAA,EAAA,CAAA;AAAA,GAC7C,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,uBAAwB,CAAA;AAAA,EAC/B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AACF,CAKG,EAAA;AACD,EAAA,MAAM,SAASC,iBAAU,EAAA,CAAA;AAEzB,EAAA,uBACGX,cAAA,CAAAQ,aAAA,EAAA;AAAA,IACC,SAAS,WAAY;AACnB,MAAA,MAAA,CAAOI,cAAW,CAAA,CAAA,EAAA,CAAG,iBAAkB,CAAA,MAAA,EAAQ,SAAW,EAAA;AAAA,QACxD,SAAA;AAAA,QACA,MAAQ,EAAA,IAAA;AAAA,OACT,CAAA,CAAA;AAAA,KACH;AAAA,IACA,SAAU,EAAA,2BAAA;AAAA,IACV,YAAY,EAAA,KAAA;AAAA,IACZ,IAAA,iCAAOC,eAAU,EAAA,EAAA,CAAA;AAAA,GACnB,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,uBAAwB,CAAA;AAAA,EAC/B,OAAA;AAAA,EACA,MAAA;AACF,CAGG,EAAA;AAED,EAAA,MAAM,WACJ,GAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,SAAS,IAAK,CAAA,IAAA,KAAS,WAAW,CAAA,IAChD,QAAQ,KAAM,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,SAAS,WAAW,CAAA,CAAA;AAEnD,EAAA,uBACGb,cAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAU,EAAA,4BAAA;AAAA,IACZ,QAAQ,EAAA,OAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,KAAU,KAAA;AAC5B,MAAA,QAAQ,KAAK,IAAM;AAAA,QACjB,KAAK,MAAQ,EAAA;AACX,UAAA,uBACGA,cAAA,CAAA,QAAA,EAAA;AAAA,YAEC,MAAM,IAAK,CAAA,IAAA;AAAA,YACX,SAAU,EAAA,yBAAA;AAAA,WAAA,EAFL,KAGP,CAAA,CAAA;AAAA,SAEJ;AAAA,QACA,KAAK,WAAa,EAAA;AAChB,UAAA,uBACGA,cAAA,CAAA,YAAA,EAAA;AAAA,YAEC,MAAA;AAAA,YACA,MAAM,IAAK,CAAA,QAAA;AAAA,YACX,MAAM,IAAK,CAAA,IAAA;AAAA,WAAA,EAHN,KAIP,CAAA,CAAA;AAAA,SAEJ;AAAA,QACA,KAAK,WAAa,EAAA;AAChB,UAAA,uBACGA,cAAA,CAAA,aAAA,EAAA;AAAA,YAEC,MAAM,IAAK,CAAA,IAAA;AAAA,YACX,SAAW,EAAA,WAAA;AAAA,WAAA,EAFN,KAGP,CAAA,CAAA;AAAA,SAEJ;AAAA,QACA,SAAS;AACP,UAAO,OAAA,IAAA,CAAA;AAAA,SACT;AAAA,OACF;AAAA,KACD,CAAA;AAAA,GACH,CAAA,CAAA;AAEJ,CAAA;AASA,MAAM,QAAW,GAAAJ,gBAAA;AAAA,EACf,CAAC,EAAE,IAAS,EAAA,GAAA,KAAA,IAAS,YAAiB,KAAA;AACpC,IAAM,MAAA,MAAA,GAASkB,cAAQ,MAAM;AAC3B,MAAA,OAAO,IAAIC,YAAA,EAAQ,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,KAC7B,EAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AAET,IAAA,uBACGf,cAAA,CAAA,KAAA,EAAA;AAAA,MAAI,GAAK,EAAA,YAAA;AAAA,MAAe,GAAG,KAAA;AAAA,MACzB,QAAO,EAAA,MAAA,CAAA,GAAA,CAAI,CAAC,KAAA,EAAO,KAAU,KAAA;AAC5B,QAAA,uBACGA,cAAA,CAAA,sBAAA,EAAA;AAAA,UAAuB,KAAA;AAAA,SAAA,EAAiC,KAAO,CAAA,CAAA;AAAA,OAEnE,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA,CAAA;AAEA,MAAM,sBAAyB,GAAAL,UAAA;AAAA,EAC7B,SAAS,cAAA,CAAe,EAAE,KAAA,EAAgC,EAAA;AACxD,IAAA,uBAAQK,cAAA,CAAAgB,uBAAA,EAAA;AAAA,MAAwB,KAAA;AAAA,KAAc,CAAA,CAAA;AAAA,GAChD;AAAA,EACA,CAAC,WAAW,SAAc,KAAA;AACxB,IAAA,MAAM,YAAY,SAAU,CAAA,KAAA,CAAA;AAC5B,IAAA,MAAM,YAAY,SAAU,CAAA,KAAA,CAAA;AAC5B,IAAA,IAAI,SAAU,CAAA,GAAA,CAAI,MAAW,KAAA,SAAA,CAAU,IAAI,MAAQ,EAAA;AACjD,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAI,IAAA,SAAA,CAAU,IAAS,KAAA,SAAA,CAAU,IAAM,EAAA;AACrC,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAO,OAAA,SAAA,CAAU,QAAQ,SAAU,CAAA,GAAA,CAAA;AAAA,GACrC;AACF,CAAA,CAAA;AAKA,SAAS,YAAa,CAAA;AAAA,EACpB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AACF,CAIG,EAAA;AACD,EAAA,MAAM,SAASL,iBAAU,EAAA,CAAA;AAEzB,EAAA,MAAM,IAAO,GAAAM,kBAAA;AAAA,IACX,OAAOL,cAAW,CAAA,CAAA,EAAA,CAAG,OAAQ,CAAA,uBAAA,CAAmB,QAAQ,IAAI,CAAA;AAAA,GAC9D,CAAA;AACA,EAAI,IAAA,IAAA,KAAS,KAAa,CAAA,IAAA,IAAA,CAAK,MAAW,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AAE5D,EAAA,uBACGZ,cAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAU,EAAA,yBAAA;AAAA,IACb,QAAA,kBAAAA,cAAA,CAAC,KAAK,MAAL,EAAA;AAAA,MAAY,IAAA;AAAA,KAAuB,CAAA;AAAA,GACtC,CAAA,CAAA;AAEJ,CAAA;AAKA,SAAS,aAAc,CAAA;AAAA,EACrB,IAAA;AAAA,EACA,SAAA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIM,eAAS,KAAK,CAAA,CAAA;AAC1C,EACE,uBAAAP,eAAA,CAACmB,UAAA,EAAA;AAAA,IACC,SAAU,EAAA,6DAAA;AAAA,IACV,IAAM,EAAA,MAAA;AAAA,IACN,YAAc,EAAA,SAAA;AAAA,IAEd,QAAA,EAAA;AAAA,sBAAAnB,eAAA,CAACoB,aAAA,EAAA;AAAA,QACC,SAAW,EAAAd,qBAAA;AAAA,UACT,wCAAA;AAAA,UACA,SAAa,IAAA,oBAAA;AAAA,SACf;AAAA,QACD,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,0BAEEL,cAAA,CAAA,MAAA,EAAA;AAAA,YAAK,SAAU,EAAA,mBAAA;AAAA,YACb,QAAS,EAAA,MAAA,mBAAAA,cAAA,CAACoB,2BAAgB,EAAA,EAAA,CAAA,kCAAMC,6BAAiB,EAAA,EAAA,CAAA;AAAA,WACpD,CAAA;AAAA,SAAA;AAAA,OACF,CAAA;AAAA,sBAEArB,cAAA,CAACsB,aAAA,EAAA;AAAA,QAA6B,SAAU,EAAA,wCAAA;AAAA,QACrC,QAAA,EAAA,IAAA;AAAA,OACH,CAAA;AAAA,KAAA;AAAA,GACF,CAAA,CAAA;AAEJ;;;;"}
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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"}
@@ -1,67 +1,25 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { kInternal } from '@liveblocks/core';
3
- import { useClient } from '@liveblocks/react';
4
- import { useSignal } from '@liveblocks/react/_private';
5
- import { Lexer } from 'marked';
6
- import { memo, forwardRef, useState, useEffect, useMemo } from 'react';
7
- import { Button } from './Button.js';
8
- import { Tooltip } from './Tooltip.js';
9
- import { CheckIcon } from '../../icons/Check.js';
10
- import { ChevronDownIcon } from '../../icons/ChevronDown.js';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { memo, forwardRef, useState } from 'react';
3
+ import { ComponentsProvider } from '../../components.js';
11
4
  import { ChevronRightIcon } from '../../icons/ChevronRight.js';
12
- import { CopyIcon } from '../../icons/Copy.js';
13
- import { RetryIcon } from '../../icons/Retry.js';
14
5
  import { WarningIcon } from '../../icons/Warning.js';
15
6
  import { useOverrides } from '../../overrides.js';
16
- import { Root, Trigger, Content } from '../../primitives/internal/Collapsible/index.js';
17
- import { BlockTokenComp } from '../../primitives/internal/Markdown.js';
7
+ import { Content as AiMessageContent } from '../../primitives/AiMessage/index.js';
8
+ import { Root as CollapsibleRoot, Trigger as CollapsibleTrigger, Content as CollapsibleContent } from '../../primitives/Collapsible/index.js';
18
9
  import { classNames } from '../../utils/class-names.js';
19
- import { TooltipProvider } from '@radix-ui/react-tooltip';
10
+ import { Prose } from './Prose.js';
20
11
 
21
12
  const AiChatAssistantMessage = memo(
22
13
  forwardRef(
23
- ({
24
- message,
25
- showActions = false,
26
- showRegenerate = false,
27
- copilotId,
28
- className,
29
- overrides,
30
- ...props
31
- }, forwardedRef) => {
14
+ ({ message, className, overrides, components, ...props }, forwardedRef) => {
32
15
  const $ = useOverrides(overrides);
33
16
  let children = null;
34
- function MessageActions({ text }) {
35
- if (!showActions)
36
- return null;
37
- return /* @__PURE__ */ jsxs("div", {
38
- className: "lb-ai-chat-message-actions",
39
- children: [
40
- /* @__PURE__ */ jsx(Tooltip, {
41
- content: $.AI_CHAT_MESSAGE_COPY,
42
- children: /* @__PURE__ */ jsx(CopyTextButton, {
43
- text,
44
- label: $.AI_CHAT_MESSAGE_COPY
45
- })
46
- }),
47
- showRegenerate && /* @__PURE__ */ jsx(Tooltip, {
48
- content: $.AI_CHAT_MESSAGE_TRY_AGAIN,
49
- children: /* @__PURE__ */ jsx(RegenerateMessageButton, {
50
- chatId: message.chatId,
51
- messageId: message.id,
52
- copilotId,
53
- label: $.AI_CHAT_MESSAGE_TRY_AGAIN
54
- })
55
- })
56
- ]
57
- });
58
- }
59
17
  if (message.deletedAt !== void 0) {
60
18
  children = /* @__PURE__ */ jsx("div", {
61
19
  className: "lb-ai-chat-message-deleted",
62
20
  children: $.AI_CHAT_MESSAGE_DELETED
63
21
  });
64
- } else if (message.status === "pending") {
22
+ } else if (message.status === "generating" || message.status === "awaiting-tool") {
65
23
  if (message.contentSoFar.length === 0) {
66
24
  children = /* @__PURE__ */ jsx("div", {
67
25
  className: "lb-ai-chat-message-thinking lb-ai-chat-pending",
@@ -69,53 +27,23 @@ const AiChatAssistantMessage = memo(
69
27
  });
70
28
  } else {
71
29
  children = /* @__PURE__ */ jsx(AssistantMessageContent, {
72
- content: message.contentSoFar,
73
- chatId: message.chatId
30
+ message
74
31
  });
75
32
  }
76
33
  } else if (message.status === "completed") {
77
- const text = message.content.reduce((acc, part) => {
78
- if (part.type === "text") {
79
- return acc + part.text;
80
- }
81
- return acc;
82
- }, "");
83
- children = /* @__PURE__ */ jsxs(Fragment, {
84
- children: [
85
- /* @__PURE__ */ jsx(AssistantMessageContent, {
86
- content: message.content,
87
- chatId: message.chatId
88
- }),
89
- /* @__PURE__ */ jsx(MessageActions, {
90
- text
91
- })
92
- ]
34
+ children = /* @__PURE__ */ jsx(AssistantMessageContent, {
35
+ message
93
36
  });
94
37
  } else if (message.status === "failed") {
95
- const text = message.contentSoFar.reduce((acc, part) => {
96
- if (part.type === "text") {
97
- return acc + part.text;
98
- }
99
- return acc;
100
- }, "");
101
38
  if (message.errorReason === "Aborted by user") {
102
- children = /* @__PURE__ */ jsxs(Fragment, {
103
- children: [
104
- /* @__PURE__ */ jsx(AssistantMessageContent, {
105
- content: message.contentSoFar,
106
- chatId: message.chatId
107
- }),
108
- /* @__PURE__ */ jsx(MessageActions, {
109
- text
110
- })
111
- ]
39
+ children = /* @__PURE__ */ jsx(AssistantMessageContent, {
40
+ message
112
41
  });
113
42
  } else {
114
43
  children = /* @__PURE__ */ jsxs(Fragment, {
115
44
  children: [
116
45
  /* @__PURE__ */ jsx(AssistantMessageContent, {
117
- content: message.contentSoFar,
118
- chatId: message.chatId
46
+ message
119
47
  }),
120
48
  /* @__PURE__ */ jsxs("div", {
121
49
  className: "lb-ai-chat-message-error",
@@ -126,185 +54,81 @@ const AiChatAssistantMessage = memo(
126
54
  }),
127
55
  message.errorReason
128
56
  ]
129
- }),
130
- /* @__PURE__ */ jsx(MessageActions, {
131
- text
132
57
  })
133
58
  ]
134
59
  });
135
60
  }
136
61
  }
137
- return /* @__PURE__ */ jsx(TooltipProvider, {
138
- children: /* @__PURE__ */ jsx("div", {
139
- className: classNames(
140
- "lb-ai-chat-message lb-ai-chat-assistant-message",
141
- showActions === "hover" && "lb-ai-chat-message:show-actions-hover",
142
- className
143
- ),
144
- ...props,
145
- ref: forwardedRef,
62
+ return /* @__PURE__ */ jsx("div", {
63
+ className: classNames(
64
+ "lb-ai-chat-message lb-ai-chat-assistant-message",
65
+ className
66
+ ),
67
+ ...props,
68
+ ref: forwardedRef,
69
+ children: /* @__PURE__ */ jsx(ComponentsProvider, {
70
+ components,
146
71
  children
147
72
  })
148
73
  });
149
74
  }
150
75
  )
151
76
  );
152
- function CopyTextButton({ text, label }) {
153
- const [isCopied, setIsCopied] = useState(false);
154
- useEffect(() => {
155
- const timeoutId = setTimeout(() => {
156
- setIsCopied(false);
157
- }, 2e3);
158
- return () => {
159
- clearTimeout(timeoutId);
160
- };
161
- }, [isCopied]);
162
- return /* @__PURE__ */ jsx(Button, {
163
- onClick: function() {
164
- navigator.clipboard.writeText(text);
165
- setIsCopied(true);
77
+ function AssistantMessageContent({ message }) {
78
+ return /* @__PURE__ */ jsx(AiMessageContent, {
79
+ message,
80
+ components: {
81
+ TextPart,
82
+ ReasoningPart,
83
+ ToolInvocationPart
166
84
  },
167
- className: "lb-ai-chat-message-action",
168
- "aria-label": label,
169
- icon: isCopied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {})
85
+ className: "lb-ai-chat-message-content"
170
86
  });
171
87
  }
172
- function RegenerateMessageButton({
173
- chatId,
174
- messageId,
175
- copilotId,
176
- label
177
- }) {
178
- const client = useClient();
179
- return /* @__PURE__ */ jsx(Button, {
180
- onClick: function() {
181
- client[kInternal].ai.regenerateMessage(chatId, messageId, {
182
- copilotId,
183
- stream: true
184
- });
185
- },
186
- className: "lb-ai-chat-message-action",
187
- "aria-label": label,
188
- icon: /* @__PURE__ */ jsx(RetryIcon, {})
189
- });
190
- }
191
- function AssistantMessageContent({
192
- content,
193
- chatId
194
- }) {
195
- const isReasoning = content.some((part) => part.type === "reasoning") && content.every((part) => part.type === "reasoning");
196
- return /* @__PURE__ */ jsx("div", {
197
- className: "lb-ai-chat-message-content",
198
- children: content.map((part, index) => {
199
- switch (part.type) {
200
- case "text": {
201
- return /* @__PURE__ */ jsx(TextPart, {
202
- text: part.text,
203
- className: "lb-ai-chat-message-text"
204
- }, index);
205
- }
206
- case "tool-call": {
207
- return /* @__PURE__ */ jsx(ToolCallPart, {
208
- chatId,
209
- name: part.toolName,
210
- args: part.args
211
- }, index);
212
- }
213
- case "reasoning": {
214
- return /* @__PURE__ */ jsx(ReasoningPart, {
215
- text: part.text,
216
- isPending: isReasoning
217
- }, index);
218
- }
219
- default: {
220
- return null;
221
- }
222
- }
223
- })
224
- });
225
- }
226
- const TextPart = forwardRef(
227
- ({ text, ...props }, forwardedRef) => {
228
- const tokens = useMemo(() => {
229
- return new Lexer().lex(text);
230
- }, [text]);
231
- return /* @__PURE__ */ jsx("div", {
232
- ref: forwardedRef,
233
- ...props,
234
- children: tokens.map((token, index) => {
235
- return /* @__PURE__ */ jsx(MemoizedBlockTokenComp, {
236
- token
237
- }, index);
238
- })
239
- });
240
- }
241
- );
242
- const MemoizedBlockTokenComp = memo(
243
- function BlockTokenComp$1({ token }) {
244
- return /* @__PURE__ */ jsx(BlockTokenComp, {
245
- token
246
- });
247
- },
248
- (prevProps, nextProps) => {
249
- const prevToken = prevProps.token;
250
- const nextToken = nextProps.token;
251
- if (prevToken.raw.length !== nextToken.raw.length) {
252
- return false;
253
- }
254
- if (prevToken.type !== nextToken.type) {
255
- return false;
256
- }
257
- return prevToken.raw === nextToken.raw;
258
- }
259
- );
260
- function ToolCallPart({
261
- chatId,
262
- name,
263
- args
264
- }) {
265
- const client = useClient();
266
- const tool = useSignal(
267
- client[kInternal].ai.signals.getToolDefinition\u03A3(chatId, name)
268
- );
269
- if (tool === void 0 || tool.render === void 0)
270
- return null;
271
- return /* @__PURE__ */ jsx("div", {
272
- className: "lb-ai-chat-message-tool",
273
- children: /* @__PURE__ */ jsx(tool.render, {
274
- args
275
- })
88
+ function TextPart({ part }) {
89
+ return /* @__PURE__ */ jsx(Prose, {
90
+ content: part.text,
91
+ className: "lb-ai-chat-message-text"
276
92
  });
277
93
  }
278
94
  function ReasoningPart({
279
- text,
280
- isPending
95
+ part,
96
+ isStreaming
281
97
  }) {
282
98
  const [isOpen, setIsOpen] = useState(false);
283
- return /* @__PURE__ */ jsxs(Root, {
284
- className: "lb-ai-chat-message-collapsible lb-ai-chat-message-reasoning",
99
+ return /* @__PURE__ */ jsxs(CollapsibleRoot, {
100
+ className: "lb-collapsible lb-ai-chat-message-reasoning",
285
101
  open: isOpen,
286
102
  onOpenChange: setIsOpen,
287
103
  children: [
288
- /* @__PURE__ */ jsxs(Trigger, {
104
+ /* @__PURE__ */ jsxs(CollapsibleTrigger, {
289
105
  className: classNames(
290
- "lb-ai-chat-message-collapsible-trigger",
291
- isPending && "lb-ai-chat-pending"
106
+ "lb-collapsible-trigger",
107
+ isStreaming && "lb-ai-chat-pending"
292
108
  ),
293
109
  children: [
294
110
  "Reasoning",
295
111
  /* @__PURE__ */ jsx("span", {
296
- className: "lb-icon-container",
297
- children: isOpen ? /* @__PURE__ */ jsx(ChevronDownIcon, {}) : /* @__PURE__ */ jsx(ChevronRightIcon, {})
112
+ className: "lb-collapsible-chevron lb-icon-container",
113
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
298
114
  })
299
115
  ]
300
116
  }),
301
- /* @__PURE__ */ jsx(Content, {
302
- className: "lb-ai-chat-message-collapsible-content",
303
- children: text
117
+ /* @__PURE__ */ jsx(CollapsibleContent, {
118
+ className: "lb-collapsible-content",
119
+ children: /* @__PURE__ */ jsx(Prose, {
120
+ content: part.text
121
+ })
304
122
  })
305
123
  ]
306
124
  });
307
125
  }
126
+ function ToolInvocationPart({ children }) {
127
+ return /* @__PURE__ */ jsx("div", {
128
+ className: "lb-ai-chat-message-tool-invocation",
129
+ children
130
+ });
131
+ }
308
132
 
309
133
  export { AiChatAssistantMessage };
310
134
  //# sourceMappingURL=AiChatAssistantMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiChatAssistantMessage.js","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import {\n type AiAssistantContentPart,\n type CopilotId,\n kInternal,\n type MessageId,\n type UiAssistantMessage,\n} 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 useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { Button } from \"../../components/internal/Button\";\nimport { Tooltip, TooltipProvider } from \"../../components/internal/Tooltip\";\nimport { CheckIcon } from \"../../icons/Check\";\nimport { ChevronDownIcon } from \"../../icons/ChevronDown\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { CopyIcon } from \"../../icons/Copy\";\nimport { RetryIcon } from \"../../icons/Retry\";\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} 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 * Whether to show or hide message actions.\n * @internal\n */\n showActions?: boolean | \"hover\";\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n /**\n * @internal\n * Whether to show or hide the regenerate button.\n */\n showRegenerate?: boolean;\n /**\n * @internal\n * The id of the copilot to use to regenerate the message. Only used if `showRegenerate` is true.\n */\n copilotId?: CopilotId;\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n (\n {\n message,\n showActions = false,\n showRegenerate = false,\n copilotId,\n className,\n overrides,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n function MessageActions({ text }: { text: string }) {\n if (!showActions) return null;\n\n return (\n <div className=\"lb-ai-chat-message-actions\">\n <Tooltip content={$.AI_CHAT_MESSAGE_COPY}>\n <CopyTextButton text={text} label={$.AI_CHAT_MESSAGE_COPY} />\n </Tooltip>\n\n {showRegenerate && (\n <Tooltip content={$.AI_CHAT_MESSAGE_TRY_AGAIN}>\n <RegenerateMessageButton\n chatId={message.chatId}\n messageId={message.id}\n copilotId={copilotId}\n label={$.AI_CHAT_MESSAGE_TRY_AGAIN}\n />\n </Tooltip>\n )}\n </div>\n );\n }\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 (message.status === \"pending\") {\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 />\n );\n }\n } else if (message.status === \"completed\") {\n const text: string = message.content.reduce((acc, part) => {\n if (part.type === \"text\") {\n return acc + part.text;\n }\n return acc;\n }, \"\");\n\n children = (\n <>\n <AssistantMessageContent\n content={message.content}\n chatId={message.chatId}\n />\n\n <MessageActions text={text} />\n </>\n );\n } else if (message.status === \"failed\") {\n const text: string = message.contentSoFar.reduce((acc, part) => {\n if (part.type === \"text\") {\n return acc + part.text;\n }\n return acc;\n }, \"\");\n\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = (\n <>\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\n />\n <MessageActions text={text} />\n </>\n );\n } else {\n children = (\n <>\n <AssistantMessageContent\n content={message.contentSoFar}\n chatId={message.chatId}\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 <MessageActions text={text} />\n </>\n );\n }\n }\n\n return (\n <TooltipProvider>\n <div\n className={classNames(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n showActions === \"hover\" &&\n \"lb-ai-chat-message:show-actions-hover\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </div>\n </TooltipProvider>\n );\n }\n )\n);\n\nfunction CopyTextButton({ text, label }: { text: string; label: string }) {\n const [isCopied, setIsCopied] = useState(false);\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n return () => {\n clearTimeout(timeoutId);\n };\n }, [isCopied]);\n\n return (\n <Button\n onClick={function () {\n navigator.clipboard.writeText(text);\n setIsCopied(true);\n }}\n className=\"lb-ai-chat-message-action\"\n aria-label={label}\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n />\n );\n}\n\nfunction RegenerateMessageButton({\n chatId,\n messageId,\n copilotId,\n label,\n}: {\n chatId: string;\n messageId: MessageId;\n copilotId?: CopilotId;\n label: string;\n}) {\n const client = useClient();\n\n return (\n <Button\n onClick={function () {\n client[kInternal].ai.regenerateMessage(chatId, messageId, {\n copilotId,\n stream: true,\n });\n }}\n className=\"lb-ai-chat-message-action\"\n aria-label={label}\n icon={<RetryIcon />}\n />\n );\n}\n\nfunction AssistantMessageContent({\n content,\n chatId,\n}: {\n content: AiAssistantContentPart[];\n chatId: string;\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 className=\"lb-ai-chat-message-text\"\n />\n );\n }\n case \"tool-call\": {\n return (\n <ToolCallPart\n key={index}\n chatId={chatId}\n name={part.toolName}\n args={part.args}\n />\n );\n }\n case \"reasoning\": {\n return (\n <ReasoningPart\n key={index}\n text={part.text}\n isPending={isReasoning}\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}\n\nconst TextPart = forwardRef<HTMLDivElement, TextPartProps>(\n ({ text, ...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 token={token as BlockToken} key={index} />\n );\n })}\n </div>\n );\n }\n);\n\nconst MemoizedBlockTokenComp = memo(\n function BlockTokenComp({ token }: { token: BlockToken }) {\n return <BlockTokenCompPrimitive token={token} />;\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\n/* -------------------------------------------------------------------------------------------------\n * ToolCallPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolCallPart({\n chatId,\n name,\n args,\n}: {\n chatId: string;\n name: string;\n args: any;\n}) {\n const client = useClient();\n\n const tool = useSignal(\n client[kInternal].ai.signals.getToolDefinitionΣ(chatId, name)\n );\n if (tool === undefined || tool.render === undefined) return null;\n\n return (\n <div className=\"lb-ai-chat-message-tool\">\n <tool.render args={args as unknown} />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({\n text,\n isPending,\n}: {\n text: string;\n isPending: boolean;\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 Reasoning\n <span className=\"lb-icon-container\">\n {isOpen ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </span>\n </CollapsiblePrimitive.Trigger>\n\n <CollapsiblePrimitive.Content className=\"lb-ai-chat-message-collapsible-content\">\n {text}\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n"],"names":["BlockTokenComp","BlockTokenCompPrimitive","CollapsiblePrimitive.Root","CollapsiblePrimitive.Trigger","CollapsiblePrimitive.Content"],"mappings":"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"}
1
+ {"version":3,"file":"AiChatAssistantMessage.js","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":["AiMessage.Content","Collapsible.Root","Collapsible.Trigger","Collapsible.Content"],"mappings":";;;;;;;;;;;AA+CO,MAAM,sBAAyB,GAAA,IAAA;AAAA,EACpC,UAAA;AAAA,IACE,CAAC,EAAE,OAAS,EAAA,SAAA,EAAW,WAAW,UAAe,EAAA,GAAA,KAAA,IAAS,YAAiB,KAAA;AACzE,MAAM,MAAA,CAAA,GAAI,aAAa,SAAS,CAAA,CAAA;AAEhC,MAAA,IAAI,QAAsB,GAAA,IAAA,CAAA;AAE1B,MAAI,IAAA,OAAA,CAAQ,cAAc,KAAW,CAAA,EAAA;AACnC,QAAA,QAAA,mBACG,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACZ,QAAE,EAAA,CAAA,CAAA,uBAAA;AAAA,SACL,CAAA,CAAA;AAAA,iBAGF,OAAQ,CAAA,MAAA,KAAW,YACnB,IAAA,OAAA,CAAQ,WAAW,eACnB,EAAA;AACA,QAAI,IAAA,OAAA,CAAQ,YAAa,CAAA,MAAA,KAAW,CAAG,EAAA;AACrC,UAAA,QAAA,mBACG,GAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAU,EAAA,gDAAA;AAAA,YACZ,QAAE,EAAA,CAAA,CAAA,wBAAA;AAAA,WACL,CAAA,CAAA;AAAA,SAEG,MAAA;AACL,UAAA,QAAA,mBAAY,GAAA,CAAA,uBAAA,EAAA;AAAA,YAAwB,OAAA;AAAA,WAAkB,CAAA,CAAA;AAAA,SACxD;AAAA,OACF,MAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,WAAa,EAAA;AACzC,QAAA,QAAA,mBAAY,GAAA,CAAA,uBAAA,EAAA;AAAA,UAAwB,OAAA;AAAA,SAAkB,CAAA,CAAA;AAAA,OACxD,MAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,QAAU,EAAA;AAEtC,QAAI,IAAA,OAAA,CAAQ,gBAAgB,iBAAmB,EAAA;AAC7C,UAAA,QAAA,mBAAY,GAAA,CAAA,uBAAA,EAAA;AAAA,YAAwB,OAAA;AAAA,WAAkB,CAAA,CAAA;AAAA,SACjD,MAAA;AACL,UACE,QAAA,mBAAA,IAAA,CAAA,QAAA,EAAA;AAAA,YACE,QAAA,EAAA;AAAA,8BAAC,GAAA,CAAA,uBAAA,EAAA;AAAA,gBAAwB,OAAA;AAAA,eAAkB,CAAA;AAAA,8BAE1C,IAAA,CAAA,KAAA,EAAA;AAAA,gBAAI,SAAU,EAAA,0BAAA;AAAA,gBACb,QAAA,EAAA;AAAA,kCAAC,GAAA,CAAA,MAAA,EAAA;AAAA,oBAAK,SAAU,EAAA,mBAAA;AAAA,oBACd,8BAAC,WAAY,EAAA,EAAA,CAAA;AAAA,mBACf,CAAA;AAAA,kBACC,OAAQ,CAAA,WAAA;AAAA,iBAAA;AAAA,eACX,CAAA;AAAA,aAAA;AAAA,WACF,CAAA,CAAA;AAAA,SAEJ;AAAA,OACF;AAEA,MAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,QACC,SAAW,EAAA,UAAA;AAAA,UACT,iDAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QACJ,GAAK,EAAA,YAAA;AAAA,QAEL,QAAC,kBAAA,GAAA,CAAA,kBAAA,EAAA;AAAA,UAAmB,UAAA;AAAA,UACjB,QAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KAEJ;AAAA,GACF;AACF,EAAA;AAEA,SAAS,uBAAA,CAAwB,EAAE,OAAA,EAA4C,EAAA;AAC7E,EACE,uBAAA,GAAA,CAACA,gBAAA,EAAA;AAAA,IACC,OAAA;AAAA,IACA,UAAY,EAAA;AAAA,MACV,QAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,KACF;AAAA,IACA,SAAU,EAAA,4BAAA;AAAA,GACZ,CAAA,CAAA;AAEJ,CAAA;AAKA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAuC,EAAA;AACzD,EAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA;AAAA,IAAM,SAAS,IAAK,CAAA,IAAA;AAAA,IAAM,SAAU,EAAA,yBAAA;AAAA,GAA0B,CAAA,CAAA;AACxE,CAAA;AAKA,SAAS,aAAc,CAAA;AAAA,EACrB,IAAA;AAAA,EACA,WAAA;AACF,CAAuC,EAAA;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC1C,EACE,uBAAA,IAAA,CAACC,eAAA,EAAA;AAAA,IACC,SAAU,EAAA,6CAAA;AAAA,IACV,IAAM,EAAA,MAAA;AAAA,IACN,YAAc,EAAA,SAAA;AAAA,IAEd,QAAA,EAAA;AAAA,sBAAA,IAAA,CAACC,kBAAA,EAAA;AAAA,QACC,SAAW,EAAA,UAAA;AAAA,UACT,wBAAA;AAAA,UACA,WAAe,IAAA,oBAAA;AAAA,SACjB;AAAA,QAEuH,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,0BAEtH,GAAA,CAAA,MAAA,EAAA;AAAA,YAAK,SAAU,EAAA,0CAAA;AAAA,YACd,8BAAC,gBAAiB,EAAA,EAAA,CAAA;AAAA,WACpB,CAAA;AAAA,SAAA;AAAA,OACF,CAAA;AAAA,sBAEA,GAAA,CAACC,kBAAA,EAAA;AAAA,QAAoB,SAAU,EAAA,wBAAA;AAAA,QAC7B,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,UAAM,SAAS,IAAK,CAAA,IAAA;AAAA,SAAM,CAAA;AAAA,OAC7B,CAAA;AAAA,KAAA;AAAA,GACF,CAAA,CAAA;AAEJ,CAAA;AAKA,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAA+B,EAAA;AAC3D,EAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAU,EAAA,oCAAA;AAAA,IAAsC,QAAA;AAAA,GAAS,CAAA,CAAA;AACvE;;;;"}
@@ -26,6 +26,7 @@ const AiChatComposer = react.forwardRef(
26
26
  branchId,
27
27
  copilotId,
28
28
  stream = true,
29
+ onUserMessageCreate,
29
30
  ...props
30
31
  }, forwardedRef) => {
31
32
  const $ = overrides.useOverrides(overrides$1);
@@ -36,32 +37,43 @@ const AiChatComposer = react.forwardRef(
36
37
  return null;
37
38
  return lastMessage.id;
38
39
  }, []);
39
- const getPendingMessage = react.useCallback((messages) => {
40
+ const getAbortableMessageId = react.useCallback((messages) => {
40
41
  return messages.find(
41
- (m) => m.role === "assistant" && m.status === "pending"
42
+ (m) => m.role === "assistant" && (m.status === "generating" || m.status === "awaiting-tool")
42
43
  )?.id;
43
44
  }, []);
44
- const pendingMessage = _private.useSignal(
45
- client[core.kInternal].ai.signals.getChatMessagesForBranch\u03A3(chatId, branchId),
46
- getPendingMessage
47
- );
48
- const lastMessageId = _private.useSignal(
49
- client[core.kInternal].ai.signals.getChatMessagesForBranch\u03A3(chatId, branchId),
50
- getLastMessageId
45
+ const messages\u03A3 = client[core.kInternal].ai.signals.getChatMessagesForBranch\u03A3(
46
+ chatId,
47
+ branchId
51
48
  );
49
+ const abortableMessageId = _private.useSignal(messages\u03A3, getAbortableMessageId);
50
+ const lastMessageId = _private.useSignal(messages\u03A3, getLastMessageId);
52
51
  const handleComposerSubmit = react.useCallback(
53
52
  (message, event) => {
54
- if (pendingMessage !== void 0) {
53
+ if (abortableMessageId !== void 0) {
55
54
  event.preventDefault();
56
55
  return;
57
56
  }
58
57
  onComposerSubmit?.(message, event);
59
58
  if (event.isDefaultPrevented())
60
59
  return;
61
- client[core.kInternal].ai.addUserMessageAndAsk(
60
+ const content = [{ type: "text", text: message.text }];
61
+ const newMessageId = client[core.kInternal].ai[core.kInternal].context.messagesStore.createOptimistically(
62
62
  chatId,
63
+ "user",
63
64
  lastMessageId,
64
- message.text,
65
+ content
66
+ );
67
+ onUserMessageCreate?.({ id: newMessageId });
68
+ const targetMessageId = client[core.kInternal].ai[core.kInternal].context.messagesStore.createOptimistically(
69
+ chatId,
70
+ "assistant",
71
+ newMessageId
72
+ );
73
+ client[core.kInternal].ai.askUserMessageInChat(
74
+ chatId,
75
+ { id: newMessageId, parentMessageId: lastMessageId, content },
76
+ targetMessageId,
65
77
  {
66
78
  stream,
67
79
  copilotId
@@ -70,10 +82,11 @@ const AiChatComposer = react.forwardRef(
70
82
  },
71
83
  [
72
84
  onComposerSubmit,
85
+ onUserMessageCreate,
73
86
  client,
74
87
  chatId,
75
88
  lastMessageId,
76
- pendingMessage,
89
+ abortableMessageId,
77
90
  stream,
78
91
  copilotId
79
92
  ]
@@ -81,10 +94,9 @@ const AiChatComposer = react.forwardRef(
81
94
  return /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive.TooltipProvider, {
82
95
  children: /* @__PURE__ */ jsxRuntime.jsx(index.AiChatComposerForm, {
83
96
  className: classNames.classNames(
84
- "lb-ai-chat-composer lb-ai-chat-composer-form",
97
+ "lb-root lb-ai-chat-composer lb-ai-chat-composer-form",
85
98
  className
86
99
  ),
87
- chatId,
88
100
  dir: $.dir,
89
101
  ...props,
90
102
  disabled,
@@ -107,7 +119,7 @@ const AiChatComposer = react.forwardRef(
107
119
  }),
108
120
  /* @__PURE__ */ jsxRuntime.jsx("div", {
109
121
  className: "lb-ai-chat-composer-actions",
110
- children: pendingMessage === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(Tooltip.ShortcutTooltip, {
122
+ children: abortableMessageId === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(Tooltip.ShortcutTooltip, {
111
123
  content: $.AI_CHAT_COMPOSER_SEND,
112
124
  shortcut: "Enter",
113
125
  children: /* @__PURE__ */ jsxRuntime.jsx(index.AiChatComposerSubmit, {
@@ -127,7 +139,7 @@ const AiChatComposer = react.forwardRef(
127
139
  onPointerDown: (event) => event.preventDefault(),
128
140
  onClick: (event) => {
129
141
  event.stopPropagation();
130
- client[core.kInternal].ai.abort(pendingMessage);
142
+ client[core.kInternal].ai.abort(abortableMessageId);
131
143
  },
132
144
  className: "lb-ai-chat-composer-action",
133
145
  variant: "secondary",