@liveblocks/react-ui 3.9.1 → 3.9.2-tiptap1
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.
- package/dist/components/AiChat.cjs +133 -113
- package/dist/components/AiChat.cjs.map +1 -1
- package/dist/components/AiChat.js +133 -113
- package/dist/components/AiChat.js.map +1 -1
- package/dist/components/AiTool.cjs +120 -93
- package/dist/components/AiTool.cjs.map +1 -1
- package/dist/components/AiTool.js +120 -93
- package/dist/components/AiTool.js.map +1 -1
- package/dist/components/Comment.cjs +374 -374
- package/dist/components/Comment.cjs.map +1 -1
- package/dist/components/Comment.js +374 -374
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/Composer.cjs +208 -259
- package/dist/components/Composer.cjs.map +1 -1
- package/dist/components/Composer.js +208 -259
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/HistoryVersionSummary.cjs +28 -25
- package/dist/components/HistoryVersionSummary.cjs.map +1 -1
- package/dist/components/HistoryVersionSummary.js +28 -25
- package/dist/components/HistoryVersionSummary.js.map +1 -1
- package/dist/components/HistoryVersionSummaryList.cjs +9 -9
- package/dist/components/HistoryVersionSummaryList.cjs.map +1 -1
- package/dist/components/HistoryVersionSummaryList.js +9 -9
- package/dist/components/HistoryVersionSummaryList.js.map +1 -1
- package/dist/components/InboxNotification.cjs +264 -239
- package/dist/components/InboxNotification.cjs.map +1 -1
- package/dist/components/InboxNotification.js +264 -239
- package/dist/components/InboxNotification.js.map +1 -1
- package/dist/components/InboxNotificationList.cjs +19 -19
- package/dist/components/InboxNotificationList.cjs.map +1 -1
- package/dist/components/InboxNotificationList.js +19 -19
- package/dist/components/InboxNotificationList.js.map +1 -1
- package/dist/components/Thread.cjs +102 -82
- package/dist/components/Thread.cjs.map +1 -1
- package/dist/components/Thread.js +102 -82
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.cjs +164 -210
- package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.js +164 -210
- package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
- package/dist/components/internal/AiChatUserMessage.cjs +29 -26
- package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatUserMessage.js +29 -26
- package/dist/components/internal/AiChatUserMessage.js.map +1 -1
- package/dist/components/internal/AiComposer.cjs +37 -53
- package/dist/components/internal/AiComposer.cjs.map +1 -1
- package/dist/components/internal/AiComposer.js +37 -53
- package/dist/components/internal/AiComposer.js.map +1 -1
- package/dist/components/internal/Attachment.cjs +170 -181
- package/dist/components/internal/Attachment.cjs.map +1 -1
- package/dist/components/internal/Attachment.js +170 -181
- package/dist/components/internal/Attachment.js.map +1 -1
- package/dist/components/internal/Attribution.cjs +27 -18
- package/dist/components/internal/Attribution.cjs.map +1 -1
- package/dist/components/internal/Attribution.js +27 -18
- package/dist/components/internal/Attribution.js.map +1 -1
- package/dist/components/internal/Avatar.cjs +30 -32
- package/dist/components/internal/Avatar.cjs.map +1 -1
- package/dist/components/internal/Avatar.js +30 -32
- package/dist/components/internal/Avatar.js.map +1 -1
- package/dist/components/internal/Button.cjs +34 -47
- package/dist/components/internal/Button.cjs.map +1 -1
- package/dist/components/internal/Button.js +34 -47
- package/dist/components/internal/Button.js.map +1 -1
- package/dist/components/internal/CodeBlock.cjs +15 -34
- package/dist/components/internal/CodeBlock.cjs.map +1 -1
- package/dist/components/internal/CodeBlock.js +15 -34
- package/dist/components/internal/CodeBlock.js.map +1 -1
- package/dist/components/internal/Dropdown.cjs +37 -37
- package/dist/components/internal/Dropdown.cjs.map +1 -1
- package/dist/components/internal/Dropdown.js +37 -37
- package/dist/components/internal/Dropdown.js.map +1 -1
- package/dist/components/internal/Emoji.cjs +16 -13
- package/dist/components/internal/Emoji.cjs.map +1 -1
- package/dist/components/internal/Emoji.js +16 -13
- package/dist/components/internal/Emoji.js.map +1 -1
- package/dist/components/internal/EmojiPicker.cjs +61 -102
- package/dist/components/internal/EmojiPicker.cjs.map +1 -1
- package/dist/components/internal/EmojiPicker.js +61 -102
- package/dist/components/internal/EmojiPicker.js.map +1 -1
- package/dist/components/internal/Favicon.cjs +1 -10
- package/dist/components/internal/Favicon.cjs.map +1 -1
- package/dist/components/internal/Favicon.js +1 -10
- package/dist/components/internal/Favicon.js.map +1 -1
- package/dist/components/internal/Group.cjs +12 -9
- package/dist/components/internal/Group.cjs.map +1 -1
- package/dist/components/internal/Group.js +12 -9
- package/dist/components/internal/Group.js.map +1 -1
- package/dist/components/internal/GroupDescription.cjs +1 -5
- package/dist/components/internal/GroupDescription.cjs.map +1 -1
- package/dist/components/internal/GroupDescription.js +1 -5
- package/dist/components/internal/GroupDescription.js.map +1 -1
- package/dist/components/internal/Icon.cjs +18 -15
- package/dist/components/internal/Icon.cjs.map +1 -1
- package/dist/components/internal/Icon.js +18 -15
- package/dist/components/internal/Icon.js.map +1 -1
- package/dist/components/internal/InboxNotificationThread.cjs +38 -50
- package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
- package/dist/components/internal/InboxNotificationThread.js +38 -50
- package/dist/components/internal/InboxNotificationThread.js.map +1 -1
- package/dist/components/internal/List.cjs +9 -6
- package/dist/components/internal/List.cjs.map +1 -1
- package/dist/components/internal/List.js +9 -6
- package/dist/components/internal/List.js.map +1 -1
- package/dist/components/internal/Prose.cjs +7 -14
- package/dist/components/internal/Prose.cjs.map +1 -1
- package/dist/components/internal/Prose.js +7 -14
- package/dist/components/internal/Prose.js.map +1 -1
- package/dist/components/internal/Room.cjs +9 -6
- package/dist/components/internal/Room.cjs.map +1 -1
- package/dist/components/internal/Room.js +9 -6
- package/dist/components/internal/Room.js.map +1 -1
- package/dist/components/internal/Tooltip.cjs +43 -56
- package/dist/components/internal/Tooltip.cjs.map +1 -1
- package/dist/components/internal/Tooltip.js +43 -56
- package/dist/components/internal/Tooltip.js.map +1 -1
- package/dist/components/internal/User.cjs +12 -9
- package/dist/components/internal/User.cjs.map +1 -1
- package/dist/components/internal/User.js +12 -9
- package/dist/components/internal/User.js.map +1 -1
- package/dist/components.cjs +1 -4
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +1 -4
- package/dist/components.js.map +1 -1
- package/dist/config.cjs +1 -10
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +1 -10
- package/dist/config.js.map +1 -1
- package/dist/icons/ArrowCornerDownRight.cjs +1 -6
- package/dist/icons/ArrowCornerDownRight.cjs.map +1 -1
- package/dist/icons/ArrowCornerDownRight.js +1 -6
- package/dist/icons/ArrowCornerDownRight.js.map +1 -1
- package/dist/icons/ArrowCornerUpRight.cjs +1 -6
- package/dist/icons/ArrowCornerUpRight.cjs.map +1 -1
- package/dist/icons/ArrowCornerUpRight.js +1 -6
- package/dist/icons/ArrowCornerUpRight.js.map +1 -1
- package/dist/icons/ArrowDown.cjs +1 -6
- package/dist/icons/ArrowDown.cjs.map +1 -1
- package/dist/icons/ArrowDown.js +1 -6
- package/dist/icons/ArrowDown.js.map +1 -1
- package/dist/icons/ArrowUp.cjs +1 -6
- package/dist/icons/ArrowUp.cjs.map +1 -1
- package/dist/icons/ArrowUp.js +1 -6
- package/dist/icons/ArrowUp.js.map +1 -1
- package/dist/icons/Attachment.cjs +1 -6
- package/dist/icons/Attachment.cjs.map +1 -1
- package/dist/icons/Attachment.js +1 -6
- package/dist/icons/Attachment.js.map +1 -1
- package/dist/icons/Bell.cjs +1 -6
- package/dist/icons/Bell.cjs.map +1 -1
- package/dist/icons/Bell.js +1 -6
- package/dist/icons/Bell.js.map +1 -1
- package/dist/icons/BellCrossed.cjs +1 -6
- package/dist/icons/BellCrossed.cjs.map +1 -1
- package/dist/icons/BellCrossed.js +1 -6
- package/dist/icons/BellCrossed.js.map +1 -1
- package/dist/icons/Blockquote.cjs +1 -6
- package/dist/icons/Blockquote.cjs.map +1 -1
- package/dist/icons/Blockquote.js +1 -6
- package/dist/icons/Blockquote.js.map +1 -1
- package/dist/icons/Bold.cjs +1 -6
- package/dist/icons/Bold.cjs.map +1 -1
- package/dist/icons/Bold.js +1 -6
- package/dist/icons/Bold.js.map +1 -1
- package/dist/icons/Check.cjs +1 -6
- package/dist/icons/Check.cjs.map +1 -1
- package/dist/icons/Check.js +1 -6
- package/dist/icons/Check.js.map +1 -1
- package/dist/icons/CheckCircle.cjs +4 -13
- package/dist/icons/CheckCircle.cjs.map +1 -1
- package/dist/icons/CheckCircle.js +4 -13
- package/dist/icons/CheckCircle.js.map +1 -1
- package/dist/icons/CheckCircleFill.cjs +4 -15
- package/dist/icons/CheckCircleFill.cjs.map +1 -1
- package/dist/icons/CheckCircleFill.js +4 -15
- package/dist/icons/CheckCircleFill.js.map +1 -1
- package/dist/icons/ChevronDown.cjs +1 -6
- package/dist/icons/ChevronDown.cjs.map +1 -1
- package/dist/icons/ChevronDown.js +1 -6
- package/dist/icons/ChevronDown.js.map +1 -1
- package/dist/icons/ChevronLeft.cjs +1 -6
- package/dist/icons/ChevronLeft.cjs.map +1 -1
- package/dist/icons/ChevronLeft.js +1 -6
- package/dist/icons/ChevronLeft.js.map +1 -1
- package/dist/icons/ChevronRight.cjs +1 -6
- package/dist/icons/ChevronRight.cjs.map +1 -1
- package/dist/icons/ChevronRight.js +1 -6
- package/dist/icons/ChevronRight.js.map +1 -1
- package/dist/icons/ChevronUp.cjs +1 -6
- package/dist/icons/ChevronUp.cjs.map +1 -1
- package/dist/icons/ChevronUp.js +1 -6
- package/dist/icons/ChevronUp.js.map +1 -1
- package/dist/icons/Code.cjs +1 -6
- package/dist/icons/Code.cjs.map +1 -1
- package/dist/icons/Code.js +1 -6
- package/dist/icons/Code.js.map +1 -1
- package/dist/icons/Comment.cjs +1 -6
- package/dist/icons/Comment.cjs.map +1 -1
- package/dist/icons/Comment.js +1 -6
- package/dist/icons/Comment.js.map +1 -1
- package/dist/icons/Copy.cjs +4 -15
- package/dist/icons/Copy.cjs.map +1 -1
- package/dist/icons/Copy.js +4 -15
- package/dist/icons/Copy.js.map +1 -1
- package/dist/icons/Cross.cjs +4 -11
- package/dist/icons/Cross.cjs.map +1 -1
- package/dist/icons/Cross.js +4 -11
- package/dist/icons/Cross.js.map +1 -1
- package/dist/icons/CrossCircleFill.cjs +4 -15
- package/dist/icons/CrossCircleFill.cjs.map +1 -1
- package/dist/icons/CrossCircleFill.js +4 -15
- package/dist/icons/CrossCircleFill.js.map +1 -1
- package/dist/icons/Delete.cjs +1 -6
- package/dist/icons/Delete.cjs.map +1 -1
- package/dist/icons/Delete.js +1 -6
- package/dist/icons/Delete.js.map +1 -1
- package/dist/icons/Edit.cjs +1 -6
- package/dist/icons/Edit.cjs.map +1 -1
- package/dist/icons/Edit.js +1 -6
- package/dist/icons/Edit.js.map +1 -1
- package/dist/icons/Ellipsis.cjs +5 -21
- package/dist/icons/Ellipsis.cjs.map +1 -1
- package/dist/icons/Ellipsis.js +5 -21
- package/dist/icons/Ellipsis.js.map +1 -1
- package/dist/icons/Emoji.cjs +7 -24
- package/dist/icons/Emoji.cjs.map +1 -1
- package/dist/icons/Emoji.js +7 -24
- package/dist/icons/Emoji.js.map +1 -1
- package/dist/icons/EmojiPlus.cjs +8 -27
- package/dist/icons/EmojiPlus.cjs.map +1 -1
- package/dist/icons/EmojiPlus.js +8 -27
- package/dist/icons/EmojiPlus.js.map +1 -1
- package/dist/icons/Globe.cjs +4 -13
- package/dist/icons/Globe.cjs.map +1 -1
- package/dist/icons/Globe.js +4 -13
- package/dist/icons/Globe.js.map +1 -1
- package/dist/icons/H1.cjs +1 -6
- package/dist/icons/H1.cjs.map +1 -1
- package/dist/icons/H1.js +1 -6
- package/dist/icons/H1.js.map +1 -1
- package/dist/icons/H2.cjs +1 -6
- package/dist/icons/H2.cjs.map +1 -1
- package/dist/icons/H2.js +1 -6
- package/dist/icons/H2.js.map +1 -1
- package/dist/icons/H3.cjs +1 -6
- package/dist/icons/H3.cjs.map +1 -1
- package/dist/icons/H3.js +1 -6
- package/dist/icons/H3.js.map +1 -1
- package/dist/icons/Italic.cjs +1 -6
- package/dist/icons/Italic.cjs.map +1 -1
- package/dist/icons/Italic.js +1 -6
- package/dist/icons/Italic.js.map +1 -1
- package/dist/icons/Lengthen.cjs +1 -6
- package/dist/icons/Lengthen.cjs.map +1 -1
- package/dist/icons/Lengthen.js +1 -6
- package/dist/icons/Lengthen.js.map +1 -1
- package/dist/icons/ListOrdered.cjs +1 -6
- package/dist/icons/ListOrdered.cjs.map +1 -1
- package/dist/icons/ListOrdered.js +1 -6
- package/dist/icons/ListOrdered.js.map +1 -1
- package/dist/icons/ListUnordered.cjs +8 -29
- package/dist/icons/ListUnordered.cjs.map +1 -1
- package/dist/icons/ListUnordered.js +8 -29
- package/dist/icons/ListUnordered.js.map +1 -1
- package/dist/icons/Mention.cjs +4 -11
- package/dist/icons/Mention.cjs.map +1 -1
- package/dist/icons/Mention.js +4 -11
- package/dist/icons/Mention.js.map +1 -1
- package/dist/icons/MinusCircle.cjs +4 -13
- package/dist/icons/MinusCircle.cjs.map +1 -1
- package/dist/icons/MinusCircle.js +4 -13
- package/dist/icons/MinusCircle.js.map +1 -1
- package/dist/icons/QuestionMark.cjs +5 -16
- package/dist/icons/QuestionMark.cjs.map +1 -1
- package/dist/icons/QuestionMark.js +5 -16
- package/dist/icons/QuestionMark.js.map +1 -1
- package/dist/icons/Redo.cjs +4 -11
- package/dist/icons/Redo.cjs.map +1 -1
- package/dist/icons/Redo.js +4 -11
- package/dist/icons/Redo.js.map +1 -1
- package/dist/icons/Restore.cjs +4 -11
- package/dist/icons/Restore.cjs.map +1 -1
- package/dist/icons/Restore.js +4 -11
- package/dist/icons/Restore.js.map +1 -1
- package/dist/icons/Retry.cjs +4 -11
- package/dist/icons/Retry.cjs.map +1 -1
- package/dist/icons/Retry.js +4 -11
- package/dist/icons/Retry.js.map +1 -1
- package/dist/icons/Search.cjs +1 -6
- package/dist/icons/Search.cjs.map +1 -1
- package/dist/icons/Search.js +1 -6
- package/dist/icons/Search.js.map +1 -1
- package/dist/icons/Send.cjs +1 -6
- package/dist/icons/Send.cjs.map +1 -1
- package/dist/icons/Send.js +1 -6
- package/dist/icons/Send.js.map +1 -1
- package/dist/icons/Shorten.cjs +1 -6
- package/dist/icons/Shorten.cjs.map +1 -1
- package/dist/icons/Shorten.js +1 -6
- package/dist/icons/Shorten.js.map +1 -1
- package/dist/icons/Sparkles.cjs +1 -6
- package/dist/icons/Sparkles.cjs.map +1 -1
- package/dist/icons/Sparkles.js +1 -6
- package/dist/icons/Sparkles.js.map +1 -1
- package/dist/icons/SparklesText.cjs +4 -11
- package/dist/icons/SparklesText.cjs.map +1 -1
- package/dist/icons/SparklesText.js +4 -11
- package/dist/icons/SparklesText.js.map +1 -1
- package/dist/icons/Spinner.cjs +1 -7
- package/dist/icons/Spinner.cjs.map +1 -1
- package/dist/icons/Spinner.js +1 -7
- package/dist/icons/Spinner.js.map +1 -1
- package/dist/icons/Stop.cjs +1 -11
- package/dist/icons/Stop.cjs.map +1 -1
- package/dist/icons/Stop.js +1 -11
- package/dist/icons/Stop.js.map +1 -1
- package/dist/icons/Strikethrough.cjs +1 -6
- package/dist/icons/Strikethrough.cjs.map +1 -1
- package/dist/icons/Strikethrough.js +1 -6
- package/dist/icons/Strikethrough.js.map +1 -1
- package/dist/icons/Text.cjs +1 -6
- package/dist/icons/Text.cjs.map +1 -1
- package/dist/icons/Text.js +1 -6
- package/dist/icons/Text.js.map +1 -1
- package/dist/icons/Translate.cjs +4 -11
- package/dist/icons/Translate.cjs.map +1 -1
- package/dist/icons/Translate.js +4 -11
- package/dist/icons/Translate.js.map +1 -1
- package/dist/icons/Underline.cjs +1 -6
- package/dist/icons/Underline.cjs.map +1 -1
- package/dist/icons/Underline.js +1 -6
- package/dist/icons/Underline.js.map +1 -1
- package/dist/icons/Undo.cjs +4 -11
- package/dist/icons/Undo.cjs.map +1 -1
- package/dist/icons/Undo.js +4 -11
- package/dist/icons/Undo.js.map +1 -1
- package/dist/icons/User.cjs +1 -6
- package/dist/icons/User.cjs.map +1 -1
- package/dist/icons/User.js +1 -6
- package/dist/icons/User.js.map +1 -1
- package/dist/icons/Users.cjs +1 -6
- package/dist/icons/Users.cjs.map +1 -1
- package/dist/icons/Users.js +1 -6
- package/dist/icons/Users.js.map +1 -1
- package/dist/icons/Warning.cjs +4 -13
- package/dist/icons/Warning.cjs.map +1 -1
- package/dist/icons/Warning.js +4 -13
- package/dist/icons/Warning.js.map +1 -1
- package/dist/overrides.cjs +102 -150
- package/dist/overrides.cjs.map +1 -1
- package/dist/overrides.js +102 -150
- package/dist/overrides.js.map +1 -1
- package/dist/primitives/AiComposer/index.cjs +77 -65
- package/dist/primitives/AiComposer/index.cjs.map +1 -1
- package/dist/primitives/AiComposer/index.js +77 -65
- package/dist/primitives/AiComposer/index.js.map +1 -1
- package/dist/primitives/AiMessage/index.cjs +28 -49
- package/dist/primitives/AiMessage/index.cjs.map +1 -1
- package/dist/primitives/AiMessage/index.js +28 -49
- package/dist/primitives/AiMessage/index.js.map +1 -1
- package/dist/primitives/AiMessage/tool-invocation.cjs +5 -5
- package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -1
- package/dist/primitives/AiMessage/tool-invocation.js +5 -5
- package/dist/primitives/AiMessage/tool-invocation.js.map +1 -1
- package/dist/primitives/Collapsible/index.cjs +46 -34
- package/dist/primitives/Collapsible/index.cjs.map +1 -1
- package/dist/primitives/Collapsible/index.js +46 -34
- package/dist/primitives/Collapsible/index.js.map +1 -1
- package/dist/primitives/Comment/index.cjs +41 -64
- package/dist/primitives/Comment/index.cjs.map +1 -1
- package/dist/primitives/Comment/index.js +41 -64
- package/dist/primitives/Comment/index.js.map +1 -1
- package/dist/primitives/Composer/contexts.cjs.map +1 -1
- package/dist/primitives/Composer/contexts.js.map +1 -1
- package/dist/primitives/Composer/index.cjs +324 -312
- package/dist/primitives/Composer/index.cjs.map +1 -1
- package/dist/primitives/Composer/index.js +324 -312
- package/dist/primitives/Composer/index.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/mentions.cjs +1 -0
- package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/mentions.js +1 -0
- package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/paste.cjs +1 -0
- package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/paste.js +1 -0
- package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -1
- package/dist/primitives/Composer/utils.cjs +3 -0
- package/dist/primitives/Composer/utils.cjs.map +1 -1
- package/dist/primitives/Composer/utils.js +3 -0
- package/dist/primitives/Composer/utils.js.map +1 -1
- package/dist/primitives/Duration.cjs +11 -7
- package/dist/primitives/Duration.cjs.map +1 -1
- package/dist/primitives/Duration.js +11 -7
- package/dist/primitives/Duration.js.map +1 -1
- package/dist/primitives/FileSize.cjs +2 -5
- package/dist/primitives/FileSize.cjs.map +1 -1
- package/dist/primitives/FileSize.js +2 -5
- package/dist/primitives/FileSize.js.map +1 -1
- package/dist/primitives/Markdown.cjs +80 -188
- package/dist/primitives/Markdown.cjs.map +1 -1
- package/dist/primitives/Markdown.js +80 -188
- package/dist/primitives/Markdown.js.map +1 -1
- package/dist/primitives/Timestamp.cjs +12 -7
- package/dist/primitives/Timestamp.cjs.map +1 -1
- package/dist/primitives/Timestamp.js +12 -7
- package/dist/primitives/Timestamp.js.map +1 -1
- package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -1
- package/dist/primitives/slate/utils/get-dom-range.js.map +1 -1
- package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -1
- package/dist/primitives/slate/utils/get-match-range.js.map +1 -1
- package/dist/primitives/slate/utils/is-empty.cjs.map +1 -1
- package/dist/primitives/slate/utils/is-empty.js.map +1 -1
- package/dist/primitives/slate/utils/marks.cjs.map +1 -1
- package/dist/primitives/slate/utils/marks.js.map +1 -1
- package/dist/shared.cjs.map +1 -1
- package/dist/shared.js.map +1 -1
- package/dist/utils/ErrorBoundary.cjs +1 -6
- package/dist/utils/ErrorBoundary.cjs.map +1 -1
- package/dist/utils/ErrorBoundary.js +1 -6
- package/dist/utils/ErrorBoundary.js.map +1 -1
- package/dist/utils/Persist.cjs +1 -4
- package/dist/utils/Persist.cjs.map +1 -1
- package/dist/utils/Persist.js +1 -4
- package/dist/utils/Persist.js.map +1 -1
- package/dist/utils/Portal.cjs +1 -5
- package/dist/utils/Portal.cjs.map +1 -1
- package/dist/utils/Portal.js +1 -5
- package/dist/utils/Portal.js.map +1 -1
- package/dist/utils/format-file-size.cjs.map +1 -1
- package/dist/utils/format-file-size.js.map +1 -1
- package/dist/utils/is-key.cjs.map +1 -1
- package/dist/utils/is-key.js.map +1 -1
- package/dist/utils/pluralize.cjs.map +1 -1
- package/dist/utils/pluralize.js.map +1 -1
- package/dist/utils/use-controllable-state.cjs.map +1 -1
- package/dist/utils/use-controllable-state.js.map +1 -1
- package/dist/utils/use-rerender.cjs +3 -0
- package/dist/utils/use-rerender.cjs.map +1 -1
- package/dist/utils/use-rerender.js +3 -0
- package/dist/utils/use-rerender.js.map +1 -1
- package/dist/utils/use-visible.cjs.map +1 -1
- package/dist/utils/use-visible.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +4 -4
|
@@ -19,27 +19,20 @@ var MinusCircle = require('../icons/MinusCircle.cjs');
|
|
|
19
19
|
var Spinner = require('../icons/Spinner.cjs');
|
|
20
20
|
|
|
21
21
|
function AiToolIcon({ className, ...props }) {
|
|
22
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
23
|
-
className: cn.cn("lb-ai-tool-icon", className),
|
|
24
|
-
...props
|
|
25
|
-
});
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn.cn("lb-ai-tool-icon", className), ...props });
|
|
26
23
|
}
|
|
27
24
|
function AiToolInspector({ className, ...props }) {
|
|
28
25
|
const { args, partialArgs, result } = contexts.useAiToolInvocationContext();
|
|
29
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
/* @__PURE__ */ jsxRuntime.jsx(CodeBlock.CodeBlock, {
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn.cn("lb-ai-tool-inspector", className), ...props, children: [
|
|
27
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
28
|
+
CodeBlock.CodeBlock,
|
|
29
|
+
{
|
|
34
30
|
title: "Arguments",
|
|
35
31
|
code: JSON.stringify(args ?? partialArgs, null, 2)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}) : null
|
|
41
|
-
]
|
|
42
|
-
});
|
|
32
|
+
}
|
|
33
|
+
),
|
|
34
|
+
result !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(CodeBlock.CodeBlock, { title: "Result", code: JSON.stringify(result, null, 2) }) : null
|
|
35
|
+
] });
|
|
43
36
|
}
|
|
44
37
|
function AiToolConfirmation({
|
|
45
38
|
children,
|
|
@@ -73,36 +66,29 @@ function AiToolConfirmation({
|
|
|
73
66
|
if (stage === "executed" && !children) {
|
|
74
67
|
return null;
|
|
75
68
|
}
|
|
76
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
children: $.AI_TOOL_CONFIRMATION_CONFIRM
|
|
100
|
-
})
|
|
101
|
-
]
|
|
102
|
-
})
|
|
103
|
-
})
|
|
104
|
-
]
|
|
105
|
-
});
|
|
69
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn.cn("lb-ai-tool-confirmation", className), ...props, children: [
|
|
70
|
+
children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lb-ai-tool-confirmation-content", children }) : null,
|
|
71
|
+
stage !== "executed" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lb-ai-tool-confirmation-footer", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lb-ai-tool-confirmation-actions", children: [
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
Button.Button,
|
|
74
|
+
{
|
|
75
|
+
disabled: !enabled,
|
|
76
|
+
onClick: onCancelClick,
|
|
77
|
+
variant: "secondary",
|
|
78
|
+
children: $.AI_TOOL_CONFIRMATION_CANCEL
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
82
|
+
Button.Button,
|
|
83
|
+
{
|
|
84
|
+
disabled: !enabled,
|
|
85
|
+
onClick: onConfirmClick,
|
|
86
|
+
variant: variant === "destructive" ? "destructive" : "primary",
|
|
87
|
+
children: $.AI_TOOL_CONFIRMATION_CONFIRM
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
] }) })
|
|
91
|
+
] });
|
|
106
92
|
}
|
|
107
93
|
function prettifyString(string) {
|
|
108
94
|
return string.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim().toLowerCase().replace(/^\w/, (character) => character.toUpperCase());
|
|
@@ -126,7 +112,8 @@ const AiTool = Object.assign(
|
|
|
126
112
|
name,
|
|
127
113
|
[core.kInternal]: { execute, messageStatus }
|
|
128
114
|
} = contexts.useAiToolInvocationContext();
|
|
129
|
-
const isVisuallyPending = execute !== void 0 && stage !== "executed" &&
|
|
115
|
+
const isVisuallyPending = execute !== void 0 && stage !== "executed" && // If it's in the "receiving" stage, we also check that the outer message is still generating.
|
|
116
|
+
(stage === "receiving" ? messageStatus === "generating" : true);
|
|
130
117
|
const [semiControlledCollapsed, onSemiControlledCollapsed] = useControllableState.useSemiControllableState(collapsed ?? false, onCollapsedChange);
|
|
131
118
|
const hasContent = react.Children.count(children) > 0;
|
|
132
119
|
const isCollapsible = hasContent ? collapsible ?? true : false;
|
|
@@ -139,58 +126,98 @@ const AiTool = Object.assign(
|
|
|
139
126
|
},
|
|
140
127
|
[onSemiControlledCollapsed]
|
|
141
128
|
);
|
|
142
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
129
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
130
|
+
index.Root,
|
|
131
|
+
{
|
|
132
|
+
ref: forwardedRef,
|
|
133
|
+
className: cn.cn(
|
|
134
|
+
"lb-collapsible lb-ai-tool",
|
|
135
|
+
`lb-ai-tool:variant-${variant}`,
|
|
136
|
+
className
|
|
137
|
+
),
|
|
138
|
+
...props,
|
|
139
|
+
open: hasContent ? !semiControlledCollapsed : false,
|
|
140
|
+
onOpenChange: handleCollapsibleOpenChange,
|
|
141
|
+
disabled: !isCollapsible,
|
|
142
|
+
"data-result": result?.type,
|
|
143
|
+
"data-stage": stage,
|
|
144
|
+
children: [
|
|
145
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
146
|
+
index.Trigger,
|
|
147
|
+
{
|
|
148
|
+
className: cn.cn(
|
|
149
|
+
"lb-collapsible-trigger lb-ai-tool-header",
|
|
150
|
+
variant === "minimal" && isVisuallyPending && "lb-ai-chat-pending"
|
|
151
|
+
),
|
|
152
|
+
children: [
|
|
153
|
+
icon ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lb-ai-tool-header-icon-container", children: icon }) : null,
|
|
154
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-ai-tool-header-title", children: resolvedTitle }),
|
|
155
|
+
isCollapsible ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-collapsible-chevron lb-icon-container", children: /* @__PURE__ */ jsxRuntime.jsx(ChevronRight.ChevronRightIcon, {}) }) : null,
|
|
156
|
+
variant !== "minimal" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lb-ai-tool-header-status", children: stage === "executed" ? result.type === "success" ? /* @__PURE__ */ jsxRuntime.jsx(CheckCircleFill.CheckCircleFillIcon, {}) : result.type === "error" ? /* @__PURE__ */ jsxRuntime.jsx(CrossCircleFill.CrossCircleFillIcon, {}) : result.type === "cancelled" ? /* @__PURE__ */ jsxRuntime.jsx(MinusCircle.MinusCircleIcon, {}) : null : isVisuallyPending ? /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {}) : null }) : null
|
|
157
|
+
]
|
|
158
|
+
}
|
|
160
159
|
),
|
|
161
|
-
children:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}) : null,
|
|
166
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
167
|
-
className: "lb-ai-tool-header-title",
|
|
168
|
-
children: resolvedTitle
|
|
169
|
-
}),
|
|
170
|
-
isCollapsible ? /* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
171
|
-
className: "lb-collapsible-chevron lb-icon-container",
|
|
172
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(ChevronRight.ChevronRightIcon, {})
|
|
173
|
-
}) : null,
|
|
174
|
-
variant !== "minimal" ? /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
175
|
-
className: "lb-ai-tool-header-status",
|
|
176
|
-
children: stage === "executed" ? result.type === "success" ? /* @__PURE__ */ jsxRuntime.jsx(CheckCircleFill.CheckCircleFillIcon, {}) : result.type === "error" ? /* @__PURE__ */ jsxRuntime.jsx(CrossCircleFill.CrossCircleFillIcon, {}) : result.type === "cancelled" ? /* @__PURE__ */ jsxRuntime.jsx(MinusCircle.MinusCircleIcon, {}) : null : isVisuallyPending ? /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {}) : null
|
|
177
|
-
}) : null
|
|
178
|
-
]
|
|
179
|
-
}),
|
|
180
|
-
hasContent ? /* @__PURE__ */ jsxRuntime.jsx(index.Content, {
|
|
181
|
-
className: "lb-collapsible-content lb-ai-tool-content-container",
|
|
182
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
183
|
-
className: "lb-ai-tool-content",
|
|
184
|
-
children
|
|
185
|
-
})
|
|
186
|
-
}) : null
|
|
187
|
-
]
|
|
188
|
-
});
|
|
160
|
+
hasContent ? /* @__PURE__ */ jsxRuntime.jsx(index.Content, { className: "lb-collapsible-content lb-ai-tool-content-container", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lb-ai-tool-content", children }) }) : null
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
);
|
|
189
164
|
}
|
|
190
165
|
),
|
|
191
166
|
{
|
|
167
|
+
/**
|
|
168
|
+
* Display an icon in a container.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* <AiTool
|
|
172
|
+
* icon={
|
|
173
|
+
* <AiTool.Icon>🔍</AiTool.Icon>
|
|
174
|
+
* }
|
|
175
|
+
* />
|
|
176
|
+
*/
|
|
192
177
|
Icon: AiToolIcon,
|
|
178
|
+
/**
|
|
179
|
+
* Display the tool's arguments and result, which can be useful during
|
|
180
|
+
* development.
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* <AiTool>
|
|
184
|
+
* <AiTool.Inspector />
|
|
185
|
+
* </AiTool>
|
|
186
|
+
*/
|
|
193
187
|
Inspector: AiToolInspector,
|
|
188
|
+
/**
|
|
189
|
+
* Display a human-in-the-loop confirmation step which can be accepted
|
|
190
|
+
* or cancelled by the user.
|
|
191
|
+
*
|
|
192
|
+
* The `confirm` and `cancel` callbacks work like `execute` in tool definitions: they can
|
|
193
|
+
* perform side-effects, be async if needed, and return a result. The tool call will stay
|
|
194
|
+
* pending until either `confirm` or `cancel` is called.
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* <AiTool>
|
|
198
|
+
* <AiTool.Confirmation
|
|
199
|
+
* // Use a destructive visual appearance
|
|
200
|
+
* variant="destructive"
|
|
201
|
+
*
|
|
202
|
+
* // The tool's arguments can be directly accessed like in `execute`
|
|
203
|
+
* confirm={({ pageIds }) => {
|
|
204
|
+
* const deletedPageTitles = pages
|
|
205
|
+
* .filter((p) => pageIds.includes(p.id))
|
|
206
|
+
* .map((page) => page.title);
|
|
207
|
+
*
|
|
208
|
+
* deletePages(pageIds);
|
|
209
|
+
*
|
|
210
|
+
* // This result will be available as `result` in the tool's `render` props
|
|
211
|
+
* return { data: { deletedPageTitles } };
|
|
212
|
+
* }}
|
|
213
|
+
*
|
|
214
|
+
* // If needed, `cancel={() => ...}` would work similarly
|
|
215
|
+
* >
|
|
216
|
+
* Do you want to delete these pages?
|
|
217
|
+
* <PagesPreviews />
|
|
218
|
+
* </AiTool.Confirmation>
|
|
219
|
+
* </AiTool>
|
|
220
|
+
*/
|
|
194
221
|
Confirmation: AiToolConfirmation
|
|
195
222
|
}
|
|
196
223
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiTool.cjs","sources":["../../src/components/AiTool.tsx"],"sourcesContent":["import type {\n AiToolExecuteCallback,\n AiToolTypePack,\n JsonObject,\n NoInfr,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { Children, forwardRef, useCallback, useMemo } from \"react\";\n\nimport { Button } from \"../_private\";\nimport {\n CheckCircleFillIcon,\n ChevronRightIcon,\n CrossCircleFillIcon,\n MinusCircleIcon,\n SpinnerIcon,\n} from \"../icons\";\nimport {\n type AiToolConfirmationOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../overrides\";\nimport { useAiToolInvocationContext } from \"../primitives/AiMessage/contexts\";\nimport * as Collapsible from \"../primitives/Collapsible\";\nimport { cn } from \"../utils/cn\";\nimport { useSemiControllableState } from \"../utils/use-controllable-state\";\nimport { CodeBlock } from \"./internal/CodeBlock\";\n\nexport interface AiToolProps\n extends Omit<ComponentProps<\"div\">, \"title\" | \"children\"> {\n /**\n * The tool's title.\n *\n * By default, a human-readable version of the tool's name is used:\n * - `\"showTodo\"` → \"Show todo\"\n * - `\"get_weather\"` → \"Get weather\"\n */\n title?: ReactNode;\n\n /**\n * An optional icon displayed next to the title.\n */\n icon?: ReactNode;\n\n /**\n * The content shown in the tool.\n */\n children?: ReactNode;\n\n /**\n * The visual appearance of the tool.\n */\n variant?: \"block\" | \"minimal\";\n\n /**\n * Whether the content is currently collapsed.\n * It is not a traditional controlled value, as in if you set it to `true` it would only stay expanded.\n * Instead, it is \"semi-controlled\", meaning that setting it to `true` will expand it, but it\n * can still be collapsed/expanded by clicking on it.\n */\n collapsed?: boolean;\n\n /**\n * The event handler called when the content is collapsed or expanded by clicking on it.\n */\n onCollapsedChange?: (collapsed: boolean) => void;\n\n /**\n * Whether the content can be collapsed/expanded.\n * If set to `false`, clicking on it will have no effect.\n * If there's no content, this prop has no effect.\n */\n collapsible?: boolean;\n}\n\nexport type AiToolIconProps = ComponentProps<\"div\">;\n\nexport type AiToolInspectorProps = ComponentProps<\"div\">;\n\nexport interface AiToolConfirmationProps<\n A extends JsonObject,\n R extends JsonObject,\n> extends ComponentProps<\"div\"> {\n /**\n * The callback invoked when the user clicks the confirm button.\n */\n confirm: AiToolExecuteCallback<A, R>;\n\n /**\n * The callback invoked when the user clicks the cancel button.\n */\n cancel?: AiToolExecuteCallback<A, R>;\n\n /**\n * The visual appearance.\n */\n variant?: \"default\" | \"destructive\";\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiToolConfirmationOverrides>;\n\n /**\n * The tool's result type, to be used with the `types` prop in the `render` method.\n *\n * @example\n * defineAiTool<{ value: number }>()({\n * // ...\n * render: ({ types }) => (\n * <AiTool.Confirmation\n * types={types}\n * confirm={() => {\n * return {\n * // Using `types` makes the result type-safe\n * // based on the tool's definition\n * data: { value: 123 },\n * };\n * }}\n * />\n * ),\n * })\n */\n types?: NoInfr<AiToolTypePack<A, R>>;\n}\n\nfunction AiToolIcon({ className, ...props }: AiToolIconProps) {\n return <div className={cn(\"lb-ai-tool-icon\", className)} {...props} />;\n}\n\nfunction AiToolInspector({ className, ...props }: AiToolInspectorProps) {\n const { args, partialArgs, result } = useAiToolInvocationContext();\n\n return (\n <div className={cn(\"lb-ai-tool-inspector\", className)} {...props}>\n <CodeBlock\n title=\"Arguments\"\n code={JSON.stringify(args ?? partialArgs, null, 2)}\n />\n {result !== undefined ? (\n <CodeBlock title=\"Result\" code={JSON.stringify(result, null, 2)} />\n ) : null}\n </div>\n );\n}\n\nfunction AiToolConfirmation<\n TPack extends AiToolTypePack,\n A extends JsonObject = TPack[\"A\"],\n R extends JsonObject = TPack[\"R\"],\n>({\n children,\n variant = \"default\",\n confirm,\n cancel,\n overrides,\n className,\n ...props\n}: AiToolConfirmationProps<A, R>) {\n const { stage, args, respond, name, invocationId } =\n useAiToolInvocationContext();\n const $ = useOverrides(overrides);\n\n const enabled = stage === \"executing\";\n\n const context = useMemo(() => ({ name, invocationId }), [name, invocationId]);\n\n const onConfirmClick = useCallback(async () => {\n if (enabled) {\n const result = await confirm(args as A, context);\n respond(result ?? undefined);\n }\n }, [enabled, args, confirm, respond, context]);\n\n const onCancelClick = useCallback(async () => {\n if (enabled) {\n if (cancel === undefined) {\n respond({ cancel: true });\n } else {\n const result = await cancel(args as A, context);\n respond(result ?? undefined);\n }\n }\n }, [enabled, args, cancel, respond, context]);\n\n // If there's no content and the tool has been executed (so there's no\n // confirmation UI displayed either), don't render anything.\n if (stage === \"executed\" && !children) {\n return null;\n }\n\n return (\n <div className={cn(\"lb-ai-tool-confirmation\", className)} {...props}>\n {children ? (\n <div className=\"lb-ai-tool-confirmation-content\">{children}</div>\n ) : null}\n {stage !== \"executed\" && (\n <div className=\"lb-ai-tool-confirmation-footer\">\n <div className=\"lb-ai-tool-confirmation-actions\">\n <Button\n disabled={!enabled}\n onClick={onCancelClick}\n variant=\"secondary\"\n >\n {$.AI_TOOL_CONFIRMATION_CANCEL}\n </Button>\n <Button\n disabled={!enabled}\n onClick={onConfirmClick}\n variant={variant === \"destructive\" ? \"destructive\" : \"primary\"}\n >\n {$.AI_TOOL_CONFIRMATION_CONFIRM}\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction prettifyString(string: string) {\n return (\n string\n // Convert camelCase to spaces\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n // Convert snake_case and kebab-case to spaces\n .replace(/[_-]+/g, \" \")\n // Collapse multiple following spaces\n .replace(/\\s+/g, \" \")\n // Trim leading and trailing spaces\n .trim()\n // Capitalize first word\n .toLowerCase()\n .replace(/^\\w/, (character) => character.toUpperCase())\n );\n}\n\n/**\n * A pre-built component which displays a tool call.\n *\n * By default, a human-readable version of the tool's name is used as a title:\n * - `\"showTodo\"` → \"Show todo\"\n * - `\"get_weather\"` → \"Get weather\"\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: () => (\n * <AiTool />\n * ),\n * })\n *\n * It can be customized in various ways:\n * - adding an icon\n * - customizing the title (even dynamically)\n * - adding custom content inside it\n * - collapsing it conditionally\n * - etc.\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: ({ stage, result }) => (\n * <AiTool\n * icon=\"🔍\"\n *\n * // Override the default title based on the tool's stage\n * title={stage === \"executing\" ? \"Searching…\" : \"Search results\"}\n *\n * // Start open and automatically collapse after it is executed\n * // The user can still expand/collapse it manually at any time\n * collapsed={stage === \"executed\"}\n * >\n * <SearchResults data={result.data} />\n * </AiTool>\n * ),\n * })\n *\n * It also comes with a few built-in sub-components:\n * - `AiTool.Confirmation` to display a human-in-the-loop confirmation step\n * which can be accepted or cancelled by the user.\n * - `AiTool.Inspector` to display the tool's arguments and result which can\n * be useful during development.\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: () => (\n * <AiTool>\n * <AiTool.Confirmation\n * // Use a destructive visual appearance\n * variant=\"destructive\"\n *\n * // The tool's arguments can be directly accessed like in `execute`\n * confirm={({ pageIds }) => {\n * const deletedPageTitles = pages\n * .filter((p) => pageIds.includes(p.id))\n * .map((page) => page.title);\n *\n * deletePages(pageIds);\n *\n * // This result will be available as `result` in the tool's `render` props\n * return { data: { deletedPageTitles } };\n * }}\n *\n * // If needed, `cancel={() => ...}` would work similarly\n * >\n * Do you want to delete these pages?\n * <PagesPreviews />\n * </AiTool.Confirmation>\n * </AiTool>\n * ),\n * })\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: () => (\n * <AiTool>\n * <AiTool.Inspector />\n * </AiTool>\n * ),\n * })\n */\nexport const AiTool = Object.assign(\n forwardRef<HTMLDivElement, AiToolProps>(\n (\n {\n children,\n title,\n icon,\n collapsible,\n collapsed,\n onCollapsedChange,\n variant = \"block\",\n className,\n ...props\n },\n forwardedRef\n ) => {\n const {\n stage,\n result,\n name,\n [kInternal]: { execute, messageStatus },\n } = useAiToolInvocationContext();\n // Only mark the tool as pending visually (e.g. show a spinner, add a shimmer animation, etc.)\n // if it has an `execute` method and it isn't in the \"executed\" stage.\n const isVisuallyPending =\n execute !== undefined &&\n stage !== \"executed\" &&\n // If it's in the \"receiving\" stage, we also check that the outer message is still generating.\n (stage === \"receiving\" ? messageStatus === \"generating\" : true);\n const [semiControlledCollapsed, onSemiControlledCollapsed] =\n useSemiControllableState(collapsed ?? false, onCollapsedChange);\n // TODO: This check won't work for cases like:\n // <AiTool>\n // <ComponentThatRendersNull />\n // <ComponentThatAlsoRendersNull />\n // </AiTool>\n // One solution could be to check the DOM on every render with `useLayoutEffect`\n // to see if there's any actual content.\n // For now we're limiting the visual issues caused by the above by using CSS's\n // `:empty` pseudo-class to make the content 0px high if it's actually empty.\n const hasContent = Children.count(children) > 0;\n // If there's no content, the tool is never collapsible.\n const isCollapsible = hasContent ? (collapsible ?? true) : false;\n const resolvedTitle = useMemo(() => {\n return title ?? prettifyString(name);\n }, [title, name]);\n\n // `AiTool` uses \"collapsed\" instead of \"open\" (like the `Composer` component) because \"open\"\n // makes sense next to something called \"Collapsible\" but less so for something called \"AiTool\".\n const handleCollapsibleOpenChange = useCallback(\n (open: boolean) => {\n onSemiControlledCollapsed(!open);\n },\n [onSemiControlledCollapsed]\n );\n\n return (\n <Collapsible.Root\n ref={forwardedRef}\n className={cn(\n \"lb-collapsible lb-ai-tool\",\n `lb-ai-tool:variant-${variant}`,\n className\n )}\n {...props}\n // Regardless of `semiControlledCollapsed`, the collapsible is closed if there's no content.\n open={hasContent ? !semiControlledCollapsed : false}\n onOpenChange={handleCollapsibleOpenChange}\n disabled={!isCollapsible}\n data-result={result?.type}\n data-stage={stage}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger lb-ai-tool-header\",\n variant === \"minimal\" && isVisuallyPending && \"lb-ai-chat-pending\"\n )}\n >\n {icon ? (\n <div className=\"lb-ai-tool-header-icon-container\">{icon}</div>\n ) : null}\n <span className=\"lb-ai-tool-header-title\">{resolvedTitle}</span>\n {isCollapsible ? (\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n ) : null}\n {variant !== \"minimal\" ? (\n <div className=\"lb-ai-tool-header-status\">\n {stage === \"executed\" ? (\n result.type === \"success\" ? (\n <CheckCircleFillIcon />\n ) : result.type === \"error\" ? (\n <CrossCircleFillIcon />\n ) : result.type === \"cancelled\" ? (\n <MinusCircleIcon />\n ) : null\n ) : isVisuallyPending ? (\n <SpinnerIcon />\n ) : null}\n </div>\n ) : null}\n </Collapsible.Trigger>\n\n {hasContent ? (\n <Collapsible.Content className=\"lb-collapsible-content lb-ai-tool-content-container\">\n <div className=\"lb-ai-tool-content\">{children}</div>\n </Collapsible.Content>\n ) : null}\n </Collapsible.Root>\n );\n }\n ),\n {\n /**\n * Display an icon in a container.\n *\n * @example\n * <AiTool\n * icon={\n * <AiTool.Icon>🔍</AiTool.Icon>\n * }\n * />\n */\n Icon: AiToolIcon,\n\n /**\n * Display the tool's arguments and result, which can be useful during\n * development.\n *\n * @example\n * <AiTool>\n * <AiTool.Inspector />\n * </AiTool>\n */\n Inspector: AiToolInspector,\n\n /**\n * Display a human-in-the-loop confirmation step which can be accepted\n * or cancelled by the user.\n *\n * The `confirm` and `cancel` callbacks work like `execute` in tool definitions: they can\n * perform side-effects, be async if needed, and return a result. The tool call will stay\n * pending until either `confirm` or `cancel` is called.\n *\n * @example\n * <AiTool>\n * <AiTool.Confirmation\n * // Use a destructive visual appearance\n * variant=\"destructive\"\n *\n * // The tool's arguments can be directly accessed like in `execute`\n * confirm={({ pageIds }) => {\n * const deletedPageTitles = pages\n * .filter((p) => pageIds.includes(p.id))\n * .map((page) => page.title);\n *\n * deletePages(pageIds);\n *\n * // This result will be available as `result` in the tool's `render` props\n * return { data: { deletedPageTitles } };\n * }}\n *\n * // If needed, `cancel={() => ...}` would work similarly\n * >\n * Do you want to delete these pages?\n * <PagesPreviews />\n * </AiTool.Confirmation>\n * </AiTool>\n */\n Confirmation: AiToolConfirmation,\n }\n);\n"],"names":["jsx","cn","useAiToolInvocationContext","jsxs","CodeBlock","overrides","useOverrides","useMemo","useCallback","Button","forwardRef","kInternal","useSemiControllableState","Children","Collapsible.Root","Collapsible.Trigger","ChevronRightIcon","CheckCircleFillIcon","CrossCircleFillIcon","MinusCircleIcon","SpinnerIcon","Collapsible.Content"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiTool.cjs","sources":["../../src/components/AiTool.tsx"],"sourcesContent":["import type {\n AiToolExecuteCallback,\n AiToolTypePack,\n JsonObject,\n NoInfr,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { Children, forwardRef, useCallback, useMemo } from \"react\";\n\nimport { Button } from \"../_private\";\nimport {\n CheckCircleFillIcon,\n ChevronRightIcon,\n CrossCircleFillIcon,\n MinusCircleIcon,\n SpinnerIcon,\n} from \"../icons\";\nimport {\n type AiToolConfirmationOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../overrides\";\nimport { useAiToolInvocationContext } from \"../primitives/AiMessage/contexts\";\nimport * as Collapsible from \"../primitives/Collapsible\";\nimport { cn } from \"../utils/cn\";\nimport { useSemiControllableState } from \"../utils/use-controllable-state\";\nimport { CodeBlock } from \"./internal/CodeBlock\";\n\nexport interface AiToolProps\n extends Omit<ComponentProps<\"div\">, \"title\" | \"children\"> {\n /**\n * The tool's title.\n *\n * By default, a human-readable version of the tool's name is used:\n * - `\"showTodo\"` → \"Show todo\"\n * - `\"get_weather\"` → \"Get weather\"\n */\n title?: ReactNode;\n\n /**\n * An optional icon displayed next to the title.\n */\n icon?: ReactNode;\n\n /**\n * The content shown in the tool.\n */\n children?: ReactNode;\n\n /**\n * The visual appearance of the tool.\n */\n variant?: \"block\" | \"minimal\";\n\n /**\n * Whether the content is currently collapsed.\n * It is not a traditional controlled value, as in if you set it to `true` it would only stay expanded.\n * Instead, it is \"semi-controlled\", meaning that setting it to `true` will expand it, but it\n * can still be collapsed/expanded by clicking on it.\n */\n collapsed?: boolean;\n\n /**\n * The event handler called when the content is collapsed or expanded by clicking on it.\n */\n onCollapsedChange?: (collapsed: boolean) => void;\n\n /**\n * Whether the content can be collapsed/expanded.\n * If set to `false`, clicking on it will have no effect.\n * If there's no content, this prop has no effect.\n */\n collapsible?: boolean;\n}\n\nexport type AiToolIconProps = ComponentProps<\"div\">;\n\nexport type AiToolInspectorProps = ComponentProps<\"div\">;\n\nexport interface AiToolConfirmationProps<\n A extends JsonObject,\n R extends JsonObject,\n> extends ComponentProps<\"div\"> {\n /**\n * The callback invoked when the user clicks the confirm button.\n */\n confirm: AiToolExecuteCallback<A, R>;\n\n /**\n * The callback invoked when the user clicks the cancel button.\n */\n cancel?: AiToolExecuteCallback<A, R>;\n\n /**\n * The visual appearance.\n */\n variant?: \"default\" | \"destructive\";\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiToolConfirmationOverrides>;\n\n /**\n * The tool's result type, to be used with the `types` prop in the `render` method.\n *\n * @example\n * defineAiTool<{ value: number }>()({\n * // ...\n * render: ({ types }) => (\n * <AiTool.Confirmation\n * types={types}\n * confirm={() => {\n * return {\n * // Using `types` makes the result type-safe\n * // based on the tool's definition\n * data: { value: 123 },\n * };\n * }}\n * />\n * ),\n * })\n */\n types?: NoInfr<AiToolTypePack<A, R>>;\n}\n\nfunction AiToolIcon({ className, ...props }: AiToolIconProps) {\n return <div className={cn(\"lb-ai-tool-icon\", className)} {...props} />;\n}\n\nfunction AiToolInspector({ className, ...props }: AiToolInspectorProps) {\n const { args, partialArgs, result } = useAiToolInvocationContext();\n\n return (\n <div className={cn(\"lb-ai-tool-inspector\", className)} {...props}>\n <CodeBlock\n title=\"Arguments\"\n code={JSON.stringify(args ?? partialArgs, null, 2)}\n />\n {result !== undefined ? (\n <CodeBlock title=\"Result\" code={JSON.stringify(result, null, 2)} />\n ) : null}\n </div>\n );\n}\n\nfunction AiToolConfirmation<\n TPack extends AiToolTypePack,\n A extends JsonObject = TPack[\"A\"],\n R extends JsonObject = TPack[\"R\"],\n>({\n children,\n variant = \"default\",\n confirm,\n cancel,\n overrides,\n className,\n ...props\n}: AiToolConfirmationProps<A, R>) {\n const { stage, args, respond, name, invocationId } =\n useAiToolInvocationContext();\n const $ = useOverrides(overrides);\n\n const enabled = stage === \"executing\";\n\n const context = useMemo(() => ({ name, invocationId }), [name, invocationId]);\n\n const onConfirmClick = useCallback(async () => {\n if (enabled) {\n const result = await confirm(args as A, context);\n respond(result ?? undefined);\n }\n }, [enabled, args, confirm, respond, context]);\n\n const onCancelClick = useCallback(async () => {\n if (enabled) {\n if (cancel === undefined) {\n respond({ cancel: true });\n } else {\n const result = await cancel(args as A, context);\n respond(result ?? undefined);\n }\n }\n }, [enabled, args, cancel, respond, context]);\n\n // If there's no content and the tool has been executed (so there's no\n // confirmation UI displayed either), don't render anything.\n if (stage === \"executed\" && !children) {\n return null;\n }\n\n return (\n <div className={cn(\"lb-ai-tool-confirmation\", className)} {...props}>\n {children ? (\n <div className=\"lb-ai-tool-confirmation-content\">{children}</div>\n ) : null}\n {stage !== \"executed\" && (\n <div className=\"lb-ai-tool-confirmation-footer\">\n <div className=\"lb-ai-tool-confirmation-actions\">\n <Button\n disabled={!enabled}\n onClick={onCancelClick}\n variant=\"secondary\"\n >\n {$.AI_TOOL_CONFIRMATION_CANCEL}\n </Button>\n <Button\n disabled={!enabled}\n onClick={onConfirmClick}\n variant={variant === \"destructive\" ? \"destructive\" : \"primary\"}\n >\n {$.AI_TOOL_CONFIRMATION_CONFIRM}\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction prettifyString(string: string) {\n return (\n string\n // Convert camelCase to spaces\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n // Convert snake_case and kebab-case to spaces\n .replace(/[_-]+/g, \" \")\n // Collapse multiple following spaces\n .replace(/\\s+/g, \" \")\n // Trim leading and trailing spaces\n .trim()\n // Capitalize first word\n .toLowerCase()\n .replace(/^\\w/, (character) => character.toUpperCase())\n );\n}\n\n/**\n * A pre-built component which displays a tool call.\n *\n * By default, a human-readable version of the tool's name is used as a title:\n * - `\"showTodo\"` → \"Show todo\"\n * - `\"get_weather\"` → \"Get weather\"\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: () => (\n * <AiTool />\n * ),\n * })\n *\n * It can be customized in various ways:\n * - adding an icon\n * - customizing the title (even dynamically)\n * - adding custom content inside it\n * - collapsing it conditionally\n * - etc.\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: ({ stage, result }) => (\n * <AiTool\n * icon=\"🔍\"\n *\n * // Override the default title based on the tool's stage\n * title={stage === \"executing\" ? \"Searching…\" : \"Search results\"}\n *\n * // Start open and automatically collapse after it is executed\n * // The user can still expand/collapse it manually at any time\n * collapsed={stage === \"executed\"}\n * >\n * <SearchResults data={result.data} />\n * </AiTool>\n * ),\n * })\n *\n * It also comes with a few built-in sub-components:\n * - `AiTool.Confirmation` to display a human-in-the-loop confirmation step\n * which can be accepted or cancelled by the user.\n * - `AiTool.Inspector` to display the tool's arguments and result which can\n * be useful during development.\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: () => (\n * <AiTool>\n * <AiTool.Confirmation\n * // Use a destructive visual appearance\n * variant=\"destructive\"\n *\n * // The tool's arguments can be directly accessed like in `execute`\n * confirm={({ pageIds }) => {\n * const deletedPageTitles = pages\n * .filter((p) => pageIds.includes(p.id))\n * .map((page) => page.title);\n *\n * deletePages(pageIds);\n *\n * // This result will be available as `result` in the tool's `render` props\n * return { data: { deletedPageTitles } };\n * }}\n *\n * // If needed, `cancel={() => ...}` would work similarly\n * >\n * Do you want to delete these pages?\n * <PagesPreviews />\n * </AiTool.Confirmation>\n * </AiTool>\n * ),\n * })\n *\n * @example\n * defineAiTool()({\n * // ...\n * render: () => (\n * <AiTool>\n * <AiTool.Inspector />\n * </AiTool>\n * ),\n * })\n */\nexport const AiTool = Object.assign(\n forwardRef<HTMLDivElement, AiToolProps>(\n (\n {\n children,\n title,\n icon,\n collapsible,\n collapsed,\n onCollapsedChange,\n variant = \"block\",\n className,\n ...props\n },\n forwardedRef\n ) => {\n const {\n stage,\n result,\n name,\n [kInternal]: { execute, messageStatus },\n } = useAiToolInvocationContext();\n // Only mark the tool as pending visually (e.g. show a spinner, add a shimmer animation, etc.)\n // if it has an `execute` method and it isn't in the \"executed\" stage.\n const isVisuallyPending =\n execute !== undefined &&\n stage !== \"executed\" &&\n // If it's in the \"receiving\" stage, we also check that the outer message is still generating.\n (stage === \"receiving\" ? messageStatus === \"generating\" : true);\n const [semiControlledCollapsed, onSemiControlledCollapsed] =\n useSemiControllableState(collapsed ?? false, onCollapsedChange);\n // TODO: This check won't work for cases like:\n // <AiTool>\n // <ComponentThatRendersNull />\n // <ComponentThatAlsoRendersNull />\n // </AiTool>\n // One solution could be to check the DOM on every render with `useLayoutEffect`\n // to see if there's any actual content.\n // For now we're limiting the visual issues caused by the above by using CSS's\n // `:empty` pseudo-class to make the content 0px high if it's actually empty.\n const hasContent = Children.count(children) > 0;\n // If there's no content, the tool is never collapsible.\n const isCollapsible = hasContent ? (collapsible ?? true) : false;\n const resolvedTitle = useMemo(() => {\n return title ?? prettifyString(name);\n }, [title, name]);\n\n // `AiTool` uses \"collapsed\" instead of \"open\" (like the `Composer` component) because \"open\"\n // makes sense next to something called \"Collapsible\" but less so for something called \"AiTool\".\n const handleCollapsibleOpenChange = useCallback(\n (open: boolean) => {\n onSemiControlledCollapsed(!open);\n },\n [onSemiControlledCollapsed]\n );\n\n return (\n <Collapsible.Root\n ref={forwardedRef}\n className={cn(\n \"lb-collapsible lb-ai-tool\",\n `lb-ai-tool:variant-${variant}`,\n className\n )}\n {...props}\n // Regardless of `semiControlledCollapsed`, the collapsible is closed if there's no content.\n open={hasContent ? !semiControlledCollapsed : false}\n onOpenChange={handleCollapsibleOpenChange}\n disabled={!isCollapsible}\n data-result={result?.type}\n data-stage={stage}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger lb-ai-tool-header\",\n variant === \"minimal\" && isVisuallyPending && \"lb-ai-chat-pending\"\n )}\n >\n {icon ? (\n <div className=\"lb-ai-tool-header-icon-container\">{icon}</div>\n ) : null}\n <span className=\"lb-ai-tool-header-title\">{resolvedTitle}</span>\n {isCollapsible ? (\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n ) : null}\n {variant !== \"minimal\" ? (\n <div className=\"lb-ai-tool-header-status\">\n {stage === \"executed\" ? (\n result.type === \"success\" ? (\n <CheckCircleFillIcon />\n ) : result.type === \"error\" ? (\n <CrossCircleFillIcon />\n ) : result.type === \"cancelled\" ? (\n <MinusCircleIcon />\n ) : null\n ) : isVisuallyPending ? (\n <SpinnerIcon />\n ) : null}\n </div>\n ) : null}\n </Collapsible.Trigger>\n\n {hasContent ? (\n <Collapsible.Content className=\"lb-collapsible-content lb-ai-tool-content-container\">\n <div className=\"lb-ai-tool-content\">{children}</div>\n </Collapsible.Content>\n ) : null}\n </Collapsible.Root>\n );\n }\n ),\n {\n /**\n * Display an icon in a container.\n *\n * @example\n * <AiTool\n * icon={\n * <AiTool.Icon>🔍</AiTool.Icon>\n * }\n * />\n */\n Icon: AiToolIcon,\n\n /**\n * Display the tool's arguments and result, which can be useful during\n * development.\n *\n * @example\n * <AiTool>\n * <AiTool.Inspector />\n * </AiTool>\n */\n Inspector: AiToolInspector,\n\n /**\n * Display a human-in-the-loop confirmation step which can be accepted\n * or cancelled by the user.\n *\n * The `confirm` and `cancel` callbacks work like `execute` in tool definitions: they can\n * perform side-effects, be async if needed, and return a result. The tool call will stay\n * pending until either `confirm` or `cancel` is called.\n *\n * @example\n * <AiTool>\n * <AiTool.Confirmation\n * // Use a destructive visual appearance\n * variant=\"destructive\"\n *\n * // The tool's arguments can be directly accessed like in `execute`\n * confirm={({ pageIds }) => {\n * const deletedPageTitles = pages\n * .filter((p) => pageIds.includes(p.id))\n * .map((page) => page.title);\n *\n * deletePages(pageIds);\n *\n * // This result will be available as `result` in the tool's `render` props\n * return { data: { deletedPageTitles } };\n * }}\n *\n * // If needed, `cancel={() => ...}` would work similarly\n * >\n * Do you want to delete these pages?\n * <PagesPreviews />\n * </AiTool.Confirmation>\n * </AiTool>\n */\n Confirmation: AiToolConfirmation,\n }\n);\n"],"names":["jsx","cn","useAiToolInvocationContext","jsxs","CodeBlock","overrides","useOverrides","useMemo","useCallback","Button","forwardRef","kInternal","useSemiControllableState","Children","Collapsible.Root","Collapsible.Trigger","ChevronRightIcon","CheckCircleFillIcon","CrossCircleFillIcon","MinusCircleIcon","SpinnerIcon","Collapsible.Content"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+HA,SAAS,UAAW,CAAA,EAAE,SAAW,EAAA,GAAG,OAA0B,EAAA;AAC5D,EAAO,uBAAAA,cAAA,CAAC,SAAI,SAAW,EAAAC,KAAA,CAAG,mBAAmB,SAAS,CAAA,EAAI,GAAG,KAAO,EAAA,CAAA,CAAA;AACtE,CAAA;AAEA,SAAS,eAAgB,CAAA,EAAE,SAAW,EAAA,GAAG,OAA+B,EAAA;AACtE,EAAA,MAAM,EAAE,IAAA,EAAM,WAAa,EAAA,MAAA,KAAWC,mCAA2B,EAAA,CAAA;AAEjE,EACE,uBAAAC,eAAA,CAAC,SAAI,SAAW,EAAAF,KAAA,CAAG,wBAAwB,SAAS,CAAA,EAAI,GAAG,KACzD,EAAA,QAAA,EAAA;AAAA,oBAAAD,cAAA;AAAA,MAACI,mBAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,WAAA;AAAA,QACN,MAAM,IAAK,CAAA,SAAA,CAAU,IAAQ,IAAA,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,OAAA;AAAA,KACnD;AAAA,IACC,MAAW,KAAA,KAAA,CAAA,mBACTJ,cAAA,CAAAI,mBAAA,EAAA,EAAU,KAAM,EAAA,QAAA,EAAS,IAAM,EAAA,IAAA,CAAK,SAAU,CAAA,MAAA,EAAQ,IAAM,EAAA,CAAC,GAAG,CAC/D,GAAA,IAAA;AAAA,GACN,EAAA,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,kBAIP,CAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAU,GAAA,SAAA;AAAA,EACV,OAAA;AAAA,EACA,MAAA;AAAA,aACAC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG,KAAA;AACL,CAAkC,EAAA;AAChC,EAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,SAAS,IAAM,EAAA,YAAA,KAClCH,mCAA2B,EAAA,CAAA;AAC7B,EAAM,MAAA,CAAA,GAAII,uBAAaD,WAAS,CAAA,CAAA;AAEhC,EAAA,MAAM,UAAU,KAAU,KAAA,WAAA,CAAA;AAE1B,EAAM,MAAA,OAAA,GAAUE,aAAQ,CAAA,OAAO,EAAE,IAAA,EAAM,cAAiB,CAAA,EAAA,CAAC,IAAM,EAAA,YAAY,CAAC,CAAA,CAAA;AAE5E,EAAM,MAAA,cAAA,GAAiBC,kBAAY,YAAY;AAC7C,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,MAAM,MAAS,GAAA,MAAM,OAAQ,CAAA,IAAA,EAAW,OAAO,CAAA,CAAA;AAC/C,MAAA,OAAA,CAAQ,UAAU,KAAS,CAAA,CAAA,CAAA;AAAA,KAC7B;AAAA,KACC,CAAC,OAAA,EAAS,MAAM,OAAS,EAAA,OAAA,EAAS,OAAO,CAAC,CAAA,CAAA;AAE7C,EAAM,MAAA,aAAA,GAAgBA,kBAAY,YAAY;AAC5C,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACxB,QAAQ,OAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,OACnB,MAAA;AACL,QAAA,MAAM,MAAS,GAAA,MAAM,MAAO,CAAA,IAAA,EAAW,OAAO,CAAA,CAAA;AAC9C,QAAA,OAAA,CAAQ,UAAU,KAAS,CAAA,CAAA,CAAA;AAAA,OAC7B;AAAA,KACF;AAAA,KACC,CAAC,OAAA,EAAS,MAAM,MAAQ,EAAA,OAAA,EAAS,OAAO,CAAC,CAAA,CAAA;AAI5C,EAAI,IAAA,KAAA,KAAU,UAAc,IAAA,CAAC,QAAU,EAAA;AACrC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EACE,uBAAAL,eAAA,CAAC,SAAI,SAAW,EAAAF,KAAA,CAAG,2BAA2B,SAAS,CAAA,EAAI,GAAG,KAC3D,EAAA,QAAA,EAAA;AAAA,IAAA,QAAA,mBACED,cAAA,CAAA,KAAA,EAAA,EAAI,SAAU,EAAA,iCAAA,EAAmC,UAAS,CACzD,GAAA,IAAA;AAAA,IACH,KAAA,KAAU,8BACRA,cAAA,CAAA,KAAA,EAAA,EAAI,WAAU,gCACb,EAAA,QAAA,kBAAAG,eAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,iCACb,EAAA,QAAA,EAAA;AAAA,sBAAAH,cAAA;AAAA,QAACS,aAAA;AAAA,QAAA;AAAA,UACC,UAAU,CAAC,OAAA;AAAA,UACX,OAAS,EAAA,aAAA;AAAA,UACT,OAAQ,EAAA,WAAA;AAAA,UAEP,QAAE,EAAA,CAAA,CAAA,2BAAA;AAAA,SAAA;AAAA,OACL;AAAA,sBACAT,cAAA;AAAA,QAACS,aAAA;AAAA,QAAA;AAAA,UACC,UAAU,CAAC,OAAA;AAAA,UACX,OAAS,EAAA,cAAA;AAAA,UACT,OAAA,EAAS,OAAY,KAAA,aAAA,GAAgB,aAAgB,GAAA,SAAA;AAAA,UAEpD,QAAE,EAAA,CAAA,CAAA,4BAAA;AAAA,SAAA;AAAA,OACL;AAAA,KAAA,EACF,CACF,EAAA,CAAA;AAAA,GAEJ,EAAA,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,eAAe,MAAgB,EAAA;AACtC,EACE,OAAA,MAAA,CAEG,QAAQ,iBAAmB,EAAA,OAAO,EAElC,OAAQ,CAAA,QAAA,EAAU,GAAG,CAAA,CAErB,OAAQ,CAAA,MAAA,EAAQ,GAAG,CAEnB,CAAA,IAAA,EAEA,CAAA,WAAA,EACA,CAAA,OAAA,CAAQ,OAAO,CAAC,SAAA,KAAc,SAAU,CAAA,WAAA,EAAa,CAAA,CAAA;AAE5D,CAAA;AAyFO,MAAM,SAAS,MAAO,CAAA,MAAA;AAAA,EAC3BC,gBAAA;AAAA,IACE,CACE;AAAA,MACE,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAU,GAAA,OAAA;AAAA,MACV,SAAA;AAAA,MACA,GAAG,KAAA;AAAA,OAEL,YACG,KAAA;AACH,MAAM,MAAA;AAAA,QACJ,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,CAACC,cAAS,GAAG,EAAE,SAAS,aAAc,EAAA;AAAA,UACpCT,mCAA2B,EAAA,CAAA;AAG/B,MAAM,MAAA,iBAAA,GACJ,OAAY,KAAA,KAAA,CAAA,IACZ,KAAU,KAAA,UAAA;AAAA,OAET,KAAA,KAAU,WAAc,GAAA,aAAA,KAAkB,YAAe,GAAA,IAAA,CAAA,CAAA;AAC5D,MAAA,MAAM,CAAC,uBAAyB,EAAA,yBAAyB,IACvDU,6CAAyB,CAAA,SAAA,IAAa,OAAO,iBAAiB,CAAA,CAAA;AAUhE,MAAA,MAAM,UAAa,GAAAC,cAAA,CAAS,KAAM,CAAA,QAAQ,CAAI,GAAA,CAAA,CAAA;AAE9C,MAAM,MAAA,aAAA,GAAgB,UAAc,GAAA,WAAA,IAAe,IAAQ,GAAA,KAAA,CAAA;AAC3D,MAAM,MAAA,aAAA,GAAgBN,cAAQ,MAAM;AAClC,QAAO,OAAA,KAAA,IAAS,eAAe,IAAI,CAAA,CAAA;AAAA,OAClC,EAAA,CAAC,KAAO,EAAA,IAAI,CAAC,CAAA,CAAA;AAIhB,MAAA,MAAM,2BAA8B,GAAAC,iBAAA;AAAA,QAClC,CAAC,IAAkB,KAAA;AACjB,UAAA,yBAAA,CAA0B,CAAC,IAAI,CAAA,CAAA;AAAA,SACjC;AAAA,QACA,CAAC,yBAAyB,CAAA;AAAA,OAC5B,CAAA;AAEA,MACE,uBAAAL,eAAA;AAAA,QAACW,UAAY;AAAA,QAAZ;AAAA,UACC,GAAK,EAAA,YAAA;AAAA,UACL,SAAW,EAAAb,KAAA;AAAA,YACT,2BAAA;AAAA,YACA,sBAAsB,OAAO,CAAA,CAAA;AAAA,YAC7B,SAAA;AAAA,WACF;AAAA,UACC,GAAG,KAAA;AAAA,UAEJ,IAAA,EAAM,UAAa,GAAA,CAAC,uBAA0B,GAAA,KAAA;AAAA,UAC9C,YAAc,EAAA,2BAAA;AAAA,UACd,UAAU,CAAC,aAAA;AAAA,UACX,eAAa,MAAQ,EAAA,IAAA;AAAA,UACrB,YAAY,EAAA,KAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAAE,eAAA;AAAA,cAACY,aAAY;AAAA,cAAZ;AAAA,gBACC,SAAW,EAAAd,KAAA;AAAA,kBACT,0CAAA;AAAA,kBACA,OAAA,KAAY,aAAa,iBAAqB,IAAA,oBAAA;AAAA,iBAChD;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,IAAA,mBACED,cAAA,CAAA,KAAA,EAAA,EAAI,SAAU,EAAA,kCAAA,EAAoC,gBAAK,CACtD,GAAA,IAAA;AAAA,kCACHA,cAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,yBAAA,EAA2B,QAAc,EAAA,aAAA,EAAA,CAAA;AAAA,kBACxD,aAAA,kCACE,MAAK,EAAA,EAAA,SAAA,EAAU,4CACd,QAAC,kBAAAA,cAAA,CAAAgB,6BAAA,EAAA,EAAiB,GACpB,CACE,GAAA,IAAA;AAAA,kBACH,OAAY,KAAA,SAAA,mBACVhB,cAAA,CAAA,KAAA,EAAA,EAAI,WAAU,0BACZ,EAAA,QAAA,EAAA,KAAA,KAAU,UACT,GAAA,MAAA,CAAO,IAAS,KAAA,SAAA,mBACbA,cAAA,CAAAiB,mCAAA,EAAA,EAAoB,IACnB,MAAO,CAAA,IAAA,KAAS,OAClB,mBAAAjB,cAAA,CAACkB,mCAAoB,EAAA,EAAA,CAAA,GACnB,MAAO,CAAA,IAAA,KAAS,8BACjBlB,cAAA,CAAAmB,2BAAA,EAAA,EAAgB,CACf,GAAA,IAAA,GACF,iBACF,mBAAAnB,cAAA,CAACoB,mBAAY,EAAA,EAAA,CAAA,GACX,MACN,CACE,GAAA,IAAA;AAAA,iBAAA;AAAA,eAAA;AAAA,aACN;AAAA,YAEC,UACC,mBAAApB,cAAA,CAACqB,aAAY,EAAZ,EAAoB,SAAA,EAAU,qDAC7B,EAAA,QAAA,kBAAArB,cAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,oBAAsB,EAAA,QAAA,EAAS,GAChD,CACE,GAAA,IAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OACN,CAAA;AAAA,KAEJ;AAAA,GACF;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWE,IAAM,EAAA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWN,SAAW,EAAA,eAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmCX,YAAc,EAAA,kBAAA;AAAA,GAChB;AACF;;;;"}
|
|
@@ -17,27 +17,20 @@ import { MinusCircleIcon } from '../icons/MinusCircle.js';
|
|
|
17
17
|
import { SpinnerIcon } from '../icons/Spinner.js';
|
|
18
18
|
|
|
19
19
|
function AiToolIcon({ className, ...props }) {
|
|
20
|
-
return /* @__PURE__ */ jsx("div", {
|
|
21
|
-
className: cn("lb-ai-tool-icon", className),
|
|
22
|
-
...props
|
|
23
|
-
});
|
|
20
|
+
return /* @__PURE__ */ jsx("div", { className: cn("lb-ai-tool-icon", className), ...props });
|
|
24
21
|
}
|
|
25
22
|
function AiToolInspector({ className, ...props }) {
|
|
26
23
|
const { args, partialArgs, result } = useAiToolInvocationContext();
|
|
27
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/* @__PURE__ */ jsx(CodeBlock, {
|
|
24
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("lb-ai-tool-inspector", className), ...props, children: [
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
CodeBlock,
|
|
27
|
+
{
|
|
32
28
|
title: "Arguments",
|
|
33
29
|
code: JSON.stringify(args ?? partialArgs, null, 2)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}) : null
|
|
39
|
-
]
|
|
40
|
-
});
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
result !== void 0 ? /* @__PURE__ */ jsx(CodeBlock, { title: "Result", code: JSON.stringify(result, null, 2) }) : null
|
|
33
|
+
] });
|
|
41
34
|
}
|
|
42
35
|
function AiToolConfirmation({
|
|
43
36
|
children,
|
|
@@ -71,36 +64,29 @@ function AiToolConfirmation({
|
|
|
71
64
|
if (stage === "executed" && !children) {
|
|
72
65
|
return null;
|
|
73
66
|
}
|
|
74
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
75
|
-
className:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
children: $.AI_TOOL_CONFIRMATION_CONFIRM
|
|
98
|
-
})
|
|
99
|
-
]
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
]
|
|
103
|
-
});
|
|
67
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("lb-ai-tool-confirmation", className), ...props, children: [
|
|
68
|
+
children ? /* @__PURE__ */ jsx("div", { className: "lb-ai-tool-confirmation-content", children }) : null,
|
|
69
|
+
stage !== "executed" && /* @__PURE__ */ jsx("div", { className: "lb-ai-tool-confirmation-footer", children: /* @__PURE__ */ jsxs("div", { className: "lb-ai-tool-confirmation-actions", children: [
|
|
70
|
+
/* @__PURE__ */ jsx(
|
|
71
|
+
Button,
|
|
72
|
+
{
|
|
73
|
+
disabled: !enabled,
|
|
74
|
+
onClick: onCancelClick,
|
|
75
|
+
variant: "secondary",
|
|
76
|
+
children: $.AI_TOOL_CONFIRMATION_CANCEL
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
Button,
|
|
81
|
+
{
|
|
82
|
+
disabled: !enabled,
|
|
83
|
+
onClick: onConfirmClick,
|
|
84
|
+
variant: variant === "destructive" ? "destructive" : "primary",
|
|
85
|
+
children: $.AI_TOOL_CONFIRMATION_CONFIRM
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
] }) })
|
|
89
|
+
] });
|
|
104
90
|
}
|
|
105
91
|
function prettifyString(string) {
|
|
106
92
|
return string.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim().toLowerCase().replace(/^\w/, (character) => character.toUpperCase());
|
|
@@ -124,7 +110,8 @@ const AiTool = Object.assign(
|
|
|
124
110
|
name,
|
|
125
111
|
[kInternal]: { execute, messageStatus }
|
|
126
112
|
} = useAiToolInvocationContext();
|
|
127
|
-
const isVisuallyPending = execute !== void 0 && stage !== "executed" &&
|
|
113
|
+
const isVisuallyPending = execute !== void 0 && stage !== "executed" && // If it's in the "receiving" stage, we also check that the outer message is still generating.
|
|
114
|
+
(stage === "receiving" ? messageStatus === "generating" : true);
|
|
128
115
|
const [semiControlledCollapsed, onSemiControlledCollapsed] = useSemiControllableState(collapsed ?? false, onCollapsedChange);
|
|
129
116
|
const hasContent = Children.count(children) > 0;
|
|
130
117
|
const isCollapsible = hasContent ? collapsible ?? true : false;
|
|
@@ -137,58 +124,98 @@ const AiTool = Object.assign(
|
|
|
137
124
|
},
|
|
138
125
|
[onSemiControlledCollapsed]
|
|
139
126
|
);
|
|
140
|
-
return /* @__PURE__ */ jsxs(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
127
|
+
return /* @__PURE__ */ jsxs(
|
|
128
|
+
CollapsibleRoot,
|
|
129
|
+
{
|
|
130
|
+
ref: forwardedRef,
|
|
131
|
+
className: cn(
|
|
132
|
+
"lb-collapsible lb-ai-tool",
|
|
133
|
+
`lb-ai-tool:variant-${variant}`,
|
|
134
|
+
className
|
|
135
|
+
),
|
|
136
|
+
...props,
|
|
137
|
+
open: hasContent ? !semiControlledCollapsed : false,
|
|
138
|
+
onOpenChange: handleCollapsibleOpenChange,
|
|
139
|
+
disabled: !isCollapsible,
|
|
140
|
+
"data-result": result?.type,
|
|
141
|
+
"data-stage": stage,
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ jsxs(
|
|
144
|
+
CollapsibleTrigger,
|
|
145
|
+
{
|
|
146
|
+
className: cn(
|
|
147
|
+
"lb-collapsible-trigger lb-ai-tool-header",
|
|
148
|
+
variant === "minimal" && isVisuallyPending && "lb-ai-chat-pending"
|
|
149
|
+
),
|
|
150
|
+
children: [
|
|
151
|
+
icon ? /* @__PURE__ */ jsx("div", { className: "lb-ai-tool-header-icon-container", children: icon }) : null,
|
|
152
|
+
/* @__PURE__ */ jsx("span", { className: "lb-ai-tool-header-title", children: resolvedTitle }),
|
|
153
|
+
isCollapsible ? /* @__PURE__ */ jsx("span", { className: "lb-collapsible-chevron lb-icon-container", children: /* @__PURE__ */ jsx(ChevronRightIcon, {}) }) : null,
|
|
154
|
+
variant !== "minimal" ? /* @__PURE__ */ jsx("div", { className: "lb-ai-tool-header-status", children: stage === "executed" ? result.type === "success" ? /* @__PURE__ */ jsx(CheckCircleFillIcon, {}) : result.type === "error" ? /* @__PURE__ */ jsx(CrossCircleFillIcon, {}) : result.type === "cancelled" ? /* @__PURE__ */ jsx(MinusCircleIcon, {}) : null : isVisuallyPending ? /* @__PURE__ */ jsx(SpinnerIcon, {}) : null }) : null
|
|
155
|
+
]
|
|
156
|
+
}
|
|
158
157
|
),
|
|
159
|
-
children:
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}) : null,
|
|
164
|
-
/* @__PURE__ */ jsx("span", {
|
|
165
|
-
className: "lb-ai-tool-header-title",
|
|
166
|
-
children: resolvedTitle
|
|
167
|
-
}),
|
|
168
|
-
isCollapsible ? /* @__PURE__ */ jsx("span", {
|
|
169
|
-
className: "lb-collapsible-chevron lb-icon-container",
|
|
170
|
-
children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
|
|
171
|
-
}) : null,
|
|
172
|
-
variant !== "minimal" ? /* @__PURE__ */ jsx("div", {
|
|
173
|
-
className: "lb-ai-tool-header-status",
|
|
174
|
-
children: stage === "executed" ? result.type === "success" ? /* @__PURE__ */ jsx(CheckCircleFillIcon, {}) : result.type === "error" ? /* @__PURE__ */ jsx(CrossCircleFillIcon, {}) : result.type === "cancelled" ? /* @__PURE__ */ jsx(MinusCircleIcon, {}) : null : isVisuallyPending ? /* @__PURE__ */ jsx(SpinnerIcon, {}) : null
|
|
175
|
-
}) : null
|
|
176
|
-
]
|
|
177
|
-
}),
|
|
178
|
-
hasContent ? /* @__PURE__ */ jsx(CollapsibleContent, {
|
|
179
|
-
className: "lb-collapsible-content lb-ai-tool-content-container",
|
|
180
|
-
children: /* @__PURE__ */ jsx("div", {
|
|
181
|
-
className: "lb-ai-tool-content",
|
|
182
|
-
children
|
|
183
|
-
})
|
|
184
|
-
}) : null
|
|
185
|
-
]
|
|
186
|
-
});
|
|
158
|
+
hasContent ? /* @__PURE__ */ jsx(CollapsibleContent, { className: "lb-collapsible-content lb-ai-tool-content-container", children: /* @__PURE__ */ jsx("div", { className: "lb-ai-tool-content", children }) }) : null
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
);
|
|
187
162
|
}
|
|
188
163
|
),
|
|
189
164
|
{
|
|
165
|
+
/**
|
|
166
|
+
* Display an icon in a container.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* <AiTool
|
|
170
|
+
* icon={
|
|
171
|
+
* <AiTool.Icon>🔍</AiTool.Icon>
|
|
172
|
+
* }
|
|
173
|
+
* />
|
|
174
|
+
*/
|
|
190
175
|
Icon: AiToolIcon,
|
|
176
|
+
/**
|
|
177
|
+
* Display the tool's arguments and result, which can be useful during
|
|
178
|
+
* development.
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* <AiTool>
|
|
182
|
+
* <AiTool.Inspector />
|
|
183
|
+
* </AiTool>
|
|
184
|
+
*/
|
|
191
185
|
Inspector: AiToolInspector,
|
|
186
|
+
/**
|
|
187
|
+
* Display a human-in-the-loop confirmation step which can be accepted
|
|
188
|
+
* or cancelled by the user.
|
|
189
|
+
*
|
|
190
|
+
* The `confirm` and `cancel` callbacks work like `execute` in tool definitions: they can
|
|
191
|
+
* perform side-effects, be async if needed, and return a result. The tool call will stay
|
|
192
|
+
* pending until either `confirm` or `cancel` is called.
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* <AiTool>
|
|
196
|
+
* <AiTool.Confirmation
|
|
197
|
+
* // Use a destructive visual appearance
|
|
198
|
+
* variant="destructive"
|
|
199
|
+
*
|
|
200
|
+
* // The tool's arguments can be directly accessed like in `execute`
|
|
201
|
+
* confirm={({ pageIds }) => {
|
|
202
|
+
* const deletedPageTitles = pages
|
|
203
|
+
* .filter((p) => pageIds.includes(p.id))
|
|
204
|
+
* .map((page) => page.title);
|
|
205
|
+
*
|
|
206
|
+
* deletePages(pageIds);
|
|
207
|
+
*
|
|
208
|
+
* // This result will be available as `result` in the tool's `render` props
|
|
209
|
+
* return { data: { deletedPageTitles } };
|
|
210
|
+
* }}
|
|
211
|
+
*
|
|
212
|
+
* // If needed, `cancel={() => ...}` would work similarly
|
|
213
|
+
* >
|
|
214
|
+
* Do you want to delete these pages?
|
|
215
|
+
* <PagesPreviews />
|
|
216
|
+
* </AiTool.Confirmation>
|
|
217
|
+
* </AiTool>
|
|
218
|
+
*/
|
|
192
219
|
Confirmation: AiToolConfirmation
|
|
193
220
|
}
|
|
194
221
|
);
|