@red-hat-developer-hub/backstage-plugin-lightspeed 2.6.1 → 2.6.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  ## @red-hat-developer-hub/backstage-plugin-lightspeed
2
2
 
3
+ ## 2.6.3
4
+
5
+ ### Patch Changes
6
+
7
+ - d4d74cf: ### Lightspeed shell and Notebooks
8
+ - **Fullscreen**: Chat and Notebooks stay on separate tabs. While the Notebooks tab is active, chat-only header actions (for example chat history, pinned chats, and MCP settings) are hidden so the header matches the active surface.
9
+ - **Overlay and docked**: Only the **Chat** surface is shown; the Chat/Notebooks tab strip is not shown, because Notebooks is intended for the fullscreen experience only.
10
+ - **Leaving fullscreen from Notebooks**: If you switch from fullscreen while on Notebooks to overlay or docked, you land on **Chat** in the shell, and the next time you open fullscreen you start on **Chat** again (no lingering Notebooks selection).
11
+ - @red-hat-developer-hub/backstage-plugin-lightspeed-common@2.6.3
12
+
13
+ ## 2.6.2
14
+
15
+ ### Patch Changes
16
+
17
+ - 5148408: Migrated to Jest 30 as required by @backstage/cli 0.36.0.
18
+ - Updated dependencies [5148408]
19
+ - @red-hat-developer-hub/backstage-plugin-lightspeed-common@2.6.2
20
+
3
21
  ## 2.6.1
4
22
 
5
23
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { useState, useEffect, useRef, useCallback, useLayoutEffect, useMemo } from 'react';
3
- import { useNavigate, useMatch } from 'react-router-dom';
2
+ import { useState, useEffect, useRef, useLayoutEffect, useCallback, useMemo } from 'react';
3
+ import { useNavigate, useMatch, useLocation } from 'react-router-dom';
4
4
  import { Button, makeStyles } from '@material-ui/core';
5
5
  import { ChatbotDisplayMode, ChatbotContent, ChatbotFooter, MessageBar, ChatbotFootnote, Settings, Chatbot, ChatbotHeader, ChatbotHeaderMain, ChatbotHeaderMenu, ChatbotHeaderTitle, FileDropZone, ChatbotAlert } from '@patternfly/chatbot';
6
6
  import ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';
@@ -91,6 +91,7 @@ const useStyles = makeStyles((theme) => ({
91
91
  },
92
92
  "& .pf-v6-c-tabs__link, & .pf-v5-c-tabs__link": {
93
93
  backgroundColor: "transparent",
94
+ paddingTop: theme.spacing(2),
94
95
  paddingBottom: theme.spacing(2),
95
96
  fontWeight: 700,
96
97
  cursor: "pointer"
@@ -384,12 +385,39 @@ const LightspeedChat = ({
384
385
  const notebooksRouteMatch = useMatch("/lightspeed/notebooks");
385
386
  const notebookViewRouteMatch = useMatch("/lightspeed/notebooks/:notebookId");
386
387
  const routeNotebookId = notebookViewRouteMatch?.params?.notebookId;
388
+ const {
389
+ displayMode,
390
+ setDisplayMode,
391
+ currentConversationId: routeConversationId,
392
+ setCurrentConversationId,
393
+ draftMessage,
394
+ setDraftMessage,
395
+ consumePendingOverlayThreadHandoff,
396
+ shellViewTab,
397
+ setShellViewTab
398
+ } = useLightspeedDrawerContext();
399
+ const isFullscreenMode = displayMode === ChatbotDisplayMode.embedded;
400
+ const location = useLocation();
401
+ const isNotebooksFullscreenPath = location.pathname === "/lightspeed/notebooks" || location.pathname.startsWith("/lightspeed/notebooks/");
387
402
  const user = useBackstageUserIdentity();
388
403
  const [filterValue, setFilterValue] = useState("");
389
404
  const [announcement, setAnnouncement] = useState("");
390
- const [activeTab, setActiveTab] = useState(
391
- notebooksRouteMatch || notebookViewRouteMatch ? 1 : 0
392
- );
405
+ const [activeTab, setActiveTab] = useState(() => {
406
+ if (!isFullscreenMode) {
407
+ return 0;
408
+ }
409
+ if (notebooksRouteMatch || notebookViewRouteMatch) {
410
+ return 1;
411
+ }
412
+ const p = location.pathname;
413
+ if (p.startsWith("/lightspeed/conversation/")) {
414
+ return 0;
415
+ }
416
+ if (shellViewTab === 1) {
417
+ return 1;
418
+ }
419
+ return 0;
420
+ });
393
421
  const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } = useLightspeedNotebooksPermission();
394
422
  const notebooksPermissionResolved = !notebooksPermissionLoading && hasNotebooksAccess;
395
423
  const { data: notebooks = [], refetch: refetchNotebooks } = useNotebookSessions(notebooksPermissionResolved);
@@ -446,22 +474,37 @@ const LightspeedChat = ({
446
474
  const [hasChatContentOverflow, setHasChatContentOverflow] = useState(false);
447
475
  const wasStoppedByUserRef = useRef(false);
448
476
  const { isReady, lastOpenedId, setLastOpenedId, clearLastOpenedId } = useLastOpenedConversation(user);
449
- const {
450
- displayMode,
451
- setDisplayMode,
452
- currentConversationId: routeConversationId,
453
- setCurrentConversationId,
454
- draftMessage,
455
- setDraftMessage,
456
- consumePendingOverlayThreadHandoff
457
- } = useLightspeedDrawerContext();
458
- const isFullscreenMode = displayMode === ChatbotDisplayMode.embedded;
459
477
  const showChatPanel = !isFullscreenMode || activeTab === 0;
460
478
  const showNotebooksPanel = isFullscreenMode && activeTab !== 0;
461
479
  const [isChatHistoryDrawerOpen, setIsChatHistoryDrawerOpen] = useState(!isMobile && isFullscreenMode);
480
+ useLayoutEffect(() => {
481
+ if (!isFullscreenMode) {
482
+ return;
483
+ }
484
+ if (isNotebooksFullscreenPath) {
485
+ setActiveTab(1);
486
+ setShellViewTab(1);
487
+ return;
488
+ }
489
+ const isBaseLightspeedChatRoute = location.pathname === "/lightspeed" || location.pathname === "/lightspeed/";
490
+ if (shellViewTab === 1 && isBaseLightspeedChatRoute) {
491
+ navigate("/lightspeed/notebooks", { replace: true });
492
+ return;
493
+ }
494
+ setActiveTab(0);
495
+ setShellViewTab(0);
496
+ }, [
497
+ isFullscreenMode,
498
+ isNotebooksFullscreenPath,
499
+ shellViewTab,
500
+ location.pathname,
501
+ navigate,
502
+ setShellViewTab
503
+ ]);
462
504
  const handleNotebookTabSelect = (_event, tabIndex) => {
463
505
  const nextTab = Number(tabIndex);
464
506
  setActiveTab(nextTab);
507
+ setShellViewTab(nextTab);
465
508
  if (nextTab === 1) {
466
509
  navigate("/lightspeed/notebooks");
467
510
  if (notebooksPermissionResolved) {
@@ -473,6 +516,25 @@ const LightspeedChat = ({
473
516
  );
474
517
  }
475
518
  };
519
+ const setDisplayModeFromHeader = useCallback(
520
+ (mode) => {
521
+ if (mode !== ChatbotDisplayMode.embedded) {
522
+ setDisplayMode(mode);
523
+ return;
524
+ }
525
+ if (activeTab === 1) {
526
+ const sid = activeNotebook?.session_id;
527
+ setDisplayMode(
528
+ mode,
529
+ void 0,
530
+ sid ? { notebookSessionId: sid } : "notebooks"
531
+ );
532
+ } else {
533
+ setDisplayMode(mode);
534
+ }
535
+ },
536
+ [setDisplayMode, activeTab, activeNotebook?.session_id]
537
+ );
476
538
  const handleCreateNotebook = useCallback(() => {
477
539
  createNotebookMutation.mutate(
478
540
  { name: UNTITLED_NOTEBOOK_NAME },
@@ -1346,7 +1408,7 @@ const LightspeedChat = ({
1346
1408
  children: [
1347
1409
  /* @__PURE__ */ jsxs(ChatbotHeader, { className: classes.header, children: [
1348
1410
  /* @__PURE__ */ jsxs(ChatbotHeaderMain, { children: [
1349
- /* @__PURE__ */ jsx(
1411
+ showChatPanel && /* @__PURE__ */ jsx(
1350
1412
  ChatbotHeaderMenu,
1351
1413
  {
1352
1414
  "aria-expanded": isChatHistoryDrawerOpen,
@@ -1371,7 +1433,8 @@ const LightspeedChat = ({
1371
1433
  isPinningChatsEnabled,
1372
1434
  isModelSelectorDisabled: isSendButtonDisabled,
1373
1435
  hideModelSelector: showNotebooksPanel,
1374
- setDisplayMode,
1436
+ showChatTabOptions: !showNotebooksPanel,
1437
+ setDisplayMode: setDisplayModeFromHeader,
1375
1438
  displayMode,
1376
1439
  onPinnedChatsToggle: handlePinningChatsToggle,
1377
1440
  onMcpSettingsClick: () => setIsMcpSettingsOpen(true)
@@ -1488,7 +1551,9 @@ const LightspeedChat = ({
1488
1551
  classes,
1489
1552
  openNotebookMenuId,
1490
1553
  setOpenNotebookMenuId,
1491
- onSelectNotebook: (notebook) => navigate(`/lightspeed/notebooks/${notebook.session_id}`),
1554
+ onSelectNotebook: (notebook) => {
1555
+ navigate(`/lightspeed/notebooks/${notebook.session_id}`);
1556
+ },
1492
1557
  onRename: setRenameNotebookId,
1493
1558
  onDelete: setDeleteNotebookId,
1494
1559
  onCreateNotebook: handleCreateNotebook,
@@ -1506,7 +1571,10 @@ const LightspeedChat = ({
1506
1571
  variant: "outlined",
1507
1572
  color: "primary",
1508
1573
  style: { borderRadius: "20px" },
1509
- onClick: () => setActiveTab(0),
1574
+ onClick: () => {
1575
+ setActiveTab(0);
1576
+ setShellViewTab(0);
1577
+ },
1510
1578
  children: t("permission.notebooks.goBack")
1511
1579
  }
1512
1580
  )
@@ -1 +1 @@
1
- {"version":3,"file":"LightSpeedChat.esm.js","sources":["../../src/components/LightSpeedChat.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ChangeEvent,\n MouseEvent,\n Ref,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n FileRejection,\n type DropEvent as ReactDropzoneDropEvent,\n} from 'react-dropzone';\nimport { useMatch, useNavigate } from 'react-router-dom';\n\nimport { Button, makeStyles } from '@material-ui/core';\nimport {\n Chatbot,\n ChatbotAlert,\n ChatbotContent,\n ChatbotDisplayMode,\n ChatbotFooter,\n ChatbotFootnote,\n ChatbotHeader,\n ChatbotHeaderMain,\n ChatbotHeaderMenu,\n ChatbotHeaderTitle,\n FileDropZone,\n MessageBar,\n MessageProps,\n Settings,\n} from '@patternfly/chatbot';\nimport ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';\nimport {\n Alert,\n AlertActionCloseButton,\n AlertGroup,\n AlertVariant,\n DropdownItem,\n MenuToggle,\n MenuToggleElement,\n Select,\n SelectList,\n SelectOption,\n Tab,\n Tabs,\n Title,\n Tooltip,\n type AlertProps,\n} from '@patternfly/react-core';\nimport {\n PlusIcon,\n SearchIcon,\n SortAmountDownAltIcon,\n SortAmountDownIcon,\n} from '@patternfly/react-icons';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport {\n supportedFileTypes,\n TEMP_CONVERSATION_ID,\n UNTITLED_NOTEBOOK_NAME,\n} from '../const';\nimport {\n useBackstageUserIdentity,\n useConversationMessages,\n useConversations,\n useIsMobile,\n useLastOpenedConversation,\n useLightspeedDeletePermission,\n useLightspeedNotebooksPermission,\n useNotebookSession,\n useNotebookSessions,\n usePinnedChatsSettings,\n useSortSettings,\n useStopConversation,\n} from '../hooks';\nimport { useCreateNotebook } from '../hooks/notebooks/useCreateNotebook';\nimport { useNotebookDocuments } from '../hooks/notebooks/useNotebookDocuments';\nimport { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext';\nimport { useLightspeedUpdatePermission } from '../hooks/useLightspeedUpdatePermission';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useWelcomePrompts } from '../hooks/useWelcomePrompts';\nimport { ConversationSummary, NotebookSession } from '../types';\nimport { getAttachments } from '../utils/attachment-utils';\nimport {\n getCategorizeMessages,\n getFootnoteProps,\n SortOption,\n} from '../utils/lightspeed-chatbox-utils';\nimport Attachment from './Attachment';\nimport { useFileAttachmentContext } from './AttachmentContext';\nimport { DeleteModal } from './DeleteModal';\nimport FilePreview from './FilePreview';\nimport { LightspeedChatBox } from './LightspeedChatBox';\nimport { LightspeedChatBoxHeader } from './LightspeedChatBoxHeader';\nimport { McpServersSettings } from './McpServersSettings';\nimport { DeleteNotebookModal } from './notebooks/DeleteNotebookModal';\nimport { NotebooksTab } from './notebooks/NotebooksTab';\nimport { NotebookView } from './notebooks/NotebookView';\nimport { RenameNotebookModal } from './notebooks/RenameNotebookModal';\nimport PermissionRequiredState from './PermissionRequiredState';\nimport { RenameConversationModal } from './RenameConversationModal';\n\nconst useStyles = makeStyles(theme => ({\n body: {\n // remove default margin and padding from common elements\n '& h1, & h2, & h3, & h4, & h5, & h6, & p, & ul, & ol, & li': {\n margin: 0,\n padding: 0,\n },\n },\n header: {\n padding: `${theme.spacing(3)}px ${theme.spacing(3)}px 0 ${theme.spacing(\n 3,\n )}px !important`,\n },\n errorContainer: {\n padding: theme.spacing(3),\n },\n drawerFileDropZone: {\n gap: 0,\n rowGap: 0,\n columnGap: 0,\n '--pf-v6-c-multiple-file-upload--Gap': '0',\n '--pf-v5-c-multiple-file-upload--Gap': '0',\n },\n headerMenu: {\n // align hamburger icon with title\n '& .pf-v6-c-button': {\n display: 'flex',\n alignItems: 'center',\n },\n },\n headerTitle: {\n justifyContent: 'left !important',\n },\n tabs: {\n padding: `${theme.spacing(2)}px ${theme.spacing(3)}px 0`,\n backgroundColor:\n 'var(--pf-t--global--background--color--floating--default)',\n '& .pf-v6-c-tabs__item, & .pf-v5-c-tabs__item': {\n backgroundColor: 'transparent',\n },\n '& .pf-v6-c-tabs__item:not(:last-child), & .pf-v5-c-tabs__item:not(:last-child)':\n {\n marginRight: theme.spacing(5),\n },\n '& .pf-v6-c-tabs__link, & .pf-v5-c-tabs__link': {\n backgroundColor: 'transparent',\n paddingBottom: theme.spacing(2),\n fontWeight: 700,\n cursor: 'pointer',\n },\n '& .pf-v6-c-tabs__item.pf-m-current .pf-v6-c-tabs__link, & .pf-v5-c-tabs__item.pf-m-current .pf-v5-c-tabs__link':\n {\n color: 'var(--pf-t--global--text--color--brand--default)',\n },\n },\n tabsDivider: {\n borderTop: '1px solid var(--pf-t--global--border--color--default)',\n },\n notebooksContainer: {\n padding: theme.spacing(3),\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n },\n notebooksHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(4),\n },\n notebooksHeading: {\n marginBottom: 0,\n },\n notebooksHeadingEmpty: {\n '&&': {\n marginBottom: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n },\n },\n notebooksEmptyState: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n },\n notebooksIcon: {\n fontSize: 48,\n color: 'var(--pf-t--global--icon--color--subtle)',\n marginBottom: theme.spacing(1.5),\n },\n notebooksDescription: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(3),\n maxWidth: 420,\n },\n notebooksAction: {\n textTransform: 'none',\n borderRadius: 999,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n },\n notebooksActionEmpty: {\n textTransform: 'none',\n borderRadius: 999,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n marginTop: theme.spacing(3),\n },\n notebooksGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',\n gap: theme.spacing(2),\n width: '100%',\n maxWidth: '100%',\n paddingBottom: theme.spacing(3),\n [theme.breakpoints.down('md')]: {\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n },\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: 'repeat(1, minmax(0, 1fr))',\n },\n },\n notebookCard: {\n borderRadius: theme.spacing(1.5),\n display: 'flex',\n flexDirection: 'column',\n '&:hover': {\n borderColor: 'var(--pf-t--global--border--color--hover)',\n borderWidth: '1px',\n borderStyle: 'solid',\n cursor: 'pointer',\n },\n },\n notebookCardHeader: {\n padding: theme.spacing(2),\n paddingBottom: 0,\n alignItems: 'center',\n },\n notebookCardDivider: {\n borderTop: '1px solid var(--pf-t--global--border--color--default)',\n marginTop: theme.spacing(1),\n },\n notebookCardBody: {\n padding: theme.spacing(2),\n paddingTop: theme.spacing(1.5),\n },\n notebookDocuments: {\n paddingTop: theme.spacing(1),\n paddingLeft: theme.spacing(2),\n },\n notebookUpdated: {\n paddingBottom: theme.spacing(5),\n paddingLeft: theme.spacing(2),\n paddingTop: theme.spacing(2),\n },\n notebookTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n flex: 1,\n },\n notebookCardHeaderActions: {\n marginLeft: theme.spacing(1),\n },\n notebookTitleText: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n notebookMenuButton: {\n color: theme.palette.text.secondary,\n },\n notebookDropdownList: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingInlineStart: 0,\n },\n notebookDropdownMenu: {\n '--pf-v6-c-menu--PaddingBlockStart': '0',\n '--pf-v6-c-menu--PaddingBlockEnd': '0',\n },\n notebookDropdownItem: {\n justifyContent: 'flex-start',\n textAlign: 'left',\n paddingLeft: theme.spacing(1.5),\n paddingRight: theme.spacing(1.5),\n },\n footer: {\n '&>.pf-chatbot__footer-container': {\n width: '95% !important',\n maxWidth: 'unset !important',\n },\n },\n sortDropdown: {\n padding: 0,\n margin: 0,\n },\n // Outer content wrapper (library may override overflow; we rely on inner scroll wrapper).\n chatbotContent: {\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n '& .pf-chatbot__jump': {\n left: '50% !important',\n right: 'auto !important',\n transform: 'translateX(-50%)',\n visibility: 'hidden',\n pointerEvents: 'none',\n },\n },\n chatbotContentHasOverflow: {\n '& .pf-chatbot__jump': {\n visibility: 'visible',\n pointerEvents: 'auto',\n },\n },\n // Inner scroll container we control: always scrollable so zoomed-in users see full content.\n chatbotContentScroll: {\n minHeight: 0,\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n },\n toastAlertGroup: {\n '--pf-v6-c-alert-group--m-toast--InsetInlineEnd': `${theme.spacing(2.5)}px`,\n '--pf-v6-c-alert-group--m-toast--InsetBlockStart': `${theme.spacing(2.5)}px`,\n '--pf-v6-c-alert-group--m-toast--MaxWidth': '350px',\n },\n toastAlert: {\n maxWidth: '350px',\n '& .pf-v6-c-alert__title': {\n margin: 0,\n },\n },\n // When present, pushes welcome content to bottom (zoom out). Scroll up to see important box (zoom in).\n chatbotContentSpacer: {\n flex: 1,\n minHeight: 0,\n },\n settingsFlat: {\n height: '100%',\n width: '100%',\n '&.pf-chatbot__settings-form-container': {\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n padding: 0,\n margin: 0,\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-form': {\n margin: 0,\n padding: 0,\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-form-row': {\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n border: 0,\n margin: 0,\n padding: 0,\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-label': {\n display: 'none',\n },\n },\n mcpFullscreenLayout: {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',\n minHeight: 0,\n height: '100%',\n flex: 1,\n width: '100%',\n minWidth: 0,\n overflow: 'hidden',\n },\n mcpChatPane: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n width: '100%',\n minWidth: 0,\n },\n mcpSettingsPane: {\n width: '100%',\n minWidth: 0,\n borderLeft: `1px solid ${theme.palette.divider}`,\n backgroundColor:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n },\n mcpCollapsedDrawerOrderFix: {\n '& .pf-v6-c-drawer.pf-m-panel-left > .pf-v6-c-drawer__main > .pf-v6-c-drawer__content, & .pf-v5-c-drawer.pf-m-panel-left > .pf-v5-c-drawer__main > .pf-v5-c-drawer__content':\n {\n order: 'unset',\n },\n '& .pf-v6-c-drawer:not(.pf-m-expanded) > .pf-v6-c-drawer__main > .pf-v6-c-drawer__panel, & .pf-v5-c-drawer:not(.pf-m-expanded) > .pf-v5-c-drawer__main > .pf-v5-c-drawer__panel':\n {\n visibility: 'hidden',\n opacity: 0,\n transition: 'none !important',\n },\n },\n}));\n\ntype LightspeedChatProps = {\n selectedModel: string;\n topicRestrictionEnabled: boolean;\n selectedProvider: string;\n userName?: string;\n avatar?: string;\n profileLoading: boolean;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n};\n\nexport const LightspeedChat = ({\n selectedModel,\n topicRestrictionEnabled,\n selectedProvider,\n userName,\n avatar,\n profileLoading,\n handleSelectedModel,\n models,\n}: LightspeedChatProps) => {\n const isMobile = useIsMobile();\n const classes = useStyles();\n const { t } = useTranslation();\n const navigate = useNavigate();\n const notebooksRouteMatch = useMatch('/lightspeed/notebooks');\n const notebookViewRouteMatch = useMatch('/lightspeed/notebooks/:notebookId');\n const routeNotebookId = notebookViewRouteMatch?.params?.notebookId;\n const user = useBackstageUserIdentity();\n const [filterValue, setFilterValue] = useState<string>('');\n const [announcement, setAnnouncement] = useState<string>('');\n const [activeTab, setActiveTab] = useState<number>(\n notebooksRouteMatch || notebookViewRouteMatch ? 1 : 0,\n );\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useLightspeedNotebooksPermission();\n const notebooksPermissionResolved =\n !notebooksPermissionLoading && hasNotebooksAccess;\n const { data: notebooks = [], refetch: refetchNotebooks } =\n useNotebookSessions(notebooksPermissionResolved);\n const hasNotebooks = notebooks.length > 0;\n const [openNotebookMenuId, setOpenNotebookMenuId] = useState<string | null>(\n null,\n );\n const [renameNotebookId, setRenameNotebookId] = useState<string | null>(null);\n const [deleteNotebookId, setDeleteNotebookId] = useState<string | null>(null);\n const [activeNotebook, setActiveNotebook] = useState<NotebookSession | null>(\n null,\n );\n const {\n data: routeNotebook,\n isLoading: routeNotebookLoading,\n isError: routeNotebookError,\n } = useNotebookSession(routeNotebookId);\n\n useEffect(() => {\n if (routeNotebookId && routeNotebook && !routeNotebookLoading) {\n setActiveNotebook(routeNotebook);\n } else if (routeNotebookId && routeNotebookError) {\n navigate('/lightspeed/notebooks', { replace: true });\n } else if (!routeNotebookId && notebooksRouteMatch) {\n setActiveNotebook(null);\n }\n }, [\n routeNotebookId,\n routeNotebook,\n routeNotebookLoading,\n routeNotebookError,\n notebooksRouteMatch,\n navigate,\n ]);\n\n const [notebookAlerts, setNotebookAlerts] = useState<Partial<AlertProps>[]>(\n [],\n );\n const createNotebookMutation = useCreateNotebook();\n const { data: notebookDocuments = [] } = useNotebookDocuments(\n activeNotebook?.session_id,\n );\n const [conversationId, setConversationId] = useState<string>('');\n const [requestId, setRequestId] = useState<string>('');\n const [newChatCreated, setNewChatCreated] = useState<boolean>(false);\n const [isSendButtonDisabled, setIsSendButtonDisabled] =\n useState<boolean>(false);\n const [targetConversationId, setTargetConversationId] = useState<string>('');\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [isSortSelectOpen, setIsSortSelectOpen] = useState<boolean>(false);\n const [isMcpSettingsOpen, setIsMcpSettingsOpen] = useState<boolean>(false);\n const [chatHeaderBgColor, setChatHeaderBgColor] = useState<string>();\n const contentScrollRef = useRef<HTMLDivElement>(null);\n const bottomSentinelRef = useRef<HTMLDivElement>(null);\n const [messageBarKey, setMessageBarKey] = useState(0);\n const [hasChatContentOverflow, setHasChatContentOverflow] = useState(false);\n const wasStoppedByUserRef = useRef(false);\n const { isReady, lastOpenedId, setLastOpenedId, clearLastOpenedId } =\n useLastOpenedConversation(user);\n const {\n displayMode,\n setDisplayMode,\n currentConversationId: routeConversationId,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n consumePendingOverlayThreadHandoff,\n } = useLightspeedDrawerContext();\n const isFullscreenMode = displayMode === ChatbotDisplayMode.embedded;\n const showChatPanel = !isFullscreenMode || activeTab === 0;\n const showNotebooksPanel = isFullscreenMode && activeTab !== 0;\n const [isChatHistoryDrawerOpen, setIsChatHistoryDrawerOpen] =\n useState<boolean>(!isMobile && isFullscreenMode);\n\n const handleNotebookTabSelect = (\n _event: React.MouseEvent<any>,\n tabIndex: number | string,\n ) => {\n const nextTab = Number(tabIndex);\n setActiveTab(nextTab);\n if (nextTab === 1) {\n navigate('/lightspeed/notebooks');\n if (notebooksPermissionResolved) {\n refetchNotebooks();\n }\n } else {\n navigate(\n routeConversationId\n ? `/lightspeed/conversation/${routeConversationId}`\n : '/lightspeed',\n );\n }\n };\n\n const handleCreateNotebook = useCallback(() => {\n createNotebookMutation.mutate(\n { name: UNTITLED_NOTEBOOK_NAME },\n {\n onSuccess: (session: NotebookSession) => {\n navigate(`/lightspeed/notebooks/${session.session_id}`);\n },\n },\n );\n }, [createNotebookMutation, navigate]);\n\n const handleCloseNotebook = useCallback(() => {\n navigate('/lightspeed/notebooks');\n refetchNotebooks();\n }, [navigate, refetchNotebooks]);\n\n const handleRemoveNotebookAlert = (key: React.Key) => {\n setNotebookAlerts(prevAlerts =>\n prevAlerts.filter(alert => alert.key !== key),\n );\n };\n\n const handleNotebookDeleted = () => {\n const key = Date.now();\n setNotebookAlerts(prevAlerts => [\n { title: t('notebooks.delete.toast'), variant: 'success', key },\n ...prevAlerts,\n ]);\n };\n // Open the chat history drawer when entering fullscreen mode on desktop\n useEffect(() => {\n if (!isMobile && isFullscreenMode) {\n setIsChatHistoryDrawerOpen(true);\n }\n }, [isMobile, isFullscreenMode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const headerElement = document.querySelector('.pf-chatbot__header');\n if (!headerElement) return;\n const computedBg = window.getComputedStyle(headerElement).backgroundColor;\n if (computedBg) {\n setChatHeaderBgColor(computedBg);\n }\n }, [displayMode, isMcpSettingsOpen]);\n\n const {\n isPinningChatsEnabled,\n pinnedChats,\n handlePinningChatsToggle,\n pinChat,\n unpinChat,\n } = usePinnedChatsSettings(user);\n\n const { selectedSort, handleSortChange } = useSortSettings(user);\n\n const {\n uploadError,\n showAlert,\n fileContents,\n setShowAlert,\n setFileContents,\n handleFileUpload,\n setUploadError,\n } = useFileAttachmentContext();\n\n // After leaving fullscreen for overlay/docked, provider signals a one-shot handoff so a\n // new LightspeedChat mount does not briefly apply stale lastOpened from storage.\n useLayoutEffect(() => {\n if (!isReady) return;\n\n if (isFullscreenMode) {\n return;\n }\n\n const handoff = consumePendingOverlayThreadHandoff?.() ?? false;\n if (handoff) {\n if (routeConversationId) {\n setConversationId(routeConversationId);\n setNewChatCreated(false);\n } else {\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n }\n return;\n }\n\n if (routeConversationId && routeConversationId !== conversationId) {\n setConversationId(routeConversationId);\n setNewChatCreated(false);\n } else if (\n !routeConversationId &&\n conversationId === '' &&\n lastOpenedId !== null\n ) {\n setConversationId(lastOpenedId);\n }\n }, [\n isReady,\n isFullscreenMode,\n routeConversationId,\n conversationId,\n lastOpenedId,\n consumePendingOverlayThreadHandoff,\n ]);\n\n // Sync conversationId with lastOpenedId — fullscreen only (overlay uses layout effect above).\n useEffect(() => {\n if (!isReady || !isFullscreenMode) {\n return;\n }\n if (lastOpenedId !== null) {\n setConversationId(lastOpenedId);\n }\n }, [lastOpenedId, isReady, isFullscreenMode]);\n\n const queryClient = useQueryClient();\n\n const {\n data: conversations = [],\n isLoading,\n isRefetching,\n } = useConversations();\n\n const { allowed: hasDeleteAccess } = useLightspeedDeletePermission();\n const { allowed: hasUpdateAccess } = useLightspeedUpdatePermission();\n const samplePrompts = useWelcomePrompts();\n useEffect(() => {\n if (!user || !isReady) return;\n const onOverlayLikeSurface = isFullscreenMode || !routeConversationId;\n const stillOnProvisionalThread =\n !conversationId || conversationId === TEMP_CONVERSATION_ID;\n\n if (lastOpenedId === null) {\n if (onOverlayLikeSurface && stillOnProvisionalThread) {\n setConversationId(TEMP_CONVERSATION_ID);\n }\n }\n // Only treat as blank \"new chat\" while there is no persisted thread id yet. Otherwise\n // after the first stream assigns a real conversationId, lastOpenedId can lag one frame\n // and this effect would flip newChatCreated back to true and hide the New chat button.\n if (lastOpenedId === TEMP_CONVERSATION_ID || lastOpenedId === null) {\n if (onOverlayLikeSurface && stillOnProvisionalThread) {\n setNewChatCreated(true);\n }\n }\n }, [\n user,\n isReady,\n lastOpenedId,\n setConversationId,\n isFullscreenMode,\n routeConversationId,\n conversationId,\n ]);\n\n useEffect(() => {\n // Clear last opened conversationId when there are no conversations.\n if (\n !isLoading &&\n !isRefetching &&\n conversations.length === 0 &&\n lastOpenedId\n ) {\n clearLastOpenedId();\n // Stale last-opened pointed at a missing thread; align with blank new chat so\n // provisional UI (e.g. hide New chat) matches storage.\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n setCurrentConversationId(undefined);\n }\n }, [\n isLoading,\n isRefetching,\n conversations,\n lastOpenedId,\n clearLastOpenedId,\n setCurrentConversationId,\n ]);\n\n useEffect(() => {\n if (\n !isLoading &&\n !isRefetching &&\n routeConversationId &&\n isFullscreenMode\n ) {\n const conversationExists = conversations.some(\n (c: ConversationSummary) => c.conversation_id === routeConversationId,\n );\n if (!conversationExists) {\n // New threads can be missing from the summaries list until refetch completes; if we\n // already show this id locally (e.g. streaming), do not reset to a new chat.\n if (routeConversationId !== conversationId) {\n // Conversation from route doesn't exist, start a new chat\n setConversationId(TEMP_CONVERSATION_ID);\n setCurrentConversationId(undefined);\n setNewChatCreated(true);\n }\n } else if (conversationId !== routeConversationId) {\n setConversationId(routeConversationId);\n }\n }\n }, [\n isLoading,\n isRefetching,\n routeConversationId,\n conversations,\n displayMode,\n conversationId,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n useEffect(() => {\n // Update last opened conversation whenever `conversationId` changes\n if (conversationId) {\n setLastOpenedId(conversationId);\n }\n }, [conversationId, setLastOpenedId]);\n\n const viewConversationId = useMemo(\n () =>\n !isFullscreenMode && routeConversationId\n ? routeConversationId\n : conversationId,\n [isFullscreenMode, routeConversationId, conversationId],\n );\n\n const onStart = (conv_id: string) => {\n setConversationId(conv_id);\n setCurrentConversationId(conv_id);\n };\n\n const onRequestIdReady = (request_id: string) => {\n setRequestId(request_id);\n };\n\n const onComplete = (message: string) => {\n setIsSendButtonDisabled(false);\n if (!wasStoppedByUserRef.current) {\n setAnnouncement(`Message from Bot: ${message}`);\n }\n wasStoppedByUserRef.current = false;\n queryClient.invalidateQueries({\n queryKey: ['conversations'],\n });\n queryClient.invalidateQueries({\n queryKey: ['conversationMessages', viewConversationId],\n });\n setNewChatCreated(false);\n };\n\n const {\n conversationMessages,\n handleInputPrompt,\n scrollToBottomRef,\n streamingConversationId,\n } = useConversationMessages(\n viewConversationId,\n userName,\n selectedModel,\n selectedProvider,\n avatar,\n onComplete,\n onStart,\n undefined,\n onRequestIdReady,\n );\n\n const streamingUiMatchesView =\n isSendButtonDisabled &&\n streamingConversationId !== null &&\n viewConversationId === streamingConversationId;\n\n const [messages, setMessages] =\n useState<MessageProps[]>(conversationMessages);\n\n const sendMessage = (message: string | number) => {\n if (!message.toString().trim()) return;\n\n wasStoppedByUserRef.current = false;\n if (viewConversationId !== TEMP_CONVERSATION_ID) {\n setNewChatCreated(false);\n }\n setAnnouncement(\n t('conversation.announcement.userMessage' as any, {\n prompt: message.toString(),\n }),\n );\n handleInputPrompt(message.toString(), getAttachments(fileContents));\n setIsSendButtonDisabled(true);\n setFileContents([]);\n setDraftMessage('');\n };\n\n const onNewChat = useCallback(() => {\n (async () => {\n setIsMcpSettingsOpen(false);\n if (conversationId !== TEMP_CONVERSATION_ID) {\n setMessages([]);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n setCurrentConversationId(undefined);\n if (!isFullscreenMode) {\n setIsChatHistoryDrawerOpen(false);\n }\n } else {\n // Already on new chat: reset so scroll/layout works (e.g. after opening new chat again from another convo then back).\n setMessages([]);\n setNewChatCreated(true);\n }\n })();\n }, [\n conversationId,\n setFileContents,\n setUploadError,\n setDraftMessage,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n const openDeleteModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsDeleteModalOpen(true);\n };\n\n const openChatRenameModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsRenameModalOpen(true);\n };\n\n const handleDeleteConversation = useCallback(() => {\n if (targetConversationId === lastOpenedId) {\n onNewChat();\n clearLastOpenedId();\n }\n setIsDeleteModalOpen(false);\n }, [clearLastOpenedId, lastOpenedId, onNewChat, targetConversationId]);\n\n const additionalMessageProps = useCallback(\n (conversationSummary: ConversationSummary) => {\n const isChatFavorite = pinnedChats?.find(\n c => c === conversationSummary.conversation_id,\n );\n return {\n menuItems: (\n <>\n <DropdownItem\n isDisabled={!hasUpdateAccess}\n onClick={() =>\n openChatRenameModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.rename')}\n </DropdownItem>\n {isPinningChatsEnabled && (\n <>\n {isChatFavorite ? (\n <DropdownItem\n onClick={() =>\n unpinChat(conversationSummary.conversation_id)\n }\n >\n {t('conversation.removeFromPinnedChats')}\n </DropdownItem>\n ) : (\n <DropdownItem\n onClick={() => pinChat(conversationSummary.conversation_id)}\n >\n {t('conversation.addToPinnedChats')}\n </DropdownItem>\n )}\n </>\n )}\n <DropdownItem\n isDisabled={!hasDeleteAccess}\n onClick={() =>\n openDeleteModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.delete')}\n </DropdownItem>\n </>\n ),\n };\n },\n [\n pinnedChats,\n hasDeleteAccess,\n isPinningChatsEnabled,\n hasUpdateAccess,\n t,\n pinChat,\n unpinChat,\n ],\n );\n\n const notebookConversationIds = useMemo(\n () =>\n new Set(\n notebooks\n .map(n => n.metadata?.conversation_id)\n .filter((id): id is string => !!id),\n ),\n [notebooks],\n );\n\n const chatOnlyConversations = useMemo(\n () =>\n conversations.filter(\n c => !notebookConversationIds.has(c.conversation_id),\n ),\n [conversations, notebookConversationIds],\n );\n\n const categorizedMessages = useMemo(\n () =>\n getCategorizeMessages(\n chatOnlyConversations,\n pinnedChats,\n additionalMessageProps,\n t,\n selectedSort,\n ),\n [\n additionalMessageProps,\n chatOnlyConversations,\n pinnedChats,\n t,\n selectedSort,\n ],\n );\n\n const filterConversations = useCallback(\n (targetValue: string) => {\n const pinnedChatsKey = t('conversation.category.pinnedChats') || 'Pinned';\n let isNoPinnedChatsSearchResults = false;\n let isNoRecentChatsSearchResults = false;\n const filteredConversations = Object.entries(categorizedMessages).reduce(\n (acc, [key, items]) => {\n const filteredItems = items.filter(item =>\n (item.text ?? '')\n .toLocaleLowerCase('en-US')\n .includes(targetValue.toLocaleLowerCase('en-US')),\n );\n const isPinnedCategory = key === pinnedChatsKey;\n if (isPinnedCategory && isPinningChatsEnabled) {\n if (filteredItems.length > 0) {\n acc[pinnedChatsKey] = filteredItems;\n } else {\n isNoPinnedChatsSearchResults =\n categorizedMessages[pinnedChatsKey].length > 0;\n acc[pinnedChatsKey] = [\n {\n id: isNoPinnedChatsSearchResults\n ? 'no-pinned-chats-search-results'\n : 'no-pinned-chats',\n text: isNoPinnedChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noPinnedChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n } else if (!isPinnedCategory) {\n if (filteredItems.length > 0) {\n acc[key] = filteredItems;\n } else {\n isNoRecentChatsSearchResults =\n categorizedMessages[key].length > 0;\n\n acc[key] = [\n {\n id: isNoRecentChatsSearchResults\n ? 'no-recent-chats-search-results'\n : 'no-recent-chats',\n text: isNoRecentChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noRecentChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n }\n return acc;\n },\n {} as any,\n );\n // If both sections had items but search filtered them all out, return empty object\n // so PatternFly's default empty state shows instead of custom empty state messages\n if (isNoPinnedChatsSearchResults && isNoRecentChatsSearchResults) {\n return {};\n }\n return filteredConversations;\n },\n [categorizedMessages, isPinningChatsEnabled, t],\n );\n\n useEffect(() => {\n setMessages(conversationMessages);\n }, [conversationMessages]);\n\n const onSelectActiveItem = useCallback(\n (_: MouseEvent | undefined, selectedItem: string | number | undefined) => {\n setIsMcpSettingsOpen(false);\n setNewChatCreated(false);\n const newConvId = String(selectedItem);\n setConversationId((c_id: string) => {\n if (c_id !== selectedItem) {\n return newConvId;\n }\n return c_id;\n });\n setCurrentConversationId(newConvId);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n scrollToBottomRef.current?.scrollToBottom();\n },\n [\n setConversationId,\n setUploadError,\n setFileContents,\n setDraftMessage,\n scrollToBottomRef,\n setCurrentConversationId,\n setIsMcpSettingsOpen,\n ],\n );\n\n const conversationFound = !!conversations.find(\n (c: ConversationSummary) => c.conversation_id === viewConversationId,\n );\n\n const getMaxPrompts = () => {\n if (isFullscreenMode) {\n return samplePrompts?.length; // In the Fullscreen mode, show all prompts\n }\n if (displayMode === ChatbotDisplayMode.docked) {\n return 2; // In the docked mode, show 2 prompts\n }\n return 1; // In the overlay mode, show 1 prompt\n };\n const maxPrompts = getMaxPrompts();\n\n const welcomePrompts =\n (newChatCreated && conversationMessages.length === 0) ||\n (!conversationFound && conversationMessages.length === 0)\n ? samplePrompts?.slice(0, maxPrompts).map(prompt => {\n const p = prompt as { title: string; message: string };\n return {\n title: p.title,\n message: p.message,\n onClick: () => {\n sendMessage(p.message);\n },\n };\n })\n : [];\n\n // Scroll to bottom when welcome content appears (sentinel + useLayoutEffect/RAF + ResizeObserver).\n useLayoutEffect(() => {\n if (welcomePrompts.length === 0) return undefined;\n const el = contentScrollRef.current;\n const sentinel = bottomSentinelRef.current;\n if (!el) return undefined;\n\n const scrollToBottom = () => {\n if (sentinel && typeof sentinel.scrollIntoView === 'function') {\n sentinel.scrollIntoView({ block: 'end', behavior: 'auto' });\n } else {\n el.scrollTop = el.scrollHeight;\n }\n };\n\n const rafId =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame(() => scrollToBottom())\n : null;\n if (rafId === null) scrollToBottom();\n const resizeObserver =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scrollToBottom())\n : undefined;\n resizeObserver?.observe(el);\n\n return () => {\n if (rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(rafId);\n }\n resizeObserver?.disconnect();\n };\n }, [welcomePrompts.length]);\n\n useEffect(() => {\n const scrollContainer = contentScrollRef.current;\n if (!scrollContainer) {\n setHasChatContentOverflow(false);\n return undefined;\n }\n\n const getMessageBox = () =>\n scrollContainer.querySelector(\n '.pf-chatbot__messagebox',\n ) as HTMLElement | null;\n\n const messageBoxOwnsScroll = (messageBox: HTMLElement | null) => {\n if (!messageBox || typeof window === 'undefined') {\n return false;\n }\n const overflowY = window.getComputedStyle(messageBox).overflowY;\n return (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n );\n };\n\n const getScrollTarget = () => {\n const messageBox = getMessageBox();\n return messageBoxOwnsScroll(messageBox) ? messageBox! : scrollContainer;\n };\n\n let observedScrollTarget: HTMLElement | null = getScrollTarget();\n let rafId: number | null = null;\n let updateScheduled = false;\n\n const updateOverflow = () => {\n const scrollTarget = observedScrollTarget ?? scrollContainer;\n setHasChatContentOverflow(\n scrollTarget.scrollHeight > scrollTarget.clientHeight + 1,\n );\n };\n\n const scheduleOverflowUpdate = () => {\n if (updateScheduled) {\n return;\n }\n updateScheduled = true;\n if (typeof requestAnimationFrame !== 'undefined') {\n rafId = requestAnimationFrame(() => {\n updateScheduled = false;\n updateOverflow();\n });\n } else {\n updateScheduled = false;\n updateOverflow();\n }\n };\n\n scheduleOverflowUpdate();\n\n // Use capture so scroll events from inner messagebox also trigger updates.\n scrollContainer.addEventListener('scroll', scheduleOverflowUpdate, {\n passive: true,\n capture: true,\n });\n\n const resizeObserver =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scheduleOverflowUpdate())\n : undefined;\n resizeObserver?.observe(scrollContainer);\n if (observedScrollTarget !== scrollContainer) {\n resizeObserver?.observe(observedScrollTarget);\n }\n\n const syncObservedScrollTarget = () => {\n const nextScrollTarget = getScrollTarget();\n if (nextScrollTarget === observedScrollTarget) {\n return;\n }\n if (observedScrollTarget && observedScrollTarget !== scrollContainer) {\n resizeObserver?.unobserve(observedScrollTarget);\n }\n if (nextScrollTarget !== scrollContainer) {\n resizeObserver?.observe(nextScrollTarget);\n }\n observedScrollTarget = nextScrollTarget;\n };\n\n const mutationObserver =\n typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n syncObservedScrollTarget();\n scheduleOverflowUpdate();\n })\n : undefined;\n mutationObserver?.observe(scrollContainer, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateOverflow);\n }\n\n return () => {\n if (rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(rafId);\n }\n scrollContainer.removeEventListener(\n 'scroll',\n scheduleOverflowUpdate,\n true,\n );\n if (observedScrollTarget && observedScrollTarget !== scrollContainer) {\n resizeObserver?.unobserve(observedScrollTarget);\n }\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateOverflow);\n }\n };\n }, [\n conversationId,\n displayMode,\n isMcpSettingsOpen,\n messages.length,\n welcomePrompts.length,\n ]);\n\n const handleFilter = useCallback((value: string) => {\n setFilterValue(value);\n }, []);\n\n const onChatHistoryDrawerToggle = useCallback(() => {\n setIsChatHistoryDrawerOpen(isOpen => !isOpen);\n }, []);\n\n const onSortToggle = useCallback(() => {\n setIsSortSelectOpen(prev => !prev);\n }, []);\n\n const onSortSelect = useCallback(\n (_event?: MouseEvent<Element>, value?: string | number) => {\n handleSortChange(value as SortOption);\n setIsSortSelectOpen(false);\n },\n [handleSortChange],\n );\n\n const getSortLabel = useCallback(\n (option: SortOption): string => {\n const labels: Record<SortOption, string> = {\n newest: t('sort.newest'),\n oldest: t('sort.oldest'),\n alphabeticalAsc: t('sort.alphabeticalAsc'),\n alphabeticalDesc: t('sort.alphabeticalDesc'),\n };\n return labels[option];\n },\n [t],\n );\n\n const sortToggle = useCallback(\n (toggleRef: Ref<MenuToggleElement>) => (\n <Tooltip content={`${t('sort.label')} - ${getSortLabel(selectedSort)}`}>\n <MenuToggle\n ref={toggleRef}\n aria-label={t('sort.label')}\n variant=\"plain\"\n onClick={onSortToggle}\n isExpanded={isSortSelectOpen}\n >\n {selectedSort === 'oldest' || selectedSort === 'alphabeticalDesc' ? (\n <SortAmountDownAltIcon />\n ) : (\n <SortAmountDownIcon />\n )}\n </MenuToggle>\n </Tooltip>\n ),\n [t, getSortLabel, selectedSort, onSortToggle, isSortSelectOpen],\n );\n\n const sortDropdown = useMemo(\n () => (\n <Select\n id=\"sort-select\"\n isOpen={isSortSelectOpen}\n selected={selectedSort}\n onSelect={onSortSelect}\n onOpenChange={(isOpen: boolean) => setIsSortSelectOpen(isOpen)}\n popperProps={{ position: 'end' }}\n toggle={sortToggle}\n shouldFocusToggleOnSelect\n >\n <SelectList className={classes.sortDropdown}>\n <SelectOption value=\"newest\">{t('sort.newest')}</SelectOption>\n <SelectOption value=\"oldest\">{t('sort.oldest')}</SelectOption>\n <SelectOption value=\"alphabeticalAsc\">\n {t('sort.alphabeticalAsc')}\n </SelectOption>\n <SelectOption value=\"alphabeticalDesc\">\n {t('sort.alphabeticalDesc')}\n </SelectOption>\n </SelectList>\n </Select>\n ),\n [\n isSortSelectOpen,\n selectedSort,\n onSortSelect,\n sortToggle,\n t,\n classes.sortDropdown,\n ],\n );\n\n const handleAttach = (data: File[], event: ReactDropzoneDropEvent) => {\n if (\n 'preventDefault' in event &&\n typeof event.preventDefault === 'function'\n ) {\n event.preventDefault();\n }\n handleFileUpload(data);\n };\n\n const { mutate: stopConversation } = useStopConversation();\n\n const handleStopButton = () => {\n wasStoppedByUserRef.current = true;\n if (requestId) {\n stopConversation(requestId);\n setRequestId('');\n }\n setIsSendButtonDisabled(false);\n setAnnouncement(t('conversation.announcement.responseStopped'));\n const lastUserMessage = [...conversationMessages]\n .reverse()\n .find((m: { role?: string }) => m.role === 'user');\n const restoredPrompt = (lastUserMessage?.content as string) ?? '';\n setDraftMessage(restoredPrompt.trim());\n if (restoredPrompt) setMessageBarKey(k => k + 1);\n setFileContents([]);\n setUploadError({ message: null });\n };\n\n const handleDraftMessage = (\n _e: ChangeEvent<HTMLTextAreaElement>,\n value: string | number,\n ) => setDraftMessage(value as any);\n\n const onAttachRejected = (data: FileRejection[]) => {\n data.forEach(attachment => {\n const hasInvalidTypeError = attachment.errors.some(\n (e: { code: string }) => e.code === 'file-invalid-type',\n );\n if (hasInvalidTypeError) {\n setShowAlert(true);\n setUploadError({\n message: t('file.upload.error.unsupportedType'),\n });\n }\n });\n };\n\n const chatMainContent = (\n <>\n <ChatbotContent\n className={`${classes.chatbotContent} ${\n hasChatContentOverflow ? classes.chatbotContentHasOverflow : ''\n }`}\n >\n <div ref={contentScrollRef} className={classes.chatbotContentScroll}>\n {welcomePrompts.length > 0 && (\n <div className={classes.chatbotContentSpacer} aria-hidden />\n )}\n <LightspeedChatBox\n userName={userName}\n messages={messages}\n profileLoading={profileLoading}\n announcement={announcement}\n ref={scrollToBottomRef}\n welcomePrompts={welcomePrompts}\n conversationId={conversationId}\n isStreaming={streamingUiMatchesView}\n topicRestrictionEnabled={topicRestrictionEnabled}\n displayMode={displayMode}\n />\n {welcomePrompts.length > 0 && (\n <div\n ref={bottomSentinelRef}\n aria-hidden\n style={{ height: 0, flexShrink: 0 }}\n />\n )}\n </div>\n </ChatbotContent>\n <ChatbotFooter className={classes.footer}>\n <FilePreview />\n <MessageBar\n key={messageBarKey}\n onSendMessage={sendMessage}\n isSendButtonDisabled={isSendButtonDisabled}\n hasAttachButton\n handleAttach={handleAttach}\n hasMicrophoneButton\n value={draftMessage}\n onChange={handleDraftMessage}\n hasStopButton={streamingUiMatchesView}\n handleStopButton={\n streamingUiMatchesView ? handleStopButton : undefined\n }\n buttonProps={{\n attach: {\n inputTestId: 'attachment-input',\n tooltipContent: t('tooltip.attach'),\n },\n microphone: {\n tooltipContent: {\n active: t('tooltip.microphone.active'),\n inactive: t('tooltip.microphone.inactive'),\n },\n },\n send: {\n tooltipContent: t('tooltip.send'),\n },\n }}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n placeholder={t('chatbox.message.placeholder')}\n />\n <ChatbotFootnote {...getFootnoteProps(t)} />\n </ChatbotFooter>\n </>\n );\n\n const mcpSettingsPanel = (\n <McpServersSettings\n onClose={() => setIsMcpSettingsOpen(false)}\n backgroundColor={chatHeaderBgColor}\n />\n );\n\n const mainPanelContent = (() => {\n if (!isMcpSettingsOpen) {\n return <>{chatMainContent}</>;\n }\n\n if (isFullscreenMode) {\n return (\n <div className={classes.mcpFullscreenLayout}>\n <div className={classes.mcpChatPane}>{chatMainContent}</div>\n <div className={classes.mcpSettingsPane}>{mcpSettingsPanel}</div>\n </div>\n );\n }\n\n return (\n <Settings\n className={classes.settingsFlat}\n fields={[\n {\n id: 'mcp-servers-settings',\n label: '',\n field: mcpSettingsPanel,\n },\n ]}\n />\n );\n })();\n\n let drawerPanelStyle: { [key: string]: string | number } | undefined;\n if (!isFullscreenMode) {\n drawerPanelStyle = { zIndex: 1300 };\n } else if (isMcpSettingsOpen) {\n drawerPanelStyle = { width: 320, minWidth: 320, maxWidth: 320 };\n }\n\n return (\n <>\n {notebookAlerts.length > 0 && (\n <AlertGroup\n hasAnimations\n isToast\n isLiveRegion\n className={classes.toastAlertGroup}\n >\n {notebookAlerts.map(({ key, title, variant }) => (\n <Alert\n key={key}\n variant={AlertVariant[variant ?? 'success']}\n title={title}\n className={classes.toastAlert}\n timeout={2000}\n onTimeout={() => handleRemoveNotebookAlert(key as React.Key)}\n actionClose={\n <AlertActionCloseButton\n title={title as string}\n variantLabel={`${variant ?? 'success'} alert`}\n onClose={() => handleRemoveNotebookAlert(key as React.Key)}\n />\n }\n />\n ))}\n </AlertGroup>\n )}\n {isDeleteModalOpen && (\n <DeleteModal\n isOpen={isDeleteModalOpen}\n conversationId={targetConversationId}\n onClose={() => setIsDeleteModalOpen(false)}\n onConfirm={handleDeleteConversation}\n />\n )}\n {isRenameModalOpen && (\n <RenameConversationModal\n isOpen={isRenameModalOpen}\n onClose={() => setIsRenameModalOpen(false)}\n conversationId={targetConversationId}\n />\n )}\n {renameNotebookId && (\n <RenameNotebookModal\n isOpen={Boolean(renameNotebookId)}\n onClose={() => setRenameNotebookId(null)}\n sessionId={renameNotebookId}\n currentName={\n notebooks.find(n => n.session_id === renameNotebookId)?.name ?? ''\n }\n />\n )}\n {deleteNotebookId && (\n <DeleteNotebookModal\n isOpen={Boolean(deleteNotebookId)}\n onClose={() => setDeleteNotebookId(null)}\n onDeleted={handleNotebookDeleted}\n sessionId={deleteNotebookId}\n name={\n notebooks.find(n => n.session_id === deleteNotebookId)?.name ?? ''\n }\n />\n )}\n <Chatbot\n displayMode={ChatbotDisplayMode.embedded}\n className={`${classes.body} ${\n isMcpSettingsOpen && !isChatHistoryDrawerOpen\n ? classes.mcpCollapsedDrawerOrderFix\n : ''\n }`}\n >\n <ChatbotHeader className={classes.header}>\n <ChatbotHeaderMain>\n <ChatbotHeaderMenu\n aria-expanded={isChatHistoryDrawerOpen}\n onMenuToggle={onChatHistoryDrawerToggle}\n className={classes.headerMenu}\n tooltipContent={t('tooltip.chatHistoryMenu')}\n aria-label={t('aria.chatHistoryMenu')}\n />\n {isFullscreenMode && (\n <ChatbotHeaderTitle className={classes.headerTitle}>\n <Title headingLevel=\"h1\" size=\"3xl\">\n {t('chatbox.header.title')}\n </Title>\n </ChatbotHeaderTitle>\n )}\n </ChatbotHeaderMain>\n\n <LightspeedChatBoxHeader\n selectedModel={selectedModel}\n handleSelectedModel={item => {\n setIsMcpSettingsOpen(false);\n onNewChat();\n handleSelectedModel(item);\n }}\n models={models}\n isPinningChatsEnabled={isPinningChatsEnabled}\n isModelSelectorDisabled={isSendButtonDisabled}\n hideModelSelector={showNotebooksPanel}\n setDisplayMode={setDisplayMode}\n displayMode={displayMode}\n onPinnedChatsToggle={handlePinningChatsToggle}\n onMcpSettingsClick={() => setIsMcpSettingsOpen(true)}\n />\n </ChatbotHeader>\n {isFullscreenMode && (\n <>\n <Tabs\n activeKey={activeTab}\n onSelect={handleNotebookTabSelect}\n aria-label={t('tabs.ariaLabel')}\n className={classes.tabs}\n >\n <Tab eventKey={0} title={t('tabs.chat')} />\n <Tab eventKey={1} title={t('tabs.notebooks')} />\n </Tabs>\n <div className={classes.tabsDivider} />\n </>\n )}\n {showChatPanel && (\n <ChatbotConversationHistoryNav\n drawerPanelContentProps={{\n isResizable: isFullscreenMode,\n hasNoBorder: !isFullscreenMode,\n style: drawerPanelStyle,\n }}\n reverseButtonOrder\n displayMode={ChatbotDisplayMode.embedded}\n onDrawerToggle={onChatHistoryDrawerToggle}\n title=\"\"\n navTitleIcon={null}\n isDrawerOpen={isChatHistoryDrawerOpen}\n drawerCloseButtonProps={{\n 'aria-label': t('aria.closeDrawerPanel'),\n }}\n setIsDrawerOpen={setIsChatHistoryDrawerOpen}\n activeItemId={viewConversationId}\n onSelectActiveItem={onSelectActiveItem}\n conversations={filterConversations(filterValue)}\n onNewChat={newChatCreated ? undefined : onNewChat}\n newChatButtonText={t('button.newChat')}\n newChatButtonProps={{\n icon: <PlusIcon />,\n }}\n handleTextInputChange={handleFilter}\n searchInputPlaceholder={t('chatbox.search.placeholder')}\n searchInputAriaLabel={t('aria.search.placeholder')}\n searchInputProps={{\n value: filterValue,\n onClear: () => {\n setFilterValue('');\n },\n }}\n searchActionEnd={sortDropdown}\n noResultsState={\n filterValue &&\n Object.keys(filterConversations(filterValue)).length === 0\n ? {\n bodyText: t('chatbox.emptyState.noResults.body'),\n titleText: t('chatbox.emptyState.noResults.title'),\n icon: SearchIcon,\n }\n : undefined\n }\n drawerContent={\n <FileDropZone\n className={classes.drawerFileDropZone}\n onFileDrop={(e, data) => handleAttach(data, e)}\n displayMode={ChatbotDisplayMode.embedded}\n infoText={t('chatbox.fileUpload.infoText')}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n >\n {showAlert && uploadError.message && (\n <div className={classes.errorContainer}>\n <ChatbotAlert\n component=\"h4\"\n title={t('chatbox.fileUpload.failed')}\n variant={uploadError.type ?? 'danger'}\n isInline\n onClose={() => setUploadError({ message: null })}\n >\n {uploadError.message}\n </ChatbotAlert>\n </div>\n )}\n {mainPanelContent}\n </FileDropZone>\n }\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n hasNotebooksAccess &&\n activeNotebook && (\n <NotebookView\n sessionId={activeNotebook.session_id}\n notebookName={activeNotebook.name}\n documents={notebookDocuments}\n metadata={activeNotebook.metadata}\n topicSummary={\n conversations.find(\n c =>\n c.conversation_id ===\n activeNotebook.metadata?.conversation_id,\n )?.topic_summary ?? undefined\n }\n userName={userName}\n avatar={avatar}\n profileLoading={profileLoading}\n topicRestrictionEnabled={topicRestrictionEnabled}\n selectedModel={selectedModel}\n onClose={handleCloseNotebook}\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n hasNotebooksAccess &&\n !activeNotebook && (\n <NotebooksTab\n notebooks={notebooks}\n hasNotebooks={hasNotebooks}\n classes={classes}\n openNotebookMenuId={openNotebookMenuId}\n setOpenNotebookMenuId={setOpenNotebookMenuId}\n onSelectNotebook={(notebook: NotebookSession) =>\n navigate(`/lightspeed/notebooks/${notebook.session_id}`)\n }\n onRename={setRenameNotebookId}\n onDelete={setDeleteNotebookId}\n onCreateNotebook={handleCreateNotebook}\n t={t}\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n !hasNotebooksAccess && (\n <PermissionRequiredState\n subject={t('permission.subject.notebooks')}\n permissions={['lightspeed.notebooks.use']}\n action={\n <Button\n variant=\"outlined\"\n color=\"primary\"\n style={{ borderRadius: '20px' }}\n onClick={() => setActiveTab(0)}\n >\n {t('permission.notebooks.goBack')}\n </Button>\n }\n />\n )}\n </Chatbot>\n <Attachment />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0HA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,IAAA,EAAM;AAAA;AAAA,IAEJ,2DAAA,EAA6D;AAAA,MAC3D,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAA;AAAA,MAC9D;AAAA,KACD,CAAA,aAAA;AAAA,GACH;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC1B;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,GAAA,EAAK,CAAA;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,qCAAA,EAAuC,GAAA;AAAA,IACvC,qCAAA,EAAuC;AAAA,GACzC;AAAA,EACA,UAAA,EAAY;AAAA;AAAA,IAEV,mBAAA,EAAqB;AAAA,MACnB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA,WAAA,EAAa;AAAA,IACX,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA;AAAA,IAClD,eAAA,EACE,2DAAA;AAAA,IACF,8CAAA,EAAgD;AAAA,MAC9C,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,gFAAA,EACE;AAAA,MACE,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC9B;AAAA,IACF,8CAAA,EAAgD;AAAA,MAC9C,eAAA,EAAiB,aAAA;AAAA,MACjB,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC9B,UAAA,EAAY,GAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,gHAAA,EACE;AAAA,MACE,KAAA,EAAO;AAAA;AACT,GACJ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,IAAA,EAAM,CAAA;AAAA,IACN,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC/B;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC7B,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAChC,GACF;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,aAAA,EAAe;AAAA,IACb,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,0CAAA;AAAA,IACP,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA,GACjC;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC7B,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,aAAA,EAAe,MAAA;AAAA,IACf,YAAA,EAAc,GAAA;AAAA,IACd,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC/B;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,aAAA,EAAe,MAAA;AAAA,IACf,YAAA,EAAc,GAAA;AAAA,IACd,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC7B,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC5B;AAAA,EACA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,mBAAA,EAAqB,2BAAA;AAAA,IACrB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,MAAA;AAAA,IACV,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC9B,CAAC,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,GAAG;AAAA,MAC9B,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,CAAC,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,GAAG;AAAA,MAC9B,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW;AAAA,MACT,WAAA,EAAa,2CAAA;AAAA,MACb,WAAA,EAAa,KAAA;AAAA,MACb,WAAA,EAAa,OAAA;AAAA,MACb,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,SAAA,EAAW,uDAAA;AAAA,IACX,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC5B;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA,GAC/B;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC3B,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC9B;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC9B,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC7B;AAAA,EACA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,QAAA,EAAU,CAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC7B;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,QAAA,EAAU,QAAA;AAAA,IACV,YAAA,EAAc,UAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,GAC5B;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,UAAA,EAAY,CAAA;AAAA,IACZ,aAAA,EAAe,CAAA;AAAA,IACf,kBAAA,EAAoB;AAAA,GACtB;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,mCAAA,EAAqC,GAAA;AAAA,IACrC,iCAAA,EAAmC;AAAA,GACrC;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,cAAA,EAAgB,YAAA;AAAA,IAChB,SAAA,EAAW,MAAA;AAAA,IACX,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC9B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA,GACjC;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,iCAAA,EAAmC;AAAA,MACjC,KAAA,EAAO,gBAAA;AAAA,MACP,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,SAAA,EAAW,CAAA;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,IAAA,EAAM,CAAA;AAAA,IACN,qBAAA,EAAuB;AAAA,MACrB,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,SAAA,EAAW,kBAAA;AAAA,MACX,UAAA,EAAY,QAAA;AAAA,MACZ,aAAA,EAAe;AAAA;AACjB,GACF;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,qBAAA,EAAuB;AAAA,MACrB,UAAA,EAAY,SAAA;AAAA,MACZ,aAAA,EAAe;AAAA;AACjB,GACF;AAAA;AAAA,EAEA,oBAAA,EAAsB;AAAA,IACpB,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,MAAA;AAAA,IACX,uBAAA,EAAyB;AAAA,GAC3B;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,gDAAA,EAAkD,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACvE,iDAAA,EAAmD,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACxE,0CAAA,EAA4C;AAAA,GAC9C;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,yBAAA,EAA2B;AAAA,MACzB,MAAA,EAAQ;AAAA;AACV,GACF;AAAA;AAAA,EAEA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,CAAA;AAAA,IACN,SAAA,EAAW;AAAA,GACb;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,uCAAA,EAAyC;AAAA,MACvC,UAAA,EACE,iGAAA;AAAA,MACF,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ,CAAA;AAAA,MACR,SAAA,EAAW,MAAA;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,8BAAA,EAAgC;AAAA,MAC9B,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EACE,iGAAA;AAAA,MACF,SAAA,EAAW,MAAA;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,kCAAA,EAAoC;AAAA,MAClC,UAAA,EACE,iGAAA;AAAA,MACF,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,MAAA;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,+BAAA,EAAiC;AAAA,MAC/B,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,OAAA,EAAS,MAAA;AAAA,IACT,mBAAA,EAAqB,+BAAA;AAAA,IACrB,SAAA,EAAW,CAAA;AAAA,IACX,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,CAAA;AAAA,IACX,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,IAC9C,eAAA,EACE,iGAAA;AAAA,IACF,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW;AAAA,GACb;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,4KAAA,EACE;AAAA,MACE,KAAA,EAAO;AAAA,KACT;AAAA,IACF,gLAAA,EACE;AAAA,MACE,UAAA,EAAY,QAAA;AAAA,MACZ,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY;AAAA;AACd;AAEN,CAAA,CAAE,CAAA;AAaK,MAAM,iBAAiB,CAAC;AAAA,EAC7B,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,mBAAA,GAAsB,SAAS,uBAAuB,CAAA;AAC5D,EAAA,MAAM,sBAAA,GAAyB,SAAS,mCAAmC,CAAA;AAC3E,EAAA,MAAM,eAAA,GAAkB,wBAAwB,MAAA,EAAQ,UAAA;AACxD,EAAA,MAAM,OAAO,wBAAA,EAAyB;AACtC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAiB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAiB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA;AAAA,IAChC,mBAAA,IAAuB,yBAAyB,CAAA,GAAI;AAAA,GACtD;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,kBAAA,EAAoB,OAAA,EAAS,0BAAA,KAC5C,gCAAA,EAAiC;AACnC,EAAA,MAAM,2BAAA,GACJ,CAAC,0BAAA,IAA8B,kBAAA;AACjC,EAAA,MAAM,EAAE,MAAM,SAAA,GAAY,IAAI,OAAA,EAAS,gBAAA,EAAiB,GACtD,mBAAA,CAAoB,2BAA2B,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,UAAU,MAAA,GAAS,CAAA;AACxC,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,QAAA;AAAA,IAClD;AAAA,GACF;AACA,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,SAAA,EAAW,oBAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX,GAAI,mBAAmB,eAAe,CAAA;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,eAAA,IAAmB,aAAA,IAAiB,CAAC,oBAAA,EAAsB;AAC7D,MAAA,iBAAA,CAAkB,aAAa,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,mBAAmB,kBAAA,EAAoB;AAChD,MAAA,QAAA,CAAS,uBAAA,EAAyB,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,CAAC,eAAA,IAAmB,mBAAA,EAAqB;AAClD,MAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG;AAAA,IACD,eAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA;AAAA,IAC1C;AAAC,GACH;AACA,EAAA,MAAM,yBAAyB,iBAAA,EAAkB;AACjD,EAAA,MAAM,EAAE,IAAA,EAAM,iBAAA,GAAoB,IAAG,GAAI,oBAAA;AAAA,IACvC,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAiB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAiB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAkB,KAAK,CAAA;AACnE,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAClD,SAAkB,KAAK,CAAA;AACzB,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAI,SAAiB,EAAE,CAAA;AAC3E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAkB,KAAK,CAAA;AACzE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAkB,KAAK,CAAA;AACzE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAkB,KAAK,CAAA;AACvE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAkB,KAAK,CAAA;AACzE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,QAAA,EAAiB;AACnE,EAAA,MAAM,gBAAA,GAAmB,OAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,iBAAA,GAAoB,OAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1E,EAAA,MAAM,mBAAA,GAAsB,OAAO,KAAK,CAAA;AACxC,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,iBAAiB,iBAAA,EAAkB,GAChE,0BAA0B,IAAI,CAAA;AAChC,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA,EAAuB,mBAAA;AAAA,IACvB,wBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,MACE,0BAAA,EAA2B;AAC/B,EAAA,MAAM,gBAAA,GAAmB,gBAAgB,kBAAA,CAAmB,QAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,CAAC,gBAAA,IAAoB,SAAA,KAAc,CAAA;AACzD,EAAA,MAAM,kBAAA,GAAqB,oBAAoB,SAAA,KAAc,CAAA;AAC7D,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,IACxD,QAAA,CAAkB,CAAC,YAAY,gBAAgB,CAAA;AAEjD,EAAA,MAAM,uBAAA,GAA0B,CAC9B,MAAA,EACA,QAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,OAAO,QAAQ,CAAA;AAC/B,IAAA,YAAA,CAAa,OAAO,CAAA;AACpB,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA,IAAI,2BAAA,EAA6B;AAC/B,QAAA,gBAAA,EAAiB;AAAA,MACnB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA;AAAA,QACE,mBAAA,GACI,CAAA,yBAAA,EAA4B,mBAAmB,CAAA,CAAA,GAC/C;AAAA,OACN;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,sBAAA,CAAuB,MAAA;AAAA,MACrB,EAAE,MAAM,sBAAA,EAAuB;AAAA,MAC/B;AAAA,QACE,SAAA,EAAW,CAAC,OAAA,KAA6B;AACvC,UAAA,QAAA,CAAS,CAAA,sBAAA,EAAyB,OAAA,CAAQ,UAAU,CAAA,CAAE,CAAA;AAAA,QACxD;AAAA;AACF,KACF;AAAA,EACF,CAAA,EAAG,CAAC,sBAAA,EAAwB,QAAQ,CAAC,CAAA;AAErC,EAAA,MAAM,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,IAAA,gBAAA,EAAiB;AAAA,EACnB,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAE/B,EAAA,MAAM,yBAAA,GAA4B,CAAC,GAAA,KAAmB;AACpD,IAAA,iBAAA;AAAA,MAAkB,gBAChB,UAAA,CAAW,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,GAAG;AAAA,KAC9C;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,iBAAA,CAAkB,CAAA,UAAA,KAAc;AAAA,MAC9B,EAAE,KAAA,EAAO,CAAA,CAAE,wBAAwB,CAAA,EAAG,OAAA,EAAS,WAAW,GAAA,EAAI;AAAA,MAC9D,GAAG;AAAA,KACJ,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,gBAAA,EAAkB;AACjC,MAAA,0BAAA,CAA2B,IAAI,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,qBAAqB,CAAA;AAClE,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,gBAAA,CAAiB,aAAa,CAAA,CAAE,eAAA;AAC1D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,oBAAA,CAAqB,UAAU,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAEnC,EAAA,MAAM;AAAA,IACJ,qBAAA;AAAA,IACA,WAAA;AAAA,IACA,wBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,uBAAuB,IAAI,CAAA;AAE/B,EAAA,MAAM,EAAE,YAAA,EAAc,gBAAA,EAAiB,GAAI,gBAAgB,IAAI,CAAA;AAE/D,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,MACE,wBAAA,EAAyB;AAI7B,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,sCAAqC,IAAK,KAAA;AAC1D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,iBAAA,CAAkB,mBAAmB,CAAA;AACrC,QAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,oBAAoB,CAAA;AACtC,QAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,mBAAA,IAAuB,wBAAwB,cAAA,EAAgB;AACjE,MAAA,iBAAA,CAAkB,mBAAmB,CAAA;AACrC,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB,WACE,CAAC,mBAAA,IACD,cAAA,KAAmB,EAAA,IACnB,iBAAiB,IAAA,EACjB;AACA,MAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,gBAAA,EAAkB;AACjC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAE5C,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,gBAAgB,EAAC;AAAA,IACvB,SAAA;AAAA,IACA;AAAA,MACE,gBAAA,EAAiB;AAErB,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,EAAgB,GAAI,6BAAA,EAA8B;AACnE,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,EAAgB,GAAI,6BAAA,EAA8B;AACnE,EAAA,MAAM,gBAAgB,iBAAA,EAAkB;AACxC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS;AACvB,IAAA,MAAM,oBAAA,GAAuB,oBAAoB,CAAC,mBAAA;AAClD,IAAA,MAAM,wBAAA,GACJ,CAAC,cAAA,IAAkB,cAAA,KAAmB,oBAAA;AAExC,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,IAAI,wBAAwB,wBAAA,EAA0B;AACpD,QAAA,iBAAA,CAAkB,oBAAoB,CAAA;AAAA,MACxC;AAAA,IACF;AAIA,IAAA,IAAI,YAAA,KAAiB,oBAAA,IAAwB,YAAA,KAAiB,IAAA,EAAM;AAClE,MAAA,IAAI,wBAAwB,wBAAA,EAA0B;AACpD,QAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,IACE,CAAC,SAAA,IACD,CAAC,gBACD,aAAA,CAAc,MAAA,KAAW,KACzB,YAAA,EACA;AACA,MAAA,iBAAA,EAAkB;AAGlB,MAAA,iBAAA,CAAkB,oBAAoB,CAAA;AACtC,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,wBAAA,CAAyB,MAAS,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IACE,CAAC,SAAA,IACD,CAAC,YAAA,IACD,uBACA,gBAAA,EACA;AACA,MAAA,MAAM,qBAAqB,aAAA,CAAc,IAAA;AAAA,QACvC,CAAC,CAAA,KAA2B,CAAA,CAAE,eAAA,KAAoB;AAAA,OACpD;AACA,MAAA,IAAI,CAAC,kBAAA,EAAoB;AAGvB,QAAA,IAAI,wBAAwB,cAAA,EAAgB;AAE1C,UAAA,iBAAA,CAAkB,oBAAoB,CAAA;AACtC,UAAA,wBAAA,CAAyB,MAAS,CAAA;AAClC,UAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,QACxB;AAAA,MACF,CAAA,MAAA,IAAW,mBAAmB,mBAAA,EAAqB;AACjD,QAAA,iBAAA,CAAkB,mBAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,eAAA,CAAgB,cAAc,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,eAAe,CAAC,CAAA;AAEpC,EAAA,MAAM,kBAAA,GAAqB,OAAA;AAAA,IACzB,MACE,CAAC,gBAAA,IAAoB,mBAAA,GACjB,mBAAA,GACA,cAAA;AAAA,IACN,CAAC,gBAAA,EAAkB,mBAAA,EAAqB,cAAc;AAAA,GACxD;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAAoB;AACnC,IAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,KAAuB;AAC/C,IAAA,YAAA,CAAa,UAAU,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AACtC,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,oBAAoB,OAAA,EAAS;AAChC,MAAA,eAAA,CAAgB,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,IAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,MAC5B,QAAA,EAAU,CAAC,eAAe;AAAA,KAC3B,CAAA;AACD,IAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,MAC5B,QAAA,EAAU,CAAC,sBAAA,EAAwB,kBAAkB;AAAA,KACtD,CAAA;AACD,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM;AAAA,IACJ,oBAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF,GAAI,uBAAA;AAAA,IACF,kBAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,sBAAA,GACJ,oBAAA,IACA,uBAAA,KAA4B,IAAA,IAC5B,kBAAA,KAAuB,uBAAA;AAEzB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAC1B,SAAyB,oBAAoB,CAAA;AAE/C,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAA6B;AAChD,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,EAAS,CAAE,MAAK,EAAG;AAEhC,IAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,IAAA,IAAI,uBAAuB,oBAAA,EAAsB;AAC/C,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AACA,IAAA,eAAA;AAAA,MACE,EAAE,uCAAA,EAAgD;AAAA,QAChD,MAAA,EAAQ,QAAQ,QAAA;AAAS,OAC1B;AAAA,KACH;AACA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,QAAA,EAAS,EAAG,cAAA,CAAe,YAAY,CAAC,CAAA;AAClE,IAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,CAAC,YAAY;AACX,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,IAAI,mBAAmB,oBAAA,EAAsB;AAC3C,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,QAAA,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAChC,QAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,QAAA,iBAAA,CAAkB,oBAAoB,CAAA;AACtC,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,wBAAA,CAAyB,MAAS,CAAA;AAClC,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,0BAAA,CAA2B,KAAK,CAAA;AAAA,QAClC;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,MACxB;AAAA,IACF,CAAA,GAAG;AAAA,EACL,CAAA,EAAG;AAAA,IACD,cAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,CAAC,eAAA,KAA4B;AACnD,IAAA,uBAAA,CAAwB,eAAe,CAAA;AACvC,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,eAAA,KAA4B;AACvD,IAAA,uBAAA,CAAwB,eAAe,CAAA;AACvC,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,YAAY,MAAM;AACjD,IAAA,IAAI,yBAAyB,YAAA,EAAc;AACzC,MAAA,SAAA,EAAU;AACV,MAAA,iBAAA,EAAkB;AAAA,IACpB;AACA,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,EAC5B,GAAG,CAAC,iBAAA,EAAmB,YAAA,EAAc,SAAA,EAAW,oBAAoB,CAAC,CAAA;AAErE,EAAA,MAAM,sBAAA,GAAyB,WAAA;AAAA,IAC7B,CAAC,mBAAA,KAA6C;AAC5C,MAAA,MAAM,iBAAiB,WAAA,EAAa,IAAA;AAAA,QAClC,CAAA,CAAA,KAAK,MAAM,mBAAA,CAAoB;AAAA,OACjC;AACA,MAAA,OAAO;AAAA,QACL,2BACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,YAAY,CAAC,eAAA;AAAA,cACb,OAAA,EAAS,MACP,mBAAA,CAAoB,mBAAA,CAAoB,eAAe,CAAA;AAAA,cAGxD,YAAE,qBAAqB;AAAA;AAAA,WAC1B;AAAA,UACC,qBAAA,oCAEI,QAAA,EAAA,cAAA,mBACC,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MACP,SAAA,CAAU,mBAAA,CAAoB,eAAe,CAAA;AAAA,cAG9C,YAAE,oCAAoC;AAAA;AAAA,WACzC,mBAEA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,OAAA,CAAQ,mBAAA,CAAoB,eAAe,CAAA;AAAA,cAEzD,YAAE,+BAA+B;AAAA;AAAA,WACpC,EAEJ,CAAA;AAAA,0BAEF,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,YAAY,CAAC,eAAA;AAAA,cACb,OAAA,EAAS,MACP,eAAA,CAAgB,mBAAA,CAAoB,eAAe,CAAA;AAAA,cAGpD,YAAE,qBAAqB;AAAA;AAAA;AAC1B,SAAA,EACF;AAAA,OAEJ;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,WAAA;AAAA,MACA,eAAA;AAAA,MACA,qBAAA;AAAA,MACA,eAAA;AAAA,MACA,CAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,uBAAA,GAA0B,OAAA;AAAA,IAC9B,MACE,IAAI,GAAA;AAAA,MACF,SAAA,CACG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,EAAU,eAAe,CAAA,CACpC,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE;AAAA,KACtC;AAAA,IACF,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,qBAAA,GAAwB,OAAA;AAAA,IAC5B,MACE,aAAA,CAAc,MAAA;AAAA,MACZ,CAAA,CAAA,KAAK,CAAC,uBAAA,CAAwB,GAAA,CAAI,EAAE,eAAe;AAAA,KACrD;AAAA,IACF,CAAC,eAAe,uBAAuB;AAAA,GACzC;AAEA,EAAA,MAAM,mBAAA,GAAsB,OAAA;AAAA,IAC1B,MACE,qBAAA;AAAA,MACE,qBAAA;AAAA,MACA,WAAA;AAAA,MACA,sBAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACF;AAAA,MACE,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA,WAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,WAAA,KAAwB;AACvB,MAAA,MAAM,cAAA,GAAiB,CAAA,CAAE,mCAAmC,CAAA,IAAK,QAAA;AACjE,MAAA,IAAI,4BAAA,GAA+B,KAAA;AACnC,MAAA,IAAI,4BAAA,GAA+B,KAAA;AACnC,MAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA,CAAE,MAAA;AAAA,QAChE,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrB,UAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA;AAAA,YAAO,CAAA,IAAA,KAAA,CAChC,IAAA,CAAK,IAAA,IAAQ,EAAA,EACX,iBAAA,CAAkB,OAAO,CAAA,CACzB,QAAA,CAAS,WAAA,CAAY,iBAAA,CAAkB,OAAO,CAAC;AAAA,WACpD;AACA,UAAA,MAAM,mBAAmB,GAAA,KAAQ,cAAA;AACjC,UAAA,IAAI,oBAAoB,qBAAA,EAAuB;AAC7C,YAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,cAAA,GAAA,CAAI,cAAc,CAAA,GAAI,aAAA;AAAA,YACxB,CAAA,MAAO;AACL,cAAA,4BAAA,GACE,mBAAA,CAAoB,cAAc,CAAA,CAAE,MAAA,GAAS,CAAA;AAC/C,cAAA,GAAA,CAAI,cAAc,CAAA,GAAI;AAAA,gBACpB;AAAA,kBACE,EAAA,EAAI,+BACA,gCAAA,GACA,iBAAA;AAAA,kBACJ,MAAM,4BAAA,GACF,CAAA,CAAE,wBAAwB,CAAA,GAC1B,EAAE,kCAAkC,CAAA;AAAA,kBACxC,MAAA,EAAQ,IAAA;AAAA,kBACR,eAAA,EAAiB;AAAA,oBACf,UAAA,EAAY;AAAA;AACd;AACF,eACF;AAAA,YACF;AAAA,UACF,CAAA,MAAA,IAAW,CAAC,gBAAA,EAAkB;AAC5B,YAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,cAAA,GAAA,CAAI,GAAG,CAAA,GAAI,aAAA;AAAA,YACb,CAAA,MAAO;AACL,cAAA,4BAAA,GACE,mBAAA,CAAoB,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AAEpC,cAAA,GAAA,CAAI,GAAG,CAAA,GAAI;AAAA,gBACT;AAAA,kBACE,EAAA,EAAI,+BACA,gCAAA,GACA,iBAAA;AAAA,kBACJ,MAAM,4BAAA,GACF,CAAA,CAAE,wBAAwB,CAAA,GAC1B,EAAE,kCAAkC,CAAA;AAAA,kBACxC,MAAA,EAAQ,IAAA;AAAA,kBACR,eAAA,EAAiB;AAAA,oBACf,UAAA,EAAY;AAAA;AACd;AACF,eACF;AAAA,YACF;AAAA,UACF;AACA,UAAA,OAAO,GAAA;AAAA,QACT,CAAA;AAAA,QACA;AAAC,OACH;AAGA,MAAA,IAAI,gCAAgC,4BAAA,EAA8B;AAChE,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,OAAO,qBAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,mBAAA,EAAqB,qBAAA,EAAuB,CAAC;AAAA,GAChD;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,oBAAoB,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAEzB,EAAA,MAAM,kBAAA,GAAqB,WAAA;AAAA,IACzB,CAAC,GAA2B,YAAA,KAA8C;AACxE,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,MAAA,iBAAA,CAAkB,CAAC,IAAA,KAAiB;AAClC,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,SAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,wBAAA,CAAyB,SAAS,CAAA;AAClC,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAChC,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA,iBAAA,CAAkB,SAAS,cAAA,EAAe;AAAA,IAC5C,CAAA;AAAA,IACA;AAAA,MACE,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAC,aAAA,CAAc,IAAA;AAAA,IACxC,CAAC,CAAA,KAA2B,CAAA,CAAE,eAAA,KAAoB;AAAA,GACpD;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,aAAA,EAAe,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,WAAA,KAAgB,mBAAmB,MAAA,EAAQ;AAC7C,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,aAAa,aAAA,EAAc;AAEjC,EAAA,MAAM,iBACH,cAAA,IAAkB,oBAAA,CAAqB,MAAA,KAAW,CAAA,IAClD,CAAC,iBAAA,IAAqB,oBAAA,CAAqB,MAAA,KAAW,CAAA,GACnD,eAAe,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,CAAE,IAAI,CAAA,MAAA,KAAU;AAChD,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,OAAO;AAAA,MACL,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,SAAS,MAAM;AACb,QAAA,WAAA,CAAY,EAAE,OAAO,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF,CAAC,IACD,EAAC;AAGP,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACxC,IAAA,MAAM,KAAK,gBAAA,CAAiB,OAAA;AAC5B,IAAA,MAAM,WAAW,iBAAA,CAAkB,OAAA;AACnC,IAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAEhB,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,IAAI,QAAA,IAAY,OAAO,QAAA,CAAS,cAAA,KAAmB,UAAA,EAAY;AAC7D,QAAA,QAAA,CAAS,eAAe,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,YAAY,EAAA,CAAG,YAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,KAAA,GACJ,OAAO,qBAAA,KAA0B,WAAA,GAC7B,sBAAsB,MAAM,cAAA,EAAgB,CAAA,GAC5C,IAAA;AACN,IAAA,IAAI,KAAA,KAAU,MAAM,cAAA,EAAe;AACnC,IAAA,MAAM,cAAA,GACJ,OAAO,cAAA,KAAmB,WAAA,GACtB,IAAI,cAAA,CAAe,MAAM,cAAA,EAAgB,CAAA,GACzC,MAAA;AACN,IAAA,cAAA,EAAgB,QAAQ,EAAE,CAAA;AAE1B,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,oBAAA,KAAyB,WAAA,EAAa;AACjE,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,cAAA,EAAgB,UAAA,EAAW;AAAA,IAC7B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,CAAe,MAAM,CAAC,CAAA;AAE1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAkB,gBAAA,CAAiB,OAAA;AACzC,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,yBAAA,CAA0B,KAAK,CAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,MACpB,eAAA,CAAgB,aAAA;AAAA,MACd;AAAA,KACF;AAEF,IAAA,MAAM,oBAAA,GAAuB,CAAC,UAAA,KAAmC;AAC/D,MAAA,IAAI,CAAC,UAAA,IAAc,OAAO,MAAA,KAAW,WAAA,EAAa;AAChD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,gBAAA,CAAiB,UAAU,CAAA,CAAE,SAAA;AACtD,MAAA,OACE,SAAA,KAAc,MAAA,IACd,SAAA,KAAc,QAAA,IACd,SAAA,KAAc,SAAA;AAAA,IAElB,CAAA;AAEA,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,MAAM,aAAa,aAAA,EAAc;AACjC,MAAA,OAAO,oBAAA,CAAqB,UAAU,CAAA,GAAI,UAAA,GAAc,eAAA;AAAA,IAC1D,CAAA;AAEA,IAAA,IAAI,uBAA2C,eAAA,EAAgB;AAC/D,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,eAAe,oBAAA,IAAwB,eAAA;AAC7C,MAAA,yBAAA;AAAA,QACE,YAAA,CAAa,YAAA,GAAe,YAAA,CAAa,YAAA,GAAe;AAAA,OAC1D;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,yBAAyB,MAAM;AACnC,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA;AAAA,MACF;AACA,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,IAAI,OAAO,0BAA0B,WAAA,EAAa;AAChD,QAAA,KAAA,GAAQ,sBAAsB,MAAM;AAClC,UAAA,eAAA,GAAkB,KAAA;AAClB,UAAA,cAAA,EAAe;AAAA,QACjB,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,eAAA,GAAkB,KAAA;AAClB,QAAA,cAAA,EAAe;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,sBAAA,EAAuB;AAGvB,IAAA,eAAA,CAAgB,gBAAA,CAAiB,UAAU,sBAAA,EAAwB;AAAA,MACjE,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,MAAM,cAAA,GACJ,OAAO,cAAA,KAAmB,WAAA,GACtB,IAAI,cAAA,CAAe,MAAM,sBAAA,EAAwB,CAAA,GACjD,MAAA;AACN,IAAA,cAAA,EAAgB,QAAQ,eAAe,CAAA;AACvC,IAAA,IAAI,yBAAyB,eAAA,EAAiB;AAC5C,MAAA,cAAA,EAAgB,QAAQ,oBAAoB,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,2BAA2B,MAAM;AACrC,MAAA,MAAM,mBAAmB,eAAA,EAAgB;AACzC,MAAA,IAAI,qBAAqB,oBAAA,EAAsB;AAC7C,QAAA;AAAA,MACF;AACA,MAAA,IAAI,oBAAA,IAAwB,yBAAyB,eAAA,EAAiB;AACpE,QAAA,cAAA,EAAgB,UAAU,oBAAoB,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,qBAAqB,eAAA,EAAiB;AACxC,QAAA,cAAA,EAAgB,QAAQ,gBAAgB,CAAA;AAAA,MAC1C;AACA,MAAA,oBAAA,GAAuB,gBAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,mBACJ,OAAO,gBAAA,KAAqB,WAAA,GACxB,IAAI,iBAAiB,MAAM;AACzB,MAAA,wBAAA,EAAyB;AACzB,MAAA,sBAAA,EAAuB;AAAA,IACzB,CAAC,CAAA,GACD,MAAA;AACN,IAAA,gBAAA,EAAkB,QAAQ,eAAA,EAAiB;AAAA,MACzC,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,oBAAA,KAAyB,WAAA,EAAa;AACjE,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,eAAA,CAAgB,mBAAA;AAAA,QACd,QAAA;AAAA,QACA,sBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,oBAAA,IAAwB,yBAAyB,eAAA,EAAiB;AACpE,QAAA,cAAA,EAAgB,UAAU,oBAAoB,CAAA;AAAA,MAChD;AACA,MAAA,cAAA,EAAgB,UAAA,EAAW;AAC3B,MAAA,gBAAA,EAAkB,UAAA,EAAW;AAC7B,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG;AAAA,IACD,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA,CAAS,MAAA;AAAA,IACT,cAAA,CAAe;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,KAAA,KAAkB;AAClD,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,yBAAA,GAA4B,YAAY,MAAM;AAClD,IAAA,0BAAA,CAA2B,CAAA,MAAA,KAAU,CAAC,MAAM,CAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,mBAAA,CAAoB,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,QAA8B,KAAA,KAA4B;AACzD,MAAA,gBAAA,CAAiB,KAAmB,CAAA;AACpC,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,MAAA,KAA+B;AAC9B,MAAA,MAAM,MAAA,GAAqC;AAAA,QACzC,MAAA,EAAQ,EAAE,aAAa,CAAA;AAAA,QACvB,MAAA,EAAQ,EAAE,aAAa,CAAA;AAAA,QACvB,eAAA,EAAiB,EAAE,sBAAsB,CAAA;AAAA,QACzC,gBAAA,EAAkB,EAAE,uBAAuB;AAAA,OAC7C;AACA,MAAA,OAAO,OAAO,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,CAAC;AAAA,GACJ;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,SAAA,qBACC,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,YAAY,CAAC,CAAA,GAAA,EAAM,YAAA,CAAa,YAAY,CAAC,CAAA,CAAA,EAClE,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAY,EAAE,YAAY,CAAA;AAAA,QAC1B,OAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS,YAAA;AAAA,QACT,UAAA,EAAY,gBAAA;AAAA,QAEX,QAAA,EAAA,YAAA,KAAiB,YAAY,YAAA,KAAiB,kBAAA,uBAC5C,qBAAA,EAAA,EAAsB,CAAA,uBAEtB,kBAAA,EAAA,EAAmB;AAAA;AAAA,KAExB,EACF,CAAA;AAAA,IAEF,CAAC,CAAA,EAAG,YAAA,EAAc,YAAA,EAAc,cAAc,gBAAgB;AAAA,GAChE;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,sBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,aAAA;AAAA,QACH,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAA,EAAU,YAAA;AAAA,QACV,QAAA,EAAU,YAAA;AAAA,QACV,YAAA,EAAc,CAAC,MAAA,KAAoB,mBAAA,CAAoB,MAAM,CAAA;AAAA,QAC7D,WAAA,EAAa,EAAE,QAAA,EAAU,KAAA,EAAM;AAAA,QAC/B,MAAA,EAAQ,UAAA;AAAA,QACR,yBAAA,EAAyB,IAAA;AAAA,QAEzB,QAAA,kBAAA,IAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,OAAA,CAAQ,YAAA,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAM,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,8BAC9C,YAAA,EAAA,EAAa,KAAA,EAAM,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,8BAC9C,YAAA,EAAA,EAAa,KAAA,EAAM,iBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,8BACC,YAAA,EAAA,EAAa,KAAA,EAAM,kBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,IAEF;AAAA,MACE,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,CAAA;AAAA,MACA,OAAA,CAAQ;AAAA;AACV,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAc,KAAA,KAAkC;AACpE,IAAA,IACE,gBAAA,IAAoB,KAAA,IACpB,OAAO,KAAA,CAAM,mBAAmB,UAAA,EAChC;AACA,MAAA,KAAA,CAAM,cAAA,EAAe;AAAA,IACvB;AACA,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,EAAiB,GAAI,mBAAA,EAAoB;AAEzD,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB;AACA,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,IAAA,eAAA,CAAgB,CAAA,CAAE,2CAA2C,CAAC,CAAA;AAC9D,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,oBAAoB,CAAA,CAC7C,OAAA,EAAQ,CACR,IAAA,CAAK,CAAC,CAAA,KAAyB,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA;AACnD,IAAA,MAAM,cAAA,GAAkB,iBAAiB,OAAA,IAAsB,EAAA;AAC/D,IAAA,eAAA,CAAgB,cAAA,CAAe,MAAM,CAAA;AACrC,IAAA,IAAI,cAAA,EAAgB,gBAAA,CAAiB,CAAA,CAAA,KAAK,CAAA,GAAI,CAAC,CAAA;AAC/C,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CACzB,EAAA,EACA,KAAA,KACG,gBAAgB,KAAY,CAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAA0B;AAClD,IAAA,IAAA,CAAK,QAAQ,CAAA,UAAA,KAAc;AACzB,MAAA,MAAM,mBAAA,GAAsB,WAAW,MAAA,CAAO,IAAA;AAAA,QAC5C,CAAC,CAAA,KAAwB,CAAA,CAAE,IAAA,KAAS;AAAA,OACtC;AACA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,cAAA,CAAe;AAAA,UACb,OAAA,EAAS,EAAE,mCAAmC;AAAA,SAC/C,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,kCACJ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,OAAA,CAAQ,cAAc,IAClC,sBAAA,GAAyB,OAAA,CAAQ,4BAA4B,EAC/D,CAAA,CAAA;AAAA,QAEA,+BAAC,KAAA,EAAA,EAAI,GAAA,EAAK,gBAAA,EAAkB,SAAA,EAAW,QAAQ,oBAAA,EAC5C,QAAA,EAAA;AAAA,UAAA,cAAA,CAAe,MAAA,GAAS,qBACvB,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,oBAAA,EAAsB,eAAW,IAAA,EAAC,CAAA;AAAA,0BAE5D,GAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,QAAA;AAAA,cACA,QAAA;AAAA,cACA,cAAA;AAAA,cACA,YAAA;AAAA,cACA,GAAA,EAAK,iBAAA;AAAA,cACL,cAAA;AAAA,cACA,cAAA;AAAA,cACA,WAAA,EAAa,sBAAA;AAAA,cACb,uBAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UACC,cAAA,CAAe,SAAS,CAAA,oBACvB,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,iBAAA;AAAA,cACL,aAAA,EAAW,IAAA;AAAA,cACX,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,YAAY,CAAA;AAAE;AAAA;AACpC,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,oBACA,IAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAW,OAAA,CAAQ,MAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,sBACb,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,aAAA,EAAe,WAAA;AAAA,UACf,oBAAA;AAAA,UACA,eAAA,EAAe,IAAA;AAAA,UACf,YAAA;AAAA,UACA,mBAAA,EAAmB,IAAA;AAAA,UACnB,KAAA,EAAO,YAAA;AAAA,UACP,QAAA,EAAU,kBAAA;AAAA,UACV,aAAA,EAAe,sBAAA;AAAA,UACf,gBAAA,EACE,yBAAyB,gBAAA,GAAmB,MAAA;AAAA,UAE9C,WAAA,EAAa;AAAA,YACX,MAAA,EAAQ;AAAA,cACN,WAAA,EAAa,kBAAA;AAAA,cACb,cAAA,EAAgB,EAAE,gBAAgB;AAAA,aACpC;AAAA,YACA,UAAA,EAAY;AAAA,cACV,cAAA,EAAgB;AAAA,gBACd,MAAA,EAAQ,EAAE,2BAA2B,CAAA;AAAA,gBACrC,QAAA,EAAU,EAAE,6BAA6B;AAAA;AAC3C,aACF;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,cAAA,EAAgB,EAAE,cAAc;AAAA;AAClC,WACF;AAAA,UACA,gBAAA,EAAkB,kBAAA;AAAA,UAClB,gBAAA;AAAA,UACA,WAAA,EAAa,EAAE,6BAA6B;AAAA,SAAA;AAAA,QA7BvC;AAAA,OA8BP;AAAA,sBACA,GAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,gBAAA,CAAiB,CAAC,CAAA,EAAG;AAAA,KAAA,EAC5C;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,gBAAA,mBACJ,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,MACzC,eAAA,EAAiB;AAAA;AAAA,GACnB;AAGF,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,uCAAU,QAAA,EAAA,eAAA,EAAgB,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,mBAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,WAAA,EAAc,QAAA,EAAA,eAAA,EAAgB,CAAA;AAAA,wBACtD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,iBAAkB,QAAA,EAAA,gBAAA,EAAiB;AAAA,OAAA,EAC7D,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,WAAW,OAAA,CAAQ,YAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,UACN;AAAA,YACE,EAAA,EAAI,sBAAA;AAAA,YACJ,KAAA,EAAO,EAAA;AAAA,YACP,KAAA,EAAO;AAAA;AACT;AACF;AAAA,KACF;AAAA,EAEJ,CAAA,GAAG;AAEH,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,gBAAA,GAAmB,EAAE,QAAQ,IAAA,EAAK;AAAA,EACpC,WAAW,iBAAA,EAAmB;AAC5B,IAAA,gBAAA,GAAmB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,UAAU,GAAA,EAAI;AAAA,EAChE;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,cAAA,CAAe,SAAS,CAAA,oBACvB,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,IAAA;AAAA,QACb,OAAA,EAAO,IAAA;AAAA,QACP,YAAA,EAAY,IAAA;AAAA,QACZ,WAAW,OAAA,CAAQ,eAAA;AAAA,QAElB,yBAAe,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,SAAQ,qBACzC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,YAAA,CAAa,OAAA,IAAW,SAAS,CAAA;AAAA,YAC1C,KAAA;AAAA,YACA,WAAW,OAAA,CAAQ,UAAA;AAAA,YACnB,OAAA,EAAS,GAAA;AAAA,YACT,SAAA,EAAW,MAAM,yBAAA,CAA0B,GAAgB,CAAA;AAAA,YAC3D,WAAA,kBACE,GAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,KAAA;AAAA,gBACA,YAAA,EAAc,CAAA,EAAG,OAAA,IAAW,SAAS,CAAA,MAAA,CAAA;AAAA,gBACrC,OAAA,EAAS,MAAM,yBAAA,CAA0B,GAAgB;AAAA;AAAA;AAC3D,WAAA;AAAA,UAXG;AAAA,SAcR;AAAA;AAAA,KACH;AAAA,IAED,iBAAA,oBACC,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,iBAAA;AAAA,QACR,cAAA,EAAgB,oBAAA;AAAA,QAChB,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,QACzC,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,IAED,iBAAA,oBACC,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,iBAAA;AAAA,QACR,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,QACzC,cAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,IAED,gBAAA,oBACC,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,QAAQ,gBAAgB,CAAA;AAAA,QAChC,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAAA,QACvC,SAAA,EAAW,gBAAA;AAAA,QACX,WAAA,EACE,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAA,KAAe,gBAAgB,GAAG,IAAA,IAAQ;AAAA;AAAA,KAEpE;AAAA,IAED,gBAAA,oBACC,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,QAAQ,gBAAgB,CAAA;AAAA,QAChC,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAAA,QACvC,SAAA,EAAW,qBAAA;AAAA,QACX,SAAA,EAAW,gBAAA;AAAA,QACX,IAAA,EACE,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAA,KAAe,gBAAgB,GAAG,IAAA,IAAQ;AAAA;AAAA,KAEpE;AAAA,oBAEF,IAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,aAAa,kBAAA,CAAmB,QAAA;AAAA,QAChC,SAAA,EAAW,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,CAAA,EACxB,qBAAqB,CAAC,uBAAA,GAClB,OAAA,CAAQ,0BAAA,GACR,EACN,CAAA,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAW,OAAA,CAAQ,MAAA,EAChC,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,iBAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,eAAA,EAAe,uBAAA;AAAA,kBACf,YAAA,EAAc,yBAAA;AAAA,kBACd,WAAW,OAAA,CAAQ,UAAA;AAAA,kBACnB,cAAA,EAAgB,EAAE,yBAAyB,CAAA;AAAA,kBAC3C,YAAA,EAAY,EAAE,sBAAsB;AAAA;AAAA,eACtC;AAAA,cACC,gBAAA,oBACC,GAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAW,QAAQ,WAAA,EACrC,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,YAAA,EAAa,MAAK,IAAA,EAAK,KAAA,EAC3B,QAAA,EAAA,CAAA,CAAE,sBAAsB,GAC3B,CAAA,EACF;AAAA,aAAA,EAEJ,CAAA;AAAA,4BAEA,GAAA;AAAA,cAAC,uBAAA;AAAA,cAAA;AAAA,gBACC,aAAA;AAAA,gBACA,qBAAqB,CAAA,IAAA,KAAQ;AAC3B,kBAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,kBAAA,SAAA,EAAU;AACV,kBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,gBAC1B,CAAA;AAAA,gBACA,MAAA;AAAA,gBACA,qBAAA;AAAA,gBACA,uBAAA,EAAyB,oBAAA;AAAA,gBACzB,iBAAA,EAAmB,kBAAA;AAAA,gBACnB,cAAA;AAAA,gBACA,WAAA;AAAA,gBACA,mBAAA,EAAqB,wBAAA;AAAA,gBACrB,kBAAA,EAAoB,MAAM,oBAAA,CAAqB,IAAI;AAAA;AAAA;AACrD,WAAA,EACF,CAAA;AAAA,UACC,oCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,IAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,SAAA;AAAA,gBACX,QAAA,EAAU,uBAAA;AAAA,gBACV,YAAA,EAAY,EAAE,gBAAgB,CAAA;AAAA,gBAC9B,WAAW,OAAA,CAAQ,IAAA;AAAA,gBAEnB,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,OAAI,QAAA,EAAU,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,WAAW,CAAA,EAAG,CAAA;AAAA,sCACxC,GAAA,EAAA,EAAI,QAAA,EAAU,GAAG,KAAA,EAAO,CAAA,CAAE,gBAAgB,CAAA,EAAG;AAAA;AAAA;AAAA,aAChD;AAAA,4BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,WAAA,EAAa;AAAA,WAAA,EACvC,CAAA;AAAA,UAED,aAAA,oBACC,GAAA;AAAA,YAAC,6BAAA;AAAA,YAAA;AAAA,cACC,uBAAA,EAAyB;AAAA,gBACvB,WAAA,EAAa,gBAAA;AAAA,gBACb,aAAa,CAAC,gBAAA;AAAA,gBACd,KAAA,EAAO;AAAA,eACT;AAAA,cACA,kBAAA,EAAkB,IAAA;AAAA,cAClB,aAAa,kBAAA,CAAmB,QAAA;AAAA,cAChC,cAAA,EAAgB,yBAAA;AAAA,cAChB,KAAA,EAAM,EAAA;AAAA,cACN,YAAA,EAAc,IAAA;AAAA,cACd,YAAA,EAAc,uBAAA;AAAA,cACd,sBAAA,EAAwB;AAAA,gBACtB,YAAA,EAAc,EAAE,uBAAuB;AAAA,eACzC;AAAA,cACA,eAAA,EAAiB,0BAAA;AAAA,cACjB,YAAA,EAAc,kBAAA;AAAA,cACd,kBAAA;AAAA,cACA,aAAA,EAAe,oBAAoB,WAAW,CAAA;AAAA,cAC9C,SAAA,EAAW,iBAAiB,MAAA,GAAY,SAAA;AAAA,cACxC,iBAAA,EAAmB,EAAE,gBAAgB,CAAA;AAAA,cACrC,kBAAA,EAAoB;AAAA,gBAClB,IAAA,sBAAO,QAAA,EAAA,EAAS;AAAA,eAClB;AAAA,cACA,qBAAA,EAAuB,YAAA;AAAA,cACvB,sBAAA,EAAwB,EAAE,4BAA4B,CAAA;AAAA,cACtD,oBAAA,EAAsB,EAAE,yBAAyB,CAAA;AAAA,cACjD,gBAAA,EAAkB;AAAA,gBAChB,KAAA,EAAO,WAAA;AAAA,gBACP,SAAS,MAAM;AACb,kBAAA,cAAA,CAAe,EAAE,CAAA;AAAA,gBACnB;AAAA,eACF;AAAA,cACA,eAAA,EAAiB,YAAA;AAAA,cACjB,cAAA,EACE,eACA,MAAA,CAAO,IAAA,CAAK,oBAAoB,WAAW,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,GACrD;AAAA,gBACE,QAAA,EAAU,EAAE,mCAAmC,CAAA;AAAA,gBAC/C,SAAA,EAAW,EAAE,oCAAoC,CAAA;AAAA,gBACjD,IAAA,EAAM;AAAA,eACR,GACA,MAAA;AAAA,cAEN,aAAA,kBACE,IAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,OAAA,CAAQ,kBAAA;AAAA,kBACnB,YAAY,CAAC,CAAA,EAAG,IAAA,KAAS,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,kBAC7C,aAAa,kBAAA,CAAmB,QAAA;AAAA,kBAChC,QAAA,EAAU,EAAE,6BAA6B,CAAA;AAAA,kBACzC,gBAAA,EAAkB,kBAAA;AAAA,kBAClB,gBAAA;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,SAAA,IAAa,YAAY,OAAA,oBACxB,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,cAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,sBAAC,YAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,IAAA;AAAA,wBACV,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,wBACpC,OAAA,EAAS,YAAY,IAAA,IAAQ,QAAA;AAAA,wBAC7B,QAAA,EAAQ,IAAA;AAAA,wBACR,SAAS,MAAM,cAAA,CAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,wBAE9C,QAAA,EAAA,WAAA,CAAY;AAAA;AAAA,qBACf,EACF,CAAA;AAAA,oBAED;AAAA;AAAA;AAAA;AACH;AAAA,WAEJ;AAAA,UAED,kBAAA,IACC,CAAC,0BAAA,IACD,kBAAA,IACA,cAAA,oBACE,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,WAAW,cAAA,CAAe,UAAA;AAAA,cAC1B,cAAc,cAAA,CAAe,IAAA;AAAA,cAC7B,SAAA,EAAW,iBAAA;AAAA,cACX,UAAU,cAAA,CAAe,QAAA;AAAA,cACzB,cACE,aAAA,CAAc,IAAA;AAAA,gBACZ,CAAA,CAAA,KACE,CAAA,CAAE,eAAA,KACF,cAAA,CAAe,QAAA,EAAU;AAAA,iBAC1B,aAAA,IAAiB,MAAA;AAAA,cAEtB,QAAA;AAAA,cACA,MAAA;AAAA,cACA,cAAA;AAAA,cACA,uBAAA;AAAA,cACA,aAAA;AAAA,cACA,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,UAEH,kBAAA,IACC,CAAC,0BAAA,IACD,kBAAA,IACA,CAAC,cAAA,oBACC,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAA;AAAA,cACA,YAAA;AAAA,cACA,OAAA;AAAA,cACA,kBAAA;AAAA,cACA,qBAAA;AAAA,cACA,kBAAkB,CAAC,QAAA,KACjB,SAAS,CAAA,sBAAA,EAAyB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,cAEzD,QAAA,EAAU,mBAAA;AAAA,cACV,QAAA,EAAU,mBAAA;AAAA,cACV,gBAAA,EAAkB,oBAAA;AAAA,cAClB;AAAA;AAAA,WACF;AAAA,UAEH,kBAAA,IACC,CAAC,0BAAA,IACD,CAAC,kBAAA,oBACC,GAAA;AAAA,YAAC,uBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,EAAE,8BAA8B,CAAA;AAAA,cACzC,WAAA,EAAa,CAAC,0BAA0B,CAAA;AAAA,cACxC,MAAA,kBACE,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,UAAA;AAAA,kBACR,KAAA,EAAM,SAAA;AAAA,kBACN,KAAA,EAAO,EAAE,YAAA,EAAc,MAAA,EAAO;AAAA,kBAC9B,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,CAAA;AAAA,kBAE5B,YAAE,6BAA6B;AAAA;AAAA;AAClC;AAAA;AAEJ;AAAA;AAAA,KAEN;AAAA,wBACC,UAAA,EAAA,EAAW;AAAA,GAAA,EACd,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"LightSpeedChat.esm.js","sources":["../../src/components/LightSpeedChat.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ChangeEvent,\n MouseEvent,\n Ref,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n FileRejection,\n type DropEvent as ReactDropzoneDropEvent,\n} from 'react-dropzone';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { Button, makeStyles } from '@material-ui/core';\nimport {\n Chatbot,\n ChatbotAlert,\n ChatbotContent,\n ChatbotDisplayMode,\n ChatbotFooter,\n ChatbotFootnote,\n ChatbotHeader,\n ChatbotHeaderMain,\n ChatbotHeaderMenu,\n ChatbotHeaderTitle,\n FileDropZone,\n MessageBar,\n MessageProps,\n Settings,\n} from '@patternfly/chatbot';\nimport ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';\nimport {\n Alert,\n AlertActionCloseButton,\n AlertGroup,\n AlertVariant,\n DropdownItem,\n MenuToggle,\n MenuToggleElement,\n Select,\n SelectList,\n SelectOption,\n Tab,\n Tabs,\n Title,\n Tooltip,\n type AlertProps,\n} from '@patternfly/react-core';\nimport {\n PlusIcon,\n SearchIcon,\n SortAmountDownAltIcon,\n SortAmountDownIcon,\n} from '@patternfly/react-icons';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport {\n supportedFileTypes,\n TEMP_CONVERSATION_ID,\n UNTITLED_NOTEBOOK_NAME,\n} from '../const';\nimport {\n useBackstageUserIdentity,\n useConversationMessages,\n useConversations,\n useIsMobile,\n useLastOpenedConversation,\n useLightspeedDeletePermission,\n useLightspeedNotebooksPermission,\n useNotebookSession,\n useNotebookSessions,\n usePinnedChatsSettings,\n useSortSettings,\n useStopConversation,\n} from '../hooks';\nimport { useCreateNotebook } from '../hooks/notebooks/useCreateNotebook';\nimport { useNotebookDocuments } from '../hooks/notebooks/useNotebookDocuments';\nimport { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext';\nimport { useLightspeedUpdatePermission } from '../hooks/useLightspeedUpdatePermission';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useWelcomePrompts } from '../hooks/useWelcomePrompts';\nimport { ConversationSummary, NotebookSession } from '../types';\nimport { getAttachments } from '../utils/attachment-utils';\nimport {\n getCategorizeMessages,\n getFootnoteProps,\n SortOption,\n} from '../utils/lightspeed-chatbox-utils';\nimport Attachment from './Attachment';\nimport { useFileAttachmentContext } from './AttachmentContext';\nimport { DeleteModal } from './DeleteModal';\nimport FilePreview from './FilePreview';\nimport { LightspeedChatBox } from './LightspeedChatBox';\nimport { LightspeedChatBoxHeader } from './LightspeedChatBoxHeader';\nimport { McpServersSettings } from './McpServersSettings';\nimport { DeleteNotebookModal } from './notebooks/DeleteNotebookModal';\nimport { NotebooksTab } from './notebooks/NotebooksTab';\nimport { NotebookView } from './notebooks/NotebookView';\nimport { RenameNotebookModal } from './notebooks/RenameNotebookModal';\nimport PermissionRequiredState from './PermissionRequiredState';\nimport { RenameConversationModal } from './RenameConversationModal';\n\nconst useStyles = makeStyles(theme => ({\n body: {\n // remove default margin and padding from common elements\n '& h1, & h2, & h3, & h4, & h5, & h6, & p, & ul, & ol, & li': {\n margin: 0,\n padding: 0,\n },\n },\n header: {\n padding: `${theme.spacing(3)}px ${theme.spacing(3)}px 0 ${theme.spacing(\n 3,\n )}px !important`,\n },\n errorContainer: {\n padding: theme.spacing(3),\n },\n drawerFileDropZone: {\n gap: 0,\n rowGap: 0,\n columnGap: 0,\n '--pf-v6-c-multiple-file-upload--Gap': '0',\n '--pf-v5-c-multiple-file-upload--Gap': '0',\n },\n headerMenu: {\n // align hamburger icon with title\n '& .pf-v6-c-button': {\n display: 'flex',\n alignItems: 'center',\n },\n },\n headerTitle: {\n justifyContent: 'left !important',\n },\n tabs: {\n padding: `${theme.spacing(2)}px ${theme.spacing(3)}px 0`,\n backgroundColor:\n 'var(--pf-t--global--background--color--floating--default)',\n '& .pf-v6-c-tabs__item, & .pf-v5-c-tabs__item': {\n backgroundColor: 'transparent',\n },\n '& .pf-v6-c-tabs__item:not(:last-child), & .pf-v5-c-tabs__item:not(:last-child)':\n {\n marginRight: theme.spacing(5),\n },\n '& .pf-v6-c-tabs__link, & .pf-v5-c-tabs__link': {\n backgroundColor: 'transparent',\n paddingTop: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n fontWeight: 700,\n cursor: 'pointer',\n },\n '& .pf-v6-c-tabs__item.pf-m-current .pf-v6-c-tabs__link, & .pf-v5-c-tabs__item.pf-m-current .pf-v5-c-tabs__link':\n {\n color: 'var(--pf-t--global--text--color--brand--default)',\n },\n },\n tabsDivider: {\n borderTop: '1px solid var(--pf-t--global--border--color--default)',\n },\n notebooksContainer: {\n padding: theme.spacing(3),\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n },\n notebooksHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(4),\n },\n notebooksHeading: {\n marginBottom: 0,\n },\n notebooksHeadingEmpty: {\n '&&': {\n marginBottom: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n },\n },\n notebooksEmptyState: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n },\n notebooksIcon: {\n fontSize: 48,\n color: 'var(--pf-t--global--icon--color--subtle)',\n marginBottom: theme.spacing(1.5),\n },\n notebooksDescription: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(3),\n maxWidth: 420,\n },\n notebooksAction: {\n textTransform: 'none',\n borderRadius: 999,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n },\n notebooksActionEmpty: {\n textTransform: 'none',\n borderRadius: 999,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n marginTop: theme.spacing(3),\n },\n notebooksGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',\n gap: theme.spacing(2),\n width: '100%',\n maxWidth: '100%',\n paddingBottom: theme.spacing(3),\n [theme.breakpoints.down('md')]: {\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n },\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: 'repeat(1, minmax(0, 1fr))',\n },\n },\n notebookCard: {\n borderRadius: theme.spacing(1.5),\n display: 'flex',\n flexDirection: 'column',\n '&:hover': {\n borderColor: 'var(--pf-t--global--border--color--hover)',\n borderWidth: '1px',\n borderStyle: 'solid',\n cursor: 'pointer',\n },\n },\n notebookCardHeader: {\n padding: theme.spacing(2),\n paddingBottom: 0,\n alignItems: 'center',\n },\n notebookCardDivider: {\n borderTop: '1px solid var(--pf-t--global--border--color--default)',\n marginTop: theme.spacing(1),\n },\n notebookCardBody: {\n padding: theme.spacing(2),\n paddingTop: theme.spacing(1.5),\n },\n notebookDocuments: {\n paddingTop: theme.spacing(1),\n paddingLeft: theme.spacing(2),\n },\n notebookUpdated: {\n paddingBottom: theme.spacing(5),\n paddingLeft: theme.spacing(2),\n paddingTop: theme.spacing(2),\n },\n notebookTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n flex: 1,\n },\n notebookCardHeaderActions: {\n marginLeft: theme.spacing(1),\n },\n notebookTitleText: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n notebookMenuButton: {\n color: theme.palette.text.secondary,\n },\n notebookDropdownList: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingInlineStart: 0,\n },\n notebookDropdownMenu: {\n '--pf-v6-c-menu--PaddingBlockStart': '0',\n '--pf-v6-c-menu--PaddingBlockEnd': '0',\n },\n notebookDropdownItem: {\n justifyContent: 'flex-start',\n textAlign: 'left',\n paddingLeft: theme.spacing(1.5),\n paddingRight: theme.spacing(1.5),\n },\n footer: {\n '&>.pf-chatbot__footer-container': {\n width: '95% !important',\n maxWidth: 'unset !important',\n },\n },\n sortDropdown: {\n padding: 0,\n margin: 0,\n },\n // Outer content wrapper (library may override overflow; we rely on inner scroll wrapper).\n chatbotContent: {\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n '& .pf-chatbot__jump': {\n left: '50% !important',\n right: 'auto !important',\n transform: 'translateX(-50%)',\n visibility: 'hidden',\n pointerEvents: 'none',\n },\n },\n chatbotContentHasOverflow: {\n '& .pf-chatbot__jump': {\n visibility: 'visible',\n pointerEvents: 'auto',\n },\n },\n // Inner scroll container we control: always scrollable so zoomed-in users see full content.\n chatbotContentScroll: {\n minHeight: 0,\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n },\n toastAlertGroup: {\n '--pf-v6-c-alert-group--m-toast--InsetInlineEnd': `${theme.spacing(2.5)}px`,\n '--pf-v6-c-alert-group--m-toast--InsetBlockStart': `${theme.spacing(2.5)}px`,\n '--pf-v6-c-alert-group--m-toast--MaxWidth': '350px',\n },\n toastAlert: {\n maxWidth: '350px',\n '& .pf-v6-c-alert__title': {\n margin: 0,\n },\n },\n // When present, pushes welcome content to bottom (zoom out). Scroll up to see important box (zoom in).\n chatbotContentSpacer: {\n flex: 1,\n minHeight: 0,\n },\n settingsFlat: {\n height: '100%',\n width: '100%',\n '&.pf-chatbot__settings-form-container': {\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n padding: 0,\n margin: 0,\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-form': {\n margin: 0,\n padding: 0,\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-form-row': {\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n border: 0,\n margin: 0,\n padding: 0,\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-label': {\n display: 'none',\n },\n },\n mcpFullscreenLayout: {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',\n minHeight: 0,\n height: '100%',\n flex: 1,\n width: '100%',\n minWidth: 0,\n overflow: 'hidden',\n },\n mcpChatPane: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n width: '100%',\n minWidth: 0,\n },\n mcpSettingsPane: {\n width: '100%',\n minWidth: 0,\n borderLeft: `1px solid ${theme.palette.divider}`,\n backgroundColor:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n },\n mcpCollapsedDrawerOrderFix: {\n '& .pf-v6-c-drawer.pf-m-panel-left > .pf-v6-c-drawer__main > .pf-v6-c-drawer__content, & .pf-v5-c-drawer.pf-m-panel-left > .pf-v5-c-drawer__main > .pf-v5-c-drawer__content':\n {\n order: 'unset',\n },\n '& .pf-v6-c-drawer:not(.pf-m-expanded) > .pf-v6-c-drawer__main > .pf-v6-c-drawer__panel, & .pf-v5-c-drawer:not(.pf-m-expanded) > .pf-v5-c-drawer__main > .pf-v5-c-drawer__panel':\n {\n visibility: 'hidden',\n opacity: 0,\n transition: 'none !important',\n },\n },\n}));\n\ntype LightspeedChatProps = {\n selectedModel: string;\n topicRestrictionEnabled: boolean;\n selectedProvider: string;\n userName?: string;\n avatar?: string;\n profileLoading: boolean;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n};\n\nexport const LightspeedChat = ({\n selectedModel,\n topicRestrictionEnabled,\n selectedProvider,\n userName,\n avatar,\n profileLoading,\n handleSelectedModel,\n models,\n}: LightspeedChatProps) => {\n const isMobile = useIsMobile();\n const classes = useStyles();\n const { t } = useTranslation();\n const navigate = useNavigate();\n const notebooksRouteMatch = useMatch('/lightspeed/notebooks');\n const notebookViewRouteMatch = useMatch('/lightspeed/notebooks/:notebookId');\n const routeNotebookId = notebookViewRouteMatch?.params?.notebookId;\n const {\n displayMode,\n setDisplayMode,\n currentConversationId: routeConversationId,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n } = useLightspeedDrawerContext();\n const isFullscreenMode = displayMode === ChatbotDisplayMode.embedded;\n const location = useLocation();\n const isNotebooksFullscreenPath =\n location.pathname === '/lightspeed/notebooks' ||\n location.pathname.startsWith('/lightspeed/notebooks/');\n const user = useBackstageUserIdentity();\n const [filterValue, setFilterValue] = useState<string>('');\n const [announcement, setAnnouncement] = useState<string>('');\n const [activeTab, setActiveTab] = useState<number>(() => {\n if (!isFullscreenMode) {\n return 0;\n }\n if (notebooksRouteMatch || notebookViewRouteMatch) {\n return 1;\n }\n const p = location.pathname;\n if (p.startsWith('/lightspeed/conversation/')) {\n return 0;\n }\n if (shellViewTab === 1) {\n return 1;\n }\n return 0;\n });\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useLightspeedNotebooksPermission();\n const notebooksPermissionResolved =\n !notebooksPermissionLoading && hasNotebooksAccess;\n const { data: notebooks = [], refetch: refetchNotebooks } =\n useNotebookSessions(notebooksPermissionResolved);\n const hasNotebooks = notebooks.length > 0;\n const [openNotebookMenuId, setOpenNotebookMenuId] = useState<string | null>(\n null,\n );\n const [renameNotebookId, setRenameNotebookId] = useState<string | null>(null);\n const [deleteNotebookId, setDeleteNotebookId] = useState<string | null>(null);\n const [activeNotebook, setActiveNotebook] = useState<NotebookSession | null>(\n null,\n );\n const {\n data: routeNotebook,\n isLoading: routeNotebookLoading,\n isError: routeNotebookError,\n } = useNotebookSession(routeNotebookId);\n\n useEffect(() => {\n if (routeNotebookId && routeNotebook && !routeNotebookLoading) {\n setActiveNotebook(routeNotebook);\n } else if (routeNotebookId && routeNotebookError) {\n navigate('/lightspeed/notebooks', { replace: true });\n } else if (!routeNotebookId && notebooksRouteMatch) {\n setActiveNotebook(null);\n }\n }, [\n routeNotebookId,\n routeNotebook,\n routeNotebookLoading,\n routeNotebookError,\n notebooksRouteMatch,\n navigate,\n ]);\n\n const [notebookAlerts, setNotebookAlerts] = useState<Partial<AlertProps>[]>(\n [],\n );\n const createNotebookMutation = useCreateNotebook();\n const { data: notebookDocuments = [] } = useNotebookDocuments(\n activeNotebook?.session_id,\n );\n const [conversationId, setConversationId] = useState<string>('');\n const [requestId, setRequestId] = useState<string>('');\n const [newChatCreated, setNewChatCreated] = useState<boolean>(false);\n const [isSendButtonDisabled, setIsSendButtonDisabled] =\n useState<boolean>(false);\n const [targetConversationId, setTargetConversationId] = useState<string>('');\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [isSortSelectOpen, setIsSortSelectOpen] = useState<boolean>(false);\n const [isMcpSettingsOpen, setIsMcpSettingsOpen] = useState<boolean>(false);\n const [chatHeaderBgColor, setChatHeaderBgColor] = useState<string>();\n const contentScrollRef = useRef<HTMLDivElement>(null);\n const bottomSentinelRef = useRef<HTMLDivElement>(null);\n const [messageBarKey, setMessageBarKey] = useState(0);\n const [hasChatContentOverflow, setHasChatContentOverflow] = useState(false);\n const wasStoppedByUserRef = useRef(false);\n const { isReady, lastOpenedId, setLastOpenedId, clearLastOpenedId } =\n useLastOpenedConversation(user);\n // Chat vs Notebooks tabs are fullscreen-only; overlay and docked always show Chat.\n const showChatPanel = !isFullscreenMode || activeTab === 0;\n const showNotebooksPanel = isFullscreenMode && activeTab !== 0;\n const [isChatHistoryDrawerOpen, setIsChatHistoryDrawerOpen] =\n useState<boolean>(!isMobile && isFullscreenMode);\n\n // Fullscreen: URL drives Chat vs Notebooks, but shellViewTab must win when entering\n // fullscreen from overlay/docked on Notebooks while navigation still lands on /lightspeed.\n useLayoutEffect(() => {\n if (!isFullscreenMode) {\n return;\n }\n if (isNotebooksFullscreenPath) {\n setActiveTab(1);\n setShellViewTab(1);\n return;\n }\n const isBaseLightspeedChatRoute =\n location.pathname === '/lightspeed' ||\n location.pathname === '/lightspeed/';\n if (shellViewTab === 1 && isBaseLightspeedChatRoute) {\n navigate('/lightspeed/notebooks', { replace: true });\n return;\n }\n setActiveTab(0);\n setShellViewTab(0);\n }, [\n isFullscreenMode,\n isNotebooksFullscreenPath,\n shellViewTab,\n location.pathname,\n navigate,\n setShellViewTab,\n ]);\n\n const handleNotebookTabSelect = (\n _event: React.MouseEvent<any>,\n tabIndex: number | string,\n ) => {\n const nextTab = Number(tabIndex);\n setActiveTab(nextTab);\n setShellViewTab(nextTab);\n if (nextTab === 1) {\n navigate('/lightspeed/notebooks');\n if (notebooksPermissionResolved) {\n refetchNotebooks();\n }\n } else {\n navigate(\n routeConversationId\n ? `/lightspeed/conversation/${routeConversationId}`\n : '/lightspeed',\n );\n }\n };\n\n const setDisplayModeFromHeader = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (mode !== ChatbotDisplayMode.embedded) {\n setDisplayMode(mode);\n return;\n }\n if (activeTab === 1) {\n const sid = activeNotebook?.session_id;\n setDisplayMode(\n mode,\n undefined,\n sid ? { notebookSessionId: sid } : 'notebooks',\n );\n } else {\n setDisplayMode(mode);\n }\n },\n [setDisplayMode, activeTab, activeNotebook?.session_id],\n );\n\n const handleCreateNotebook = useCallback(() => {\n createNotebookMutation.mutate(\n { name: UNTITLED_NOTEBOOK_NAME },\n {\n onSuccess: (session: NotebookSession) => {\n navigate(`/lightspeed/notebooks/${session.session_id}`);\n },\n },\n );\n }, [createNotebookMutation, navigate]);\n\n const handleCloseNotebook = useCallback(() => {\n navigate('/lightspeed/notebooks');\n refetchNotebooks();\n }, [navigate, refetchNotebooks]);\n\n const handleRemoveNotebookAlert = (key: React.Key) => {\n setNotebookAlerts(prevAlerts =>\n prevAlerts.filter(alert => alert.key !== key),\n );\n };\n\n const handleNotebookDeleted = () => {\n const key = Date.now();\n setNotebookAlerts(prevAlerts => [\n { title: t('notebooks.delete.toast'), variant: 'success', key },\n ...prevAlerts,\n ]);\n };\n // Open the chat history drawer when entering fullscreen mode on desktop\n useEffect(() => {\n if (!isMobile && isFullscreenMode) {\n setIsChatHistoryDrawerOpen(true);\n }\n }, [isMobile, isFullscreenMode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const headerElement = document.querySelector('.pf-chatbot__header');\n if (!headerElement) return;\n const computedBg = window.getComputedStyle(headerElement).backgroundColor;\n if (computedBg) {\n setChatHeaderBgColor(computedBg);\n }\n }, [displayMode, isMcpSettingsOpen]);\n\n const {\n isPinningChatsEnabled,\n pinnedChats,\n handlePinningChatsToggle,\n pinChat,\n unpinChat,\n } = usePinnedChatsSettings(user);\n\n const { selectedSort, handleSortChange } = useSortSettings(user);\n\n const {\n uploadError,\n showAlert,\n fileContents,\n setShowAlert,\n setFileContents,\n handleFileUpload,\n setUploadError,\n } = useFileAttachmentContext();\n\n // After leaving fullscreen for overlay/docked, provider signals a one-shot handoff so a\n // new LightspeedChat mount does not briefly apply stale lastOpened from storage.\n useLayoutEffect(() => {\n if (!isReady) return;\n\n if (isFullscreenMode) {\n return;\n }\n\n const handoff = consumePendingOverlayThreadHandoff?.() ?? false;\n if (handoff) {\n if (routeConversationId) {\n setConversationId(routeConversationId);\n setNewChatCreated(false);\n } else {\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n }\n return;\n }\n\n if (routeConversationId && routeConversationId !== conversationId) {\n setConversationId(routeConversationId);\n setNewChatCreated(false);\n } else if (\n !routeConversationId &&\n conversationId === '' &&\n lastOpenedId !== null\n ) {\n setConversationId(lastOpenedId);\n }\n }, [\n isReady,\n isFullscreenMode,\n routeConversationId,\n conversationId,\n lastOpenedId,\n consumePendingOverlayThreadHandoff,\n ]);\n\n // Sync conversationId with lastOpenedId — fullscreen only (overlay uses layout effect above).\n useEffect(() => {\n if (!isReady || !isFullscreenMode) {\n return;\n }\n if (lastOpenedId !== null) {\n setConversationId(lastOpenedId);\n }\n }, [lastOpenedId, isReady, isFullscreenMode]);\n\n const queryClient = useQueryClient();\n\n const {\n data: conversations = [],\n isLoading,\n isRefetching,\n } = useConversations();\n\n const { allowed: hasDeleteAccess } = useLightspeedDeletePermission();\n const { allowed: hasUpdateAccess } = useLightspeedUpdatePermission();\n const samplePrompts = useWelcomePrompts();\n useEffect(() => {\n if (!user || !isReady) return;\n const onOverlayLikeSurface = isFullscreenMode || !routeConversationId;\n const stillOnProvisionalThread =\n !conversationId || conversationId === TEMP_CONVERSATION_ID;\n\n if (lastOpenedId === null) {\n if (onOverlayLikeSurface && stillOnProvisionalThread) {\n setConversationId(TEMP_CONVERSATION_ID);\n }\n }\n // Only treat as blank \"new chat\" while there is no persisted thread id yet. Otherwise\n // after the first stream assigns a real conversationId, lastOpenedId can lag one frame\n // and this effect would flip newChatCreated back to true and hide the New chat button.\n if (lastOpenedId === TEMP_CONVERSATION_ID || lastOpenedId === null) {\n if (onOverlayLikeSurface && stillOnProvisionalThread) {\n setNewChatCreated(true);\n }\n }\n }, [\n user,\n isReady,\n lastOpenedId,\n setConversationId,\n isFullscreenMode,\n routeConversationId,\n conversationId,\n ]);\n\n useEffect(() => {\n // Clear last opened conversationId when there are no conversations.\n if (\n !isLoading &&\n !isRefetching &&\n conversations.length === 0 &&\n lastOpenedId\n ) {\n clearLastOpenedId();\n // Stale last-opened pointed at a missing thread; align with blank new chat so\n // provisional UI (e.g. hide New chat) matches storage.\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n setCurrentConversationId(undefined);\n }\n }, [\n isLoading,\n isRefetching,\n conversations,\n lastOpenedId,\n clearLastOpenedId,\n setCurrentConversationId,\n ]);\n\n useEffect(() => {\n if (\n !isLoading &&\n !isRefetching &&\n routeConversationId &&\n isFullscreenMode\n ) {\n const conversationExists = conversations.some(\n (c: ConversationSummary) => c.conversation_id === routeConversationId,\n );\n if (!conversationExists) {\n // New threads can be missing from the summaries list until refetch completes; if we\n // already show this id locally (e.g. streaming), do not reset to a new chat.\n if (routeConversationId !== conversationId) {\n // Conversation from route doesn't exist, start a new chat\n setConversationId(TEMP_CONVERSATION_ID);\n setCurrentConversationId(undefined);\n setNewChatCreated(true);\n }\n } else if (conversationId !== routeConversationId) {\n setConversationId(routeConversationId);\n }\n }\n }, [\n isLoading,\n isRefetching,\n routeConversationId,\n conversations,\n displayMode,\n conversationId,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n useEffect(() => {\n // Update last opened conversation whenever `conversationId` changes\n if (conversationId) {\n setLastOpenedId(conversationId);\n }\n }, [conversationId, setLastOpenedId]);\n\n const viewConversationId = useMemo(\n () =>\n !isFullscreenMode && routeConversationId\n ? routeConversationId\n : conversationId,\n [isFullscreenMode, routeConversationId, conversationId],\n );\n\n const onStart = (conv_id: string) => {\n setConversationId(conv_id);\n setCurrentConversationId(conv_id);\n };\n\n const onRequestIdReady = (request_id: string) => {\n setRequestId(request_id);\n };\n\n const onComplete = (message: string) => {\n setIsSendButtonDisabled(false);\n if (!wasStoppedByUserRef.current) {\n setAnnouncement(`Message from Bot: ${message}`);\n }\n wasStoppedByUserRef.current = false;\n queryClient.invalidateQueries({\n queryKey: ['conversations'],\n });\n queryClient.invalidateQueries({\n queryKey: ['conversationMessages', viewConversationId],\n });\n setNewChatCreated(false);\n };\n\n const {\n conversationMessages,\n handleInputPrompt,\n scrollToBottomRef,\n streamingConversationId,\n } = useConversationMessages(\n viewConversationId,\n userName,\n selectedModel,\n selectedProvider,\n avatar,\n onComplete,\n onStart,\n undefined,\n onRequestIdReady,\n );\n\n const streamingUiMatchesView =\n isSendButtonDisabled &&\n streamingConversationId !== null &&\n viewConversationId === streamingConversationId;\n\n const [messages, setMessages] =\n useState<MessageProps[]>(conversationMessages);\n\n const sendMessage = (message: string | number) => {\n if (!message.toString().trim()) return;\n\n wasStoppedByUserRef.current = false;\n if (viewConversationId !== TEMP_CONVERSATION_ID) {\n setNewChatCreated(false);\n }\n setAnnouncement(\n t('conversation.announcement.userMessage' as any, {\n prompt: message.toString(),\n }),\n );\n handleInputPrompt(message.toString(), getAttachments(fileContents));\n setIsSendButtonDisabled(true);\n setFileContents([]);\n setDraftMessage('');\n };\n\n const onNewChat = useCallback(() => {\n (async () => {\n setIsMcpSettingsOpen(false);\n if (conversationId !== TEMP_CONVERSATION_ID) {\n setMessages([]);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n setCurrentConversationId(undefined);\n if (!isFullscreenMode) {\n setIsChatHistoryDrawerOpen(false);\n }\n } else {\n // Already on new chat: reset so scroll/layout works (e.g. after opening new chat again from another convo then back).\n setMessages([]);\n setNewChatCreated(true);\n }\n })();\n }, [\n conversationId,\n setFileContents,\n setUploadError,\n setDraftMessage,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n const openDeleteModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsDeleteModalOpen(true);\n };\n\n const openChatRenameModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsRenameModalOpen(true);\n };\n\n const handleDeleteConversation = useCallback(() => {\n if (targetConversationId === lastOpenedId) {\n onNewChat();\n clearLastOpenedId();\n }\n setIsDeleteModalOpen(false);\n }, [clearLastOpenedId, lastOpenedId, onNewChat, targetConversationId]);\n\n const additionalMessageProps = useCallback(\n (conversationSummary: ConversationSummary) => {\n const isChatFavorite = pinnedChats?.find(\n c => c === conversationSummary.conversation_id,\n );\n return {\n menuItems: (\n <>\n <DropdownItem\n isDisabled={!hasUpdateAccess}\n onClick={() =>\n openChatRenameModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.rename')}\n </DropdownItem>\n {isPinningChatsEnabled && (\n <>\n {isChatFavorite ? (\n <DropdownItem\n onClick={() =>\n unpinChat(conversationSummary.conversation_id)\n }\n >\n {t('conversation.removeFromPinnedChats')}\n </DropdownItem>\n ) : (\n <DropdownItem\n onClick={() => pinChat(conversationSummary.conversation_id)}\n >\n {t('conversation.addToPinnedChats')}\n </DropdownItem>\n )}\n </>\n )}\n <DropdownItem\n isDisabled={!hasDeleteAccess}\n onClick={() =>\n openDeleteModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.delete')}\n </DropdownItem>\n </>\n ),\n };\n },\n [\n pinnedChats,\n hasDeleteAccess,\n isPinningChatsEnabled,\n hasUpdateAccess,\n t,\n pinChat,\n unpinChat,\n ],\n );\n\n const notebookConversationIds = useMemo(\n () =>\n new Set(\n notebooks\n .map(n => n.metadata?.conversation_id)\n .filter((id): id is string => !!id),\n ),\n [notebooks],\n );\n\n const chatOnlyConversations = useMemo(\n () =>\n conversations.filter(\n c => !notebookConversationIds.has(c.conversation_id),\n ),\n [conversations, notebookConversationIds],\n );\n\n const categorizedMessages = useMemo(\n () =>\n getCategorizeMessages(\n chatOnlyConversations,\n pinnedChats,\n additionalMessageProps,\n t,\n selectedSort,\n ),\n [\n additionalMessageProps,\n chatOnlyConversations,\n pinnedChats,\n t,\n selectedSort,\n ],\n );\n\n const filterConversations = useCallback(\n (targetValue: string) => {\n const pinnedChatsKey = t('conversation.category.pinnedChats') || 'Pinned';\n let isNoPinnedChatsSearchResults = false;\n let isNoRecentChatsSearchResults = false;\n const filteredConversations = Object.entries(categorizedMessages).reduce(\n (acc, [key, items]) => {\n const filteredItems = items.filter(item =>\n (item.text ?? '')\n .toLocaleLowerCase('en-US')\n .includes(targetValue.toLocaleLowerCase('en-US')),\n );\n const isPinnedCategory = key === pinnedChatsKey;\n if (isPinnedCategory && isPinningChatsEnabled) {\n if (filteredItems.length > 0) {\n acc[pinnedChatsKey] = filteredItems;\n } else {\n isNoPinnedChatsSearchResults =\n categorizedMessages[pinnedChatsKey].length > 0;\n acc[pinnedChatsKey] = [\n {\n id: isNoPinnedChatsSearchResults\n ? 'no-pinned-chats-search-results'\n : 'no-pinned-chats',\n text: isNoPinnedChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noPinnedChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n } else if (!isPinnedCategory) {\n if (filteredItems.length > 0) {\n acc[key] = filteredItems;\n } else {\n isNoRecentChatsSearchResults =\n categorizedMessages[key].length > 0;\n\n acc[key] = [\n {\n id: isNoRecentChatsSearchResults\n ? 'no-recent-chats-search-results'\n : 'no-recent-chats',\n text: isNoRecentChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noRecentChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n }\n return acc;\n },\n {} as any,\n );\n // If both sections had items but search filtered them all out, return empty object\n // so PatternFly's default empty state shows instead of custom empty state messages\n if (isNoPinnedChatsSearchResults && isNoRecentChatsSearchResults) {\n return {};\n }\n return filteredConversations;\n },\n [categorizedMessages, isPinningChatsEnabled, t],\n );\n\n useEffect(() => {\n setMessages(conversationMessages);\n }, [conversationMessages]);\n\n const onSelectActiveItem = useCallback(\n (_: MouseEvent | undefined, selectedItem: string | number | undefined) => {\n setIsMcpSettingsOpen(false);\n setNewChatCreated(false);\n const newConvId = String(selectedItem);\n setConversationId((c_id: string) => {\n if (c_id !== selectedItem) {\n return newConvId;\n }\n return c_id;\n });\n setCurrentConversationId(newConvId);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n scrollToBottomRef.current?.scrollToBottom();\n },\n [\n setConversationId,\n setUploadError,\n setFileContents,\n setDraftMessage,\n scrollToBottomRef,\n setCurrentConversationId,\n setIsMcpSettingsOpen,\n ],\n );\n\n const conversationFound = !!conversations.find(\n (c: ConversationSummary) => c.conversation_id === viewConversationId,\n );\n\n const getMaxPrompts = () => {\n if (isFullscreenMode) {\n return samplePrompts?.length; // In the Fullscreen mode, show all prompts\n }\n if (displayMode === ChatbotDisplayMode.docked) {\n return 2; // In the docked mode, show 2 prompts\n }\n return 1; // In the overlay mode, show 1 prompt\n };\n const maxPrompts = getMaxPrompts();\n\n const welcomePrompts =\n (newChatCreated && conversationMessages.length === 0) ||\n (!conversationFound && conversationMessages.length === 0)\n ? samplePrompts?.slice(0, maxPrompts).map(prompt => {\n const p = prompt as { title: string; message: string };\n return {\n title: p.title,\n message: p.message,\n onClick: () => {\n sendMessage(p.message);\n },\n };\n })\n : [];\n\n // Scroll to bottom when welcome content appears (sentinel + useLayoutEffect/RAF + ResizeObserver).\n useLayoutEffect(() => {\n if (welcomePrompts.length === 0) return undefined;\n const el = contentScrollRef.current;\n const sentinel = bottomSentinelRef.current;\n if (!el) return undefined;\n\n const scrollToBottom = () => {\n if (sentinel && typeof sentinel.scrollIntoView === 'function') {\n sentinel.scrollIntoView({ block: 'end', behavior: 'auto' });\n } else {\n el.scrollTop = el.scrollHeight;\n }\n };\n\n const rafId =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame(() => scrollToBottom())\n : null;\n if (rafId === null) scrollToBottom();\n const resizeObserver =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scrollToBottom())\n : undefined;\n resizeObserver?.observe(el);\n\n return () => {\n if (rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(rafId);\n }\n resizeObserver?.disconnect();\n };\n }, [welcomePrompts.length]);\n\n useEffect(() => {\n const scrollContainer = contentScrollRef.current;\n if (!scrollContainer) {\n setHasChatContentOverflow(false);\n return undefined;\n }\n\n const getMessageBox = () =>\n scrollContainer.querySelector(\n '.pf-chatbot__messagebox',\n ) as HTMLElement | null;\n\n const messageBoxOwnsScroll = (messageBox: HTMLElement | null) => {\n if (!messageBox || typeof window === 'undefined') {\n return false;\n }\n const overflowY = window.getComputedStyle(messageBox).overflowY;\n return (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n );\n };\n\n const getScrollTarget = () => {\n const messageBox = getMessageBox();\n return messageBoxOwnsScroll(messageBox) ? messageBox! : scrollContainer;\n };\n\n let observedScrollTarget: HTMLElement | null = getScrollTarget();\n let rafId: number | null = null;\n let updateScheduled = false;\n\n const updateOverflow = () => {\n const scrollTarget = observedScrollTarget ?? scrollContainer;\n setHasChatContentOverflow(\n scrollTarget.scrollHeight > scrollTarget.clientHeight + 1,\n );\n };\n\n const scheduleOverflowUpdate = () => {\n if (updateScheduled) {\n return;\n }\n updateScheduled = true;\n if (typeof requestAnimationFrame !== 'undefined') {\n rafId = requestAnimationFrame(() => {\n updateScheduled = false;\n updateOverflow();\n });\n } else {\n updateScheduled = false;\n updateOverflow();\n }\n };\n\n scheduleOverflowUpdate();\n\n // Use capture so scroll events from inner messagebox also trigger updates.\n scrollContainer.addEventListener('scroll', scheduleOverflowUpdate, {\n passive: true,\n capture: true,\n });\n\n const resizeObserver =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scheduleOverflowUpdate())\n : undefined;\n resizeObserver?.observe(scrollContainer);\n if (observedScrollTarget !== scrollContainer) {\n resizeObserver?.observe(observedScrollTarget);\n }\n\n const syncObservedScrollTarget = () => {\n const nextScrollTarget = getScrollTarget();\n if (nextScrollTarget === observedScrollTarget) {\n return;\n }\n if (observedScrollTarget && observedScrollTarget !== scrollContainer) {\n resizeObserver?.unobserve(observedScrollTarget);\n }\n if (nextScrollTarget !== scrollContainer) {\n resizeObserver?.observe(nextScrollTarget);\n }\n observedScrollTarget = nextScrollTarget;\n };\n\n const mutationObserver =\n typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n syncObservedScrollTarget();\n scheduleOverflowUpdate();\n })\n : undefined;\n mutationObserver?.observe(scrollContainer, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateOverflow);\n }\n\n return () => {\n if (rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(rafId);\n }\n scrollContainer.removeEventListener(\n 'scroll',\n scheduleOverflowUpdate,\n true,\n );\n if (observedScrollTarget && observedScrollTarget !== scrollContainer) {\n resizeObserver?.unobserve(observedScrollTarget);\n }\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateOverflow);\n }\n };\n }, [\n conversationId,\n displayMode,\n isMcpSettingsOpen,\n messages.length,\n welcomePrompts.length,\n ]);\n\n const handleFilter = useCallback((value: string) => {\n setFilterValue(value);\n }, []);\n\n const onChatHistoryDrawerToggle = useCallback(() => {\n setIsChatHistoryDrawerOpen(isOpen => !isOpen);\n }, []);\n\n const onSortToggle = useCallback(() => {\n setIsSortSelectOpen(prev => !prev);\n }, []);\n\n const onSortSelect = useCallback(\n (_event?: MouseEvent<Element>, value?: string | number) => {\n handleSortChange(value as SortOption);\n setIsSortSelectOpen(false);\n },\n [handleSortChange],\n );\n\n const getSortLabel = useCallback(\n (option: SortOption): string => {\n const labels: Record<SortOption, string> = {\n newest: t('sort.newest'),\n oldest: t('sort.oldest'),\n alphabeticalAsc: t('sort.alphabeticalAsc'),\n alphabeticalDesc: t('sort.alphabeticalDesc'),\n };\n return labels[option];\n },\n [t],\n );\n\n const sortToggle = useCallback(\n (toggleRef: Ref<MenuToggleElement>) => (\n <Tooltip content={`${t('sort.label')} - ${getSortLabel(selectedSort)}`}>\n <MenuToggle\n ref={toggleRef}\n aria-label={t('sort.label')}\n variant=\"plain\"\n onClick={onSortToggle}\n isExpanded={isSortSelectOpen}\n >\n {selectedSort === 'oldest' || selectedSort === 'alphabeticalDesc' ? (\n <SortAmountDownAltIcon />\n ) : (\n <SortAmountDownIcon />\n )}\n </MenuToggle>\n </Tooltip>\n ),\n [t, getSortLabel, selectedSort, onSortToggle, isSortSelectOpen],\n );\n\n const sortDropdown = useMemo(\n () => (\n <Select\n id=\"sort-select\"\n isOpen={isSortSelectOpen}\n selected={selectedSort}\n onSelect={onSortSelect}\n onOpenChange={(isOpen: boolean) => setIsSortSelectOpen(isOpen)}\n popperProps={{ position: 'end' }}\n toggle={sortToggle}\n shouldFocusToggleOnSelect\n >\n <SelectList className={classes.sortDropdown}>\n <SelectOption value=\"newest\">{t('sort.newest')}</SelectOption>\n <SelectOption value=\"oldest\">{t('sort.oldest')}</SelectOption>\n <SelectOption value=\"alphabeticalAsc\">\n {t('sort.alphabeticalAsc')}\n </SelectOption>\n <SelectOption value=\"alphabeticalDesc\">\n {t('sort.alphabeticalDesc')}\n </SelectOption>\n </SelectList>\n </Select>\n ),\n [\n isSortSelectOpen,\n selectedSort,\n onSortSelect,\n sortToggle,\n t,\n classes.sortDropdown,\n ],\n );\n\n const handleAttach = (data: File[], event: ReactDropzoneDropEvent) => {\n if (\n 'preventDefault' in event &&\n typeof event.preventDefault === 'function'\n ) {\n event.preventDefault();\n }\n handleFileUpload(data);\n };\n\n const { mutate: stopConversation } = useStopConversation();\n\n const handleStopButton = () => {\n wasStoppedByUserRef.current = true;\n if (requestId) {\n stopConversation(requestId);\n setRequestId('');\n }\n setIsSendButtonDisabled(false);\n setAnnouncement(t('conversation.announcement.responseStopped'));\n const lastUserMessage = [...conversationMessages]\n .reverse()\n .find((m: { role?: string }) => m.role === 'user');\n const restoredPrompt = (lastUserMessage?.content as string) ?? '';\n setDraftMessage(restoredPrompt.trim());\n if (restoredPrompt) setMessageBarKey(k => k + 1);\n setFileContents([]);\n setUploadError({ message: null });\n };\n\n const handleDraftMessage = (\n _e: ChangeEvent<HTMLTextAreaElement>,\n value: string | number,\n ) => setDraftMessage(value as any);\n\n const onAttachRejected = (data: FileRejection[]) => {\n data.forEach(attachment => {\n const hasInvalidTypeError = attachment.errors.some(\n (e: { code: string }) => e.code === 'file-invalid-type',\n );\n if (hasInvalidTypeError) {\n setShowAlert(true);\n setUploadError({\n message: t('file.upload.error.unsupportedType'),\n });\n }\n });\n };\n\n const chatMainContent = (\n <>\n <ChatbotContent\n className={`${classes.chatbotContent} ${\n hasChatContentOverflow ? classes.chatbotContentHasOverflow : ''\n }`}\n >\n <div ref={contentScrollRef} className={classes.chatbotContentScroll}>\n {welcomePrompts.length > 0 && (\n <div className={classes.chatbotContentSpacer} aria-hidden />\n )}\n <LightspeedChatBox\n userName={userName}\n messages={messages}\n profileLoading={profileLoading}\n announcement={announcement}\n ref={scrollToBottomRef}\n welcomePrompts={welcomePrompts}\n conversationId={conversationId}\n isStreaming={streamingUiMatchesView}\n topicRestrictionEnabled={topicRestrictionEnabled}\n displayMode={displayMode}\n />\n {welcomePrompts.length > 0 && (\n <div\n ref={bottomSentinelRef}\n aria-hidden\n style={{ height: 0, flexShrink: 0 }}\n />\n )}\n </div>\n </ChatbotContent>\n <ChatbotFooter className={classes.footer}>\n <FilePreview />\n <MessageBar\n key={messageBarKey}\n onSendMessage={sendMessage}\n isSendButtonDisabled={isSendButtonDisabled}\n hasAttachButton\n handleAttach={handleAttach}\n hasMicrophoneButton\n value={draftMessage}\n onChange={handleDraftMessage}\n hasStopButton={streamingUiMatchesView}\n handleStopButton={\n streamingUiMatchesView ? handleStopButton : undefined\n }\n buttonProps={{\n attach: {\n inputTestId: 'attachment-input',\n tooltipContent: t('tooltip.attach'),\n },\n microphone: {\n tooltipContent: {\n active: t('tooltip.microphone.active'),\n inactive: t('tooltip.microphone.inactive'),\n },\n },\n send: {\n tooltipContent: t('tooltip.send'),\n },\n }}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n placeholder={t('chatbox.message.placeholder')}\n />\n <ChatbotFootnote {...getFootnoteProps(t)} />\n </ChatbotFooter>\n </>\n );\n\n const mcpSettingsPanel = (\n <McpServersSettings\n onClose={() => setIsMcpSettingsOpen(false)}\n backgroundColor={chatHeaderBgColor}\n />\n );\n\n const mainPanelContent = (() => {\n if (!isMcpSettingsOpen) {\n return <>{chatMainContent}</>;\n }\n\n if (isFullscreenMode) {\n return (\n <div className={classes.mcpFullscreenLayout}>\n <div className={classes.mcpChatPane}>{chatMainContent}</div>\n <div className={classes.mcpSettingsPane}>{mcpSettingsPanel}</div>\n </div>\n );\n }\n\n return (\n <Settings\n className={classes.settingsFlat}\n fields={[\n {\n id: 'mcp-servers-settings',\n label: '',\n field: mcpSettingsPanel,\n },\n ]}\n />\n );\n })();\n\n let drawerPanelStyle: { [key: string]: string | number } | undefined;\n if (!isFullscreenMode) {\n drawerPanelStyle = { zIndex: 1300 };\n } else if (isMcpSettingsOpen) {\n drawerPanelStyle = { width: 320, minWidth: 320, maxWidth: 320 };\n }\n\n return (\n <>\n {notebookAlerts.length > 0 && (\n <AlertGroup\n hasAnimations\n isToast\n isLiveRegion\n className={classes.toastAlertGroup}\n >\n {notebookAlerts.map(({ key, title, variant }) => (\n <Alert\n key={key}\n variant={AlertVariant[variant ?? 'success']}\n title={title}\n className={classes.toastAlert}\n timeout={2000}\n onTimeout={() => handleRemoveNotebookAlert(key as React.Key)}\n actionClose={\n <AlertActionCloseButton\n title={title as string}\n variantLabel={`${variant ?? 'success'} alert`}\n onClose={() => handleRemoveNotebookAlert(key as React.Key)}\n />\n }\n />\n ))}\n </AlertGroup>\n )}\n {isDeleteModalOpen && (\n <DeleteModal\n isOpen={isDeleteModalOpen}\n conversationId={targetConversationId}\n onClose={() => setIsDeleteModalOpen(false)}\n onConfirm={handleDeleteConversation}\n />\n )}\n {isRenameModalOpen && (\n <RenameConversationModal\n isOpen={isRenameModalOpen}\n onClose={() => setIsRenameModalOpen(false)}\n conversationId={targetConversationId}\n />\n )}\n {renameNotebookId && (\n <RenameNotebookModal\n isOpen={Boolean(renameNotebookId)}\n onClose={() => setRenameNotebookId(null)}\n sessionId={renameNotebookId}\n currentName={\n notebooks.find(n => n.session_id === renameNotebookId)?.name ?? ''\n }\n />\n )}\n {deleteNotebookId && (\n <DeleteNotebookModal\n isOpen={Boolean(deleteNotebookId)}\n onClose={() => setDeleteNotebookId(null)}\n onDeleted={handleNotebookDeleted}\n sessionId={deleteNotebookId}\n name={\n notebooks.find(n => n.session_id === deleteNotebookId)?.name ?? ''\n }\n />\n )}\n <Chatbot\n displayMode={ChatbotDisplayMode.embedded}\n className={`${classes.body} ${\n isMcpSettingsOpen && !isChatHistoryDrawerOpen\n ? classes.mcpCollapsedDrawerOrderFix\n : ''\n }`}\n >\n <ChatbotHeader className={classes.header}>\n <ChatbotHeaderMain>\n {showChatPanel && (\n <ChatbotHeaderMenu\n aria-expanded={isChatHistoryDrawerOpen}\n onMenuToggle={onChatHistoryDrawerToggle}\n className={classes.headerMenu}\n tooltipContent={t('tooltip.chatHistoryMenu')}\n aria-label={t('aria.chatHistoryMenu')}\n />\n )}\n {isFullscreenMode && (\n <ChatbotHeaderTitle className={classes.headerTitle}>\n <Title headingLevel=\"h1\" size=\"3xl\">\n {t('chatbox.header.title')}\n </Title>\n </ChatbotHeaderTitle>\n )}\n </ChatbotHeaderMain>\n\n <LightspeedChatBoxHeader\n selectedModel={selectedModel}\n handleSelectedModel={item => {\n setIsMcpSettingsOpen(false);\n onNewChat();\n handleSelectedModel(item);\n }}\n models={models}\n isPinningChatsEnabled={isPinningChatsEnabled}\n isModelSelectorDisabled={isSendButtonDisabled}\n hideModelSelector={showNotebooksPanel}\n showChatTabOptions={!showNotebooksPanel}\n setDisplayMode={setDisplayModeFromHeader}\n displayMode={displayMode}\n onPinnedChatsToggle={handlePinningChatsToggle}\n onMcpSettingsClick={() => setIsMcpSettingsOpen(true)}\n />\n </ChatbotHeader>\n {isFullscreenMode && (\n <>\n <Tabs\n activeKey={activeTab}\n onSelect={handleNotebookTabSelect}\n aria-label={t('tabs.ariaLabel')}\n className={classes.tabs}\n >\n <Tab eventKey={0} title={t('tabs.chat')} />\n <Tab eventKey={1} title={t('tabs.notebooks')} />\n </Tabs>\n <div className={classes.tabsDivider} />\n </>\n )}\n {showChatPanel && (\n <ChatbotConversationHistoryNav\n drawerPanelContentProps={{\n isResizable: isFullscreenMode,\n hasNoBorder: !isFullscreenMode,\n style: drawerPanelStyle,\n }}\n reverseButtonOrder\n displayMode={ChatbotDisplayMode.embedded}\n onDrawerToggle={onChatHistoryDrawerToggle}\n title=\"\"\n navTitleIcon={null}\n isDrawerOpen={isChatHistoryDrawerOpen}\n drawerCloseButtonProps={{\n 'aria-label': t('aria.closeDrawerPanel'),\n }}\n setIsDrawerOpen={setIsChatHistoryDrawerOpen}\n activeItemId={viewConversationId}\n onSelectActiveItem={onSelectActiveItem}\n conversations={filterConversations(filterValue)}\n onNewChat={newChatCreated ? undefined : onNewChat}\n newChatButtonText={t('button.newChat')}\n newChatButtonProps={{\n icon: <PlusIcon />,\n }}\n handleTextInputChange={handleFilter}\n searchInputPlaceholder={t('chatbox.search.placeholder')}\n searchInputAriaLabel={t('aria.search.placeholder')}\n searchInputProps={{\n value: filterValue,\n onClear: () => {\n setFilterValue('');\n },\n }}\n searchActionEnd={sortDropdown}\n noResultsState={\n filterValue &&\n Object.keys(filterConversations(filterValue)).length === 0\n ? {\n bodyText: t('chatbox.emptyState.noResults.body'),\n titleText: t('chatbox.emptyState.noResults.title'),\n icon: SearchIcon,\n }\n : undefined\n }\n drawerContent={\n <FileDropZone\n className={classes.drawerFileDropZone}\n onFileDrop={(e, data) => handleAttach(data, e)}\n displayMode={ChatbotDisplayMode.embedded}\n infoText={t('chatbox.fileUpload.infoText')}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n >\n {showAlert && uploadError.message && (\n <div className={classes.errorContainer}>\n <ChatbotAlert\n component=\"h4\"\n title={t('chatbox.fileUpload.failed')}\n variant={uploadError.type ?? 'danger'}\n isInline\n onClose={() => setUploadError({ message: null })}\n >\n {uploadError.message}\n </ChatbotAlert>\n </div>\n )}\n {mainPanelContent}\n </FileDropZone>\n }\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n hasNotebooksAccess &&\n activeNotebook && (\n <NotebookView\n sessionId={activeNotebook.session_id}\n notebookName={activeNotebook.name}\n documents={notebookDocuments}\n metadata={activeNotebook.metadata}\n topicSummary={\n conversations.find(\n c =>\n c.conversation_id ===\n activeNotebook.metadata?.conversation_id,\n )?.topic_summary ?? undefined\n }\n userName={userName}\n avatar={avatar}\n profileLoading={profileLoading}\n topicRestrictionEnabled={topicRestrictionEnabled}\n selectedModel={selectedModel}\n onClose={handleCloseNotebook}\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n hasNotebooksAccess &&\n !activeNotebook && (\n <NotebooksTab\n notebooks={notebooks}\n hasNotebooks={hasNotebooks}\n classes={classes}\n openNotebookMenuId={openNotebookMenuId}\n setOpenNotebookMenuId={setOpenNotebookMenuId}\n onSelectNotebook={(notebook: NotebookSession) => {\n navigate(`/lightspeed/notebooks/${notebook.session_id}`);\n }}\n onRename={setRenameNotebookId}\n onDelete={setDeleteNotebookId}\n onCreateNotebook={handleCreateNotebook}\n t={t}\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n !hasNotebooksAccess && (\n <PermissionRequiredState\n subject={t('permission.subject.notebooks')}\n permissions={['lightspeed.notebooks.use']}\n action={\n <Button\n variant=\"outlined\"\n color=\"primary\"\n style={{ borderRadius: '20px' }}\n onClick={() => {\n setActiveTab(0);\n setShellViewTab(0);\n }}\n >\n {t('permission.notebooks.goBack')}\n </Button>\n }\n />\n )}\n </Chatbot>\n <Attachment />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useState } from 'react';
3
3
  import { makeStyles, createStyles } from '@material-ui/core';
4
4
  import ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';
@@ -41,6 +41,7 @@ const LightspeedChatBoxHeader = ({
41
41
  onMcpSettingsClick,
42
42
  isModelSelectorDisabled = false,
43
43
  hideModelSelector = false,
44
+ showChatTabOptions = true,
44
45
  setDisplayMode
45
46
  }) => {
46
47
  const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);
@@ -157,40 +158,42 @@ const LightspeedChatBoxHeader = ({
157
158
  "switchDisplayFullscreen"
158
159
  )
159
160
  ] }) }),
160
- /* @__PURE__ */ jsx(Divider, {}),
161
- /* @__PURE__ */ jsx(DropdownGroup, { children: /* @__PURE__ */ jsxs(DropdownList, { children: [
162
- isPinningChatsEnabled ? /* @__PURE__ */ jsx(
163
- DropdownItem,
164
- {
165
- value: "disablePinningChats",
166
- icon: /* @__PURE__ */ jsx(ToggleOnOutlinedIcon, { sx: { marginTop: "8px" } }),
167
- description: t("settings.pinned.enabled.description"),
168
- onClick: () => handlePinningChatsToggle(false),
169
- children: t("settings.pinned.disable")
170
- },
171
- "disablePinningChat"
172
- ) : /* @__PURE__ */ jsx(
173
- DropdownItem,
174
- {
175
- value: "enablePinningChats",
176
- icon: /* @__PURE__ */ jsx(ToggleOffOutlinedIcon, { sx: { marginTop: "8px" } }),
177
- description: t("settings.pinned.disabled.description"),
178
- onClick: () => handlePinningChatsToggle(true),
179
- children: t("settings.pinned.enable")
180
- },
181
- "enablePinningChats"
182
- ),
183
- /* @__PURE__ */ jsx(
184
- DropdownItem,
185
- {
186
- value: "mcpSettings",
187
- icon: /* @__PURE__ */ jsx(McpSettingsIcon, {}),
188
- onClick: onMcpSettingsClick,
189
- children: t("settings.mcp.label")
190
- },
191
- "mcpSettings"
192
- )
193
- ] }) })
161
+ showChatTabOptions && /* @__PURE__ */ jsxs(Fragment, { children: [
162
+ /* @__PURE__ */ jsx(Divider, {}),
163
+ /* @__PURE__ */ jsx(DropdownGroup, { children: /* @__PURE__ */ jsxs(DropdownList, { children: [
164
+ isPinningChatsEnabled ? /* @__PURE__ */ jsx(
165
+ DropdownItem,
166
+ {
167
+ value: "disablePinningChats",
168
+ icon: /* @__PURE__ */ jsx(ToggleOnOutlinedIcon, { sx: { marginTop: "8px" } }),
169
+ description: t("settings.pinned.enabled.description"),
170
+ onClick: () => handlePinningChatsToggle(false),
171
+ children: t("settings.pinned.disable")
172
+ },
173
+ "disablePinningChat"
174
+ ) : /* @__PURE__ */ jsx(
175
+ DropdownItem,
176
+ {
177
+ value: "enablePinningChats",
178
+ icon: /* @__PURE__ */ jsx(ToggleOffOutlinedIcon, { sx: { marginTop: "8px" } }),
179
+ description: t("settings.pinned.disabled.description"),
180
+ onClick: () => handlePinningChatsToggle(true),
181
+ children: t("settings.pinned.enable")
182
+ },
183
+ "enablePinningChats"
184
+ ),
185
+ /* @__PURE__ */ jsx(
186
+ DropdownItem,
187
+ {
188
+ value: "mcpSettings",
189
+ icon: /* @__PURE__ */ jsx(McpSettingsIcon, {}),
190
+ onClick: onMcpSettingsClick,
191
+ children: t("settings.mcp.label")
192
+ },
193
+ "mcpSettings"
194
+ )
195
+ ] }) })
196
+ ] })
194
197
  ]
195
198
  }
196
199
  )
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedChatBoxHeader.esm.js","sources":["../../src/components/LightspeedChatBoxHeader.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useState } from 'react';\n\nimport { createStyles, makeStyles } from '@material-ui/core';\nimport ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';\nimport ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';\nimport Divider from '@mui/material/Divider';\nimport {\n ChatbotDisplayMode,\n ChatbotHeaderActions,\n ChatbotHeaderOptionsDropdown,\n} from '@patternfly/chatbot';\nimport {\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\nimport {\n ExpandIcon,\n OpenDrawerRightIcon,\n OutlinedWindowRestoreIcon,\n} from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpSettingsIcon } from './McpSettingsIcon';\n\ntype LightspeedChatBoxHeaderProps = {\n displayMode: ChatbotDisplayMode;\n selectedModel: string;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n isPinningChatsEnabled: boolean;\n onPinnedChatsToggle: (state: boolean) => void;\n onMcpSettingsClick: () => void;\n isModelSelectorDisabled?: boolean;\n hideModelSelector?: boolean;\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n};\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n dropdown: {\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n },\n header: {\n backgroundColor: theme.palette.action.disabled,\n },\n optionsToggle: {\n '& svg': {\n transform: 'none !important',\n },\n },\n groupTitle: {\n fontWeight: 'bold',\n },\n }),\n);\n\nexport const LightspeedChatBoxHeader = ({\n selectedModel,\n displayMode,\n handleSelectedModel,\n models,\n isPinningChatsEnabled,\n onPinnedChatsToggle,\n onMcpSettingsClick,\n isModelSelectorDisabled = false,\n hideModelSelector = false,\n setDisplayMode,\n}: LightspeedChatBoxHeaderProps) => {\n const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);\n const { t } = useTranslation();\n\n const styles = useStyles();\n\n const maxLabelLength = Math.max(\n ...models.map(m => m.label.length),\n selectedModel.length,\n 1,\n );\n const toggleMinWidth = `${maxLabelLength + 4}ch`;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <MenuToggle\n className={isModelSelectorDisabled ? styles.header : ''}\n variant=\"secondary\"\n aria-label={t('aria.chatbotSelector')}\n ref={toggleRef}\n isExpanded={isOptionsMenuOpen}\n isDisabled={isModelSelectorDisabled}\n onClick={() => setIsOptionsMenuOpen(!isOptionsMenuOpen)}\n style={{ minWidth: toggleMinWidth }}\n >\n {selectedModel}\n </MenuToggle>\n );\n\n const handlePinningChatsToggle = (state: boolean) => {\n onPinnedChatsToggle(state);\n };\n\n const handleDockedToWindow = () => {\n setDisplayMode(ChatbotDisplayMode.docked);\n };\n\n const handleFullscreen = () => {\n setDisplayMode(ChatbotDisplayMode.embedded);\n };\n\n const handleOverlay = () => {\n setDisplayMode(ChatbotDisplayMode.default);\n };\n\n const isOverlayMode = displayMode === ChatbotDisplayMode.default;\n const scrollThreshold = isOverlayMode ? 8 : 10;\n const isModelDropdownScrollable = models.length > scrollThreshold;\n\n return (\n <ChatbotHeaderActions>\n {!hideModelSelector && (\n <Dropdown\n className={styles.dropdown}\n isOpen={isOptionsMenuOpen}\n onSelect={(_e, value) => {\n handleSelectedModel(value as string);\n setIsOptionsMenuOpen(false);\n }}\n onOpenChange={isOpen => setIsOptionsMenuOpen(isOpen)}\n popperProps={{ position: 'right' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={isModelDropdownScrollable}\n maxMenuHeight={isModelDropdownScrollable ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <DropdownGroup className={styles.groupTitle} key={model.label}>\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n </DropdownGroup>\n ))}\n </DropdownList>\n </Dropdown>\n )}\n <ChatbotHeaderOptionsDropdown\n isCompact\n toggleProps={{\n 'aria-label': t('aria.settings.label'),\n className: styles.optionsToggle,\n }}\n tooltipProps={{\n content: t('tooltip.settings'),\n }}\n >\n <DropdownGroup>\n <DropdownList>\n <DropdownItem key=\"displayModeLabel\" isDisabled>\n {t('settings.displayMode.label')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.default}\n key=\"switchDisplayOverlay\"\n icon={<OutlinedWindowRestoreIcon />}\n onClick={handleOverlay}\n isSelected={displayMode === ChatbotDisplayMode.default}\n >\n {t('settings.displayMode.overlay')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.docked}\n key=\"switchDisplayDock\"\n icon={<OpenDrawerRightIcon />}\n onClick={handleDockedToWindow}\n isSelected={displayMode === ChatbotDisplayMode.docked}\n >\n {t('settings.displayMode.docked')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.embedded}\n key=\"switchDisplayFullscreen\"\n icon={<ExpandIcon />}\n onClick={handleFullscreen}\n isSelected={displayMode === ChatbotDisplayMode.embedded}\n >\n {t('settings.displayMode.fullscreen')}\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n <Divider />\n <DropdownGroup>\n <DropdownList>\n {isPinningChatsEnabled ? (\n <DropdownItem\n value=\"disablePinningChats\"\n key=\"disablePinningChat\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.enabled.description')}\n onClick={() => handlePinningChatsToggle(false)}\n >\n {t('settings.pinned.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enablePinningChats\"\n key=\"enablePinningChats\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.disabled.description')}\n onClick={() => handlePinningChatsToggle(true)}\n >\n {t('settings.pinned.enable')}\n </DropdownItem>\n )}\n <DropdownItem\n value=\"mcpSettings\"\n key=\"mcpSettings\"\n icon={<McpSettingsIcon />}\n onClick={onMcpSettingsClick}\n >\n {t('settings.mcp.label')}\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n </ChatbotHeaderOptionsDropdown>\n </ChatbotHeaderActions>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LightspeedChatBoxHeader.esm.js","sources":["../../src/components/LightspeedChatBoxHeader.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useState } from 'react';\n\nimport { createStyles, makeStyles } from '@material-ui/core';\nimport ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';\nimport ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';\nimport Divider from '@mui/material/Divider';\nimport {\n ChatbotDisplayMode,\n ChatbotHeaderActions,\n ChatbotHeaderOptionsDropdown,\n} from '@patternfly/chatbot';\nimport {\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\nimport {\n ExpandIcon,\n OpenDrawerRightIcon,\n OutlinedWindowRestoreIcon,\n} from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpSettingsIcon } from './McpSettingsIcon';\n\ntype LightspeedChatBoxHeaderProps = {\n displayMode: ChatbotDisplayMode;\n selectedModel: string;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n isPinningChatsEnabled: boolean;\n onPinnedChatsToggle: (state: boolean) => void;\n onMcpSettingsClick: () => void;\n isModelSelectorDisabled?: boolean;\n hideModelSelector?: boolean;\n /** When false, omits pinned-chats and MCP entries (Chat tab only). */\n showChatTabOptions?: boolean;\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n};\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n dropdown: {\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n },\n header: {\n backgroundColor: theme.palette.action.disabled,\n },\n optionsToggle: {\n '& svg': {\n transform: 'none !important',\n },\n },\n groupTitle: {\n fontWeight: 'bold',\n },\n }),\n);\n\nexport const LightspeedChatBoxHeader = ({\n selectedModel,\n displayMode,\n handleSelectedModel,\n models,\n isPinningChatsEnabled,\n onPinnedChatsToggle,\n onMcpSettingsClick,\n isModelSelectorDisabled = false,\n hideModelSelector = false,\n showChatTabOptions = true,\n setDisplayMode,\n}: LightspeedChatBoxHeaderProps) => {\n const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);\n const { t } = useTranslation();\n\n const styles = useStyles();\n\n const maxLabelLength = Math.max(\n ...models.map(m => m.label.length),\n selectedModel.length,\n 1,\n );\n const toggleMinWidth = `${maxLabelLength + 4}ch`;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <MenuToggle\n className={isModelSelectorDisabled ? styles.header : ''}\n variant=\"secondary\"\n aria-label={t('aria.chatbotSelector')}\n ref={toggleRef}\n isExpanded={isOptionsMenuOpen}\n isDisabled={isModelSelectorDisabled}\n onClick={() => setIsOptionsMenuOpen(!isOptionsMenuOpen)}\n style={{ minWidth: toggleMinWidth }}\n >\n {selectedModel}\n </MenuToggle>\n );\n\n const handlePinningChatsToggle = (state: boolean) => {\n onPinnedChatsToggle(state);\n };\n\n const handleDockedToWindow = () => {\n setDisplayMode(ChatbotDisplayMode.docked);\n };\n\n const handleFullscreen = () => {\n setDisplayMode(ChatbotDisplayMode.embedded);\n };\n\n const handleOverlay = () => {\n setDisplayMode(ChatbotDisplayMode.default);\n };\n\n const isOverlayMode = displayMode === ChatbotDisplayMode.default;\n const scrollThreshold = isOverlayMode ? 8 : 10;\n const isModelDropdownScrollable = models.length > scrollThreshold;\n\n return (\n <ChatbotHeaderActions>\n {!hideModelSelector && (\n <Dropdown\n className={styles.dropdown}\n isOpen={isOptionsMenuOpen}\n onSelect={(_e, value) => {\n handleSelectedModel(value as string);\n setIsOptionsMenuOpen(false);\n }}\n onOpenChange={isOpen => setIsOptionsMenuOpen(isOpen)}\n popperProps={{ position: 'right' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={isModelDropdownScrollable}\n maxMenuHeight={isModelDropdownScrollable ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <DropdownGroup className={styles.groupTitle} key={model.label}>\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n </DropdownGroup>\n ))}\n </DropdownList>\n </Dropdown>\n )}\n <ChatbotHeaderOptionsDropdown\n isCompact\n toggleProps={{\n 'aria-label': t('aria.settings.label'),\n className: styles.optionsToggle,\n }}\n tooltipProps={{\n content: t('tooltip.settings'),\n }}\n >\n <DropdownGroup>\n <DropdownList>\n <DropdownItem key=\"displayModeLabel\" isDisabled>\n {t('settings.displayMode.label')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.default}\n key=\"switchDisplayOverlay\"\n icon={<OutlinedWindowRestoreIcon />}\n onClick={handleOverlay}\n isSelected={displayMode === ChatbotDisplayMode.default}\n >\n {t('settings.displayMode.overlay')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.docked}\n key=\"switchDisplayDock\"\n icon={<OpenDrawerRightIcon />}\n onClick={handleDockedToWindow}\n isSelected={displayMode === ChatbotDisplayMode.docked}\n >\n {t('settings.displayMode.docked')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.embedded}\n key=\"switchDisplayFullscreen\"\n icon={<ExpandIcon />}\n onClick={handleFullscreen}\n isSelected={displayMode === ChatbotDisplayMode.embedded}\n >\n {t('settings.displayMode.fullscreen')}\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n {showChatTabOptions && (\n <>\n <Divider />\n <DropdownGroup>\n <DropdownList>\n {isPinningChatsEnabled ? (\n <DropdownItem\n value=\"disablePinningChats\"\n key=\"disablePinningChat\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.enabled.description')}\n onClick={() => handlePinningChatsToggle(false)}\n >\n {t('settings.pinned.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enablePinningChats\"\n key=\"enablePinningChats\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.disabled.description')}\n onClick={() => handlePinningChatsToggle(true)}\n >\n {t('settings.pinned.enable')}\n </DropdownItem>\n )}\n <DropdownItem\n value=\"mcpSettings\"\n key=\"mcpSettings\"\n icon={<McpSettingsIcon />}\n onClick={onMcpSettingsClick}\n >\n {t('settings.mcp.label')}\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n </>\n )}\n </ChatbotHeaderOptionsDropdown>\n </ChatbotHeaderActions>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedDrawerContext.esm.js","sources":["../../src/components/LightspeedDrawerContext.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContext } from 'react';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { FileContent } from '../types';\n\n/**\n * Type for LightspeedDrawerContext\n *\n * @public\n */\nexport interface LightspeedDrawerContextType {\n /**\n * Whether the chatbot is active\n */\n isChatbotActive: boolean;\n /**\n * Toggle the chatbot open/closed\n */\n toggleChatbot: () => void;\n /**\n * The current display mode\n */\n displayMode: ChatbotDisplayMode;\n /**\n * Set the display mode (overlay, docked, or fullscreen/embedded)\n */\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n /**\n * The drawer width (for docked mode)\n */\n drawerWidth: number;\n /**\n * The function for setting the drawer width\n */\n setDrawerWidth: React.Dispatch<React.SetStateAction<number>>;\n /**\n * The current conversation ID\n */\n currentConversationId?: string;\n /**\n * Set the current conversation ID and update the route if in embedded mode\n * Pass undefined to clear the conversation (example: for new chat)\n */\n setCurrentConversationId: (id: string | undefined) => void;\n /**\n * The message in the chat input box\n * Used to preserve input content when switching between display modes\n */\n draftMessage: string;\n /**\n * To save the input message as a draft when switching modes\n */\n setDraftMessage: (message: string) => void;\n /**\n * The file attachments in the chat input\n * Used to preserve file attachments when switching between display modes\n */\n draftFileContents: FileContent[];\n /**\n * To save file attachments as a draft when switching modes\n */\n setDraftFileContents: (files: FileContent[]) => void;\n /**\n * @internal After leaving fullscreen for overlay/docked, the next overlay/docked chat\n * mount should seed the thread from currentConversationId (or TEMP) instead of storage\n * lastOpened. Returns true at most once per handoff.\n */\n consumePendingOverlayThreadHandoff?: () => boolean;\n}\n\n/**\n * @public\n */\nexport const LightspeedDrawerContext = createContext<\n LightspeedDrawerContextType | undefined\n>(undefined);\n"],"names":[],"mappings":";;AA0FO,MAAM,uBAAA,GAA0B,cAErC,MAAS;;;;"}
1
+ {"version":3,"file":"LightspeedDrawerContext.esm.js","sources":["../../src/components/LightspeedDrawerContext.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContext } from 'react';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { FileContent } from '../types';\n\n/**\n * When switching to fullscreen (embedded), open the notebooks list or a specific session.\n *\n * @public\n */\nexport type LightspeedEmbeddedNotebooksTarget =\n | 'notebooks'\n | { notebookSessionId: string };\n\n/**\n * Type for LightspeedDrawerContext\n *\n * @public\n */\nexport interface LightspeedDrawerContextType {\n /**\n * Whether the chatbot is active\n */\n isChatbotActive: boolean;\n /**\n * Toggle the chatbot open/closed\n */\n toggleChatbot: () => void;\n /**\n * The current display mode\n */\n displayMode: ChatbotDisplayMode;\n /**\n * Set the display mode (overlay, docked, or fullscreen/embedded).\n * When entering embedded mode, optional `embeddedNotebooks` navigates to\n * `/lightspeed/notebooks` (or a session URL) instead of the chat route.\n * Leaving embedded for overlay or docked resets the shell tab to Chat\n * (Notebooks is only available in fullscreen).\n */\n setDisplayMode: (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => void;\n /**\n * The drawer width (for docked mode)\n */\n drawerWidth: number;\n /**\n * The function for setting the drawer width\n */\n setDrawerWidth: React.Dispatch<React.SetStateAction<number>>;\n /**\n * The current conversation ID\n */\n currentConversationId?: string;\n /**\n * Set the current conversation ID and update the route if in embedded mode\n * Pass undefined to clear the conversation (example: for new chat)\n */\n setCurrentConversationId: (id: string | undefined) => void;\n /**\n * The message in the chat input box\n * Used to preserve input content when switching between display modes\n */\n draftMessage: string;\n /**\n * To save the input message as a draft when switching modes\n */\n setDraftMessage: (message: string) => void;\n /**\n * The file attachments in the chat input\n * Used to preserve file attachments when switching between display modes\n */\n draftFileContents: FileContent[];\n /**\n * To save file attachments as a draft when switching modes\n */\n setDraftFileContents: (files: FileContent[]) => void;\n /**\n * @internal After leaving fullscreen for overlay/docked, the next overlay/docked chat\n * mount should seed the thread from currentConversationId (or TEMP) instead of storage\n * lastOpened. Returns true at most once per handoff.\n */\n consumePendingOverlayThreadHandoff?: () => boolean;\n /**\n * Chat tab is 0, Notebooks tab is 1. Persisted across overlay/docked/fullscreen remounts\n * (each display mode mounts its own `LightspeedChat` tree).\n */\n shellViewTab: number;\n setShellViewTab: (tab: number) => void;\n}\n\n/**\n * @public\n */\nexport const LightspeedDrawerContext = createContext<\n LightspeedDrawerContextType | undefined\n>(undefined);\n"],"names":[],"mappings":";;AAiHO,MAAM,uBAAA,GAA0B,cAErC,MAAS;;;;"}
@@ -25,10 +25,19 @@ function useLightspeedProviderState() {
25
25
  const [currentConversationIdState, setCurrentConversationIdState] = useState(void 0);
26
26
  const [draftMessage, setDraftMessageState] = useState("");
27
27
  const [draftFileContents, setDraftFileContentsState] = useState([]);
28
+ const [shellViewTab, setShellViewTabState] = useState(0);
29
+ const shellViewTabRef = useRef(shellViewTab);
30
+ shellViewTabRef.current = shellViewTab;
31
+ const setShellViewTab = useCallback((tab) => {
32
+ const next = tab === 1 ? 1 : 0;
33
+ shellViewTabRef.current = next;
34
+ setShellViewTabState(next);
35
+ }, []);
28
36
  const openedViaFABRef = useRef(false);
29
37
  const dockedAfterLeavingFullscreenRef = useRef(false);
30
38
  const leavingLightspeedForNonEmbeddedShellRef = useRef(false);
31
39
  const pendingOverlayThreadHandoffRef = useRef(false);
40
+ const lightspeedPathnamePrevRef = useRef(null);
32
41
  const isLightspeedRouteRef = useRef(false);
33
42
  const persistedDisplayModeRef = useRef(persistedDisplayMode);
34
43
  const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);
@@ -65,6 +74,10 @@ function useLightspeedProviderState() {
65
74
  navigate("/catalog", { replace: true });
66
75
  }, [navigate]);
67
76
  useEffect(() => {
77
+ const pathname = location.pathname;
78
+ const prevPathname = lightspeedPathnamePrevRef.current;
79
+ const isUnderLightspeedPath = (p) => Boolean(p && p.startsWith(LIGHTSPEED_PATH));
80
+ const isInternalLightspeedRouteChange = isUnderLightspeedPath(prevPathname) && isUnderLightspeedPath(pathname) && prevPathname !== pathname;
68
81
  if (!isLightspeedRoute) {
69
82
  leavingLightspeedForNonEmbeddedShellRef.current = false;
70
83
  }
@@ -74,10 +87,12 @@ function useLightspeedProviderState() {
74
87
  setCurrentConversationIdState(void 0);
75
88
  }
76
89
  if (isLightspeedRoute) {
77
- if (leavingLightspeedForNonEmbeddedShellRef.current && persistedDisplayMode !== ChatbotDisplayMode.embedded) {
78
- setDisplayModeState(persistedDisplayMode);
79
- } else {
80
- setDisplayModeState(ChatbotDisplayMode.embedded);
90
+ if (!isInternalLightspeedRouteChange) {
91
+ if (leavingLightspeedForNonEmbeddedShellRef.current && persistedDisplayMode !== ChatbotDisplayMode.embedded) {
92
+ setDisplayModeState(persistedDisplayMode);
93
+ } else {
94
+ setDisplayModeState(ChatbotDisplayMode.embedded);
95
+ }
81
96
  }
82
97
  setIsOpen(true);
83
98
  if (!dockedAfterLeavingFullscreenRef.current) {
@@ -88,7 +103,14 @@ function useLightspeedProviderState() {
88
103
  } else {
89
104
  setDisplayModeState(persistedDisplayMode);
90
105
  }
91
- }, [closeDrawer, conversationId, isLightspeedRoute, persistedDisplayMode]);
106
+ lightspeedPathnamePrevRef.current = pathname;
107
+ }, [
108
+ closeDrawer,
109
+ conversationId,
110
+ isLightspeedRoute,
111
+ location.pathname,
112
+ persistedDisplayMode
113
+ ]);
92
114
  useEffect(() => {
93
115
  if (!isLightspeedRoute && isOpen && displayModeState === ChatbotDisplayMode.docked) {
94
116
  openDrawer(LIGHTSPEED_APP_DRAWER_ID);
@@ -100,7 +122,11 @@ function useLightspeedProviderState() {
100
122
  const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;
101
123
  if (rawMode === ChatbotDisplayMode.embedded) {
102
124
  if (!isLightspeedRoute) {
103
- navigate(lightspeedRoutePath(currentConversationIdState));
125
+ if (shellViewTabRef.current === 1) {
126
+ navigate(`${LIGHTSPEED_PATH}/notebooks`);
127
+ } else {
128
+ navigate(lightspeedRoutePath(currentConversationIdState));
129
+ }
104
130
  }
105
131
  setDisplayModeState(ChatbotDisplayMode.embedded);
106
132
  closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
@@ -167,17 +193,25 @@ function useLightspeedProviderState() {
167
193
  return true;
168
194
  }, []);
169
195
  const setDisplayMode = useCallback(
170
- (mode, conversationIdParam) => {
196
+ (mode, conversationIdParam, embeddedNotebooks) => {
171
197
  if (mode === displayModeState) {
172
198
  return;
173
199
  }
174
200
  setPersistedDisplayMode(mode);
175
201
  syncShellDrawerForMode(mode);
176
202
  if (mode === ChatbotDisplayMode.embedded) {
177
- const convId = conversationIdParam ?? currentConversationIdState;
178
- navigate(lightspeedRoutePath(convId));
203
+ if (embeddedNotebooks) {
204
+ const path = embeddedNotebooks === "notebooks" ? `${LIGHTSPEED_PATH}/notebooks` : `${LIGHTSPEED_PATH}/notebooks/${embeddedNotebooks.notebookSessionId}`;
205
+ navigate(path);
206
+ } else if (shellViewTabRef.current === 1) {
207
+ navigate(`${LIGHTSPEED_PATH}/notebooks`);
208
+ } else {
209
+ const convId = conversationIdParam ?? currentConversationIdState;
210
+ navigate(lightspeedRoutePath(convId));
211
+ }
179
212
  setIsOpen(true);
180
213
  } else {
214
+ setShellViewTab(0);
181
215
  if (isLightspeedRoute) {
182
216
  leavingLightspeedForNonEmbeddedShellRef.current = true;
183
217
  pendingOverlayThreadHandoffRef.current = true;
@@ -193,6 +227,7 @@ function useLightspeedProviderState() {
193
227
  leaveLightspeedRouteForShellDisplayMode,
194
228
  navigate,
195
229
  setPersistedDisplayMode,
230
+ setShellViewTab,
196
231
  syncShellDrawerForMode
197
232
  ]
198
233
  );
@@ -211,7 +246,9 @@ function useLightspeedProviderState() {
211
246
  setDraftMessage,
212
247
  draftFileContents,
213
248
  setDraftFileContents,
214
- consumePendingOverlayThreadHandoff
249
+ consumePendingOverlayThreadHandoff,
250
+ shellViewTab,
251
+ setShellViewTab
215
252
  }),
216
253
  [
217
254
  isOpen,
@@ -225,7 +262,9 @@ function useLightspeedProviderState() {
225
262
  setDraftMessage,
226
263
  draftFileContents,
227
264
  setDraftFileContents,
228
- consumePendingOverlayThreadHandoff
265
+ consumePendingOverlayThreadHandoff,
266
+ shellViewTab,
267
+ setShellViewTab
229
268
  ]
230
269
  );
231
270
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"useLightspeedProviderState.esm.js","sources":["../../src/hooks/useLightspeedProviderState.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';\n\nimport type { LightspeedDrawerContextType } from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nconst LIGHTSPEED_PATH = '/lightspeed';\n\nfunction lightspeedRoutePath(conversationId?: string): string {\n return conversationId\n ? `${LIGHTSPEED_PATH}/conversation/${conversationId}`\n : LIGHTSPEED_PATH;\n}\n\n/**\n * Encapsulates LightspeedDrawerProvider state, routing, and ApplicationDrawer sync.\n *\n * @internal\n */\nexport function useLightspeedProviderState(): {\n contextValue: LightspeedDrawerContextType;\n shouldRenderOverlayModal: boolean;\n closeChatbot: () => void;\n} {\n const navigate = useNavigate();\n const location = useLocation();\n const { openDrawer, closeDrawer } = useAppDrawer();\n const user = useBackstageUserIdentity();\n const {\n displayMode: persistedDisplayMode,\n setDisplayMode: setPersistedDisplayMode,\n } = useDisplayModeSettings(user, ChatbotDisplayMode.default);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(persistedDisplayMode);\n const [isOpen, setIsOpen] = useState(false);\n const [drawerWidth, setDrawerWidth] = useState(400);\n const [currentConversationIdState, setCurrentConversationIdState] = useState<\n string | undefined\n >(undefined);\n const [draftMessage, setDraftMessageState] = useState('');\n const [draftFileContents, setDraftFileContentsState] = useState<\n FileContent[]\n >([]);\n const openedViaFABRef = useRef(false);\n const dockedAfterLeavingFullscreenRef = useRef(false);\n /** True while navigating off /lightspeed after user chose overlay/docked (URL can lag persisted mode). */\n const leavingLightspeedForNonEmbeddedShellRef = useRef(false);\n /** True until overlay/docked LightspeedChat consumes it (new mount after leaving fullscreen route). */\n const pendingOverlayThreadHandoffRef = useRef(false);\n\n const isLightspeedRouteRef = useRef(false);\n const persistedDisplayModeRef = useRef(persistedDisplayMode);\n\n const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);\n isLightspeedRouteRef.current = isLightspeedRoute;\n persistedDisplayModeRef.current = persistedDisplayMode;\n const conversationMatch = useMatch(\n `${LIGHTSPEED_PATH}/conversation/:conversationId`,\n );\n const conversationId = conversationMatch?.params?.conversationId;\n\n const syncShellDrawerForMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (mode === ChatbotDisplayMode.docked) {\n if (isLightspeedRoute) {\n dockedAfterLeavingFullscreenRef.current = true;\n } else {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else {\n dockedAfterLeavingFullscreenRef.current = false;\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n },\n [closeDrawer, isLightspeedRoute, openDrawer],\n );\n\n const navigateBackOrGoToCatalog = useCallback(() => {\n if (!openedViaFABRef.current) {\n navigate('/catalog');\n openedViaFABRef.current = true;\n return;\n }\n navigate(-1);\n }, [navigate]);\n\n /**\n * Leaving /lightspeed for overlay/docked must not use navigate(-1): after the first FAB\n * open, navigateBackOrGoToCatalog uses -1 and can land back on /lightspeed (fullscreen).\n */\n const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {\n navigate('/catalog', { replace: true });\n }, [navigate]);\n\n useEffect(() => {\n if (!isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = false;\n }\n\n if (conversationId) {\n setCurrentConversationIdState(conversationId);\n } else if (isLightspeedRoute) {\n // On `/lightspeed` without a `:conversationId` segment, URL implies a fresh thread.\n // When navigating to another app route (overlay/docked), keep the last id so display\n // mode switches and re-entry to fullscreen stay on the active conversation.\n setCurrentConversationIdState(undefined);\n }\n\n if (isLightspeedRoute) {\n if (\n leavingLightspeedForNonEmbeddedShellRef.current &&\n persistedDisplayMode !== ChatbotDisplayMode.embedded\n ) {\n setDisplayModeState(persistedDisplayMode);\n } else {\n setDisplayModeState(ChatbotDisplayMode.embedded);\n }\n setIsOpen(true);\n if (!dockedAfterLeavingFullscreenRef.current) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else if (persistedDisplayMode === ChatbotDisplayMode.embedded) {\n // Off /lightspeed there is no fullscreen surface; use overlay so FAB stays available.\n // (Persisted preference remains \"fullscreen\" for the next open.)\n setDisplayModeState(ChatbotDisplayMode.default);\n } else {\n setDisplayModeState(persistedDisplayMode);\n }\n }, [closeDrawer, conversationId, isLightspeedRoute, persistedDisplayMode]);\n\n useEffect(() => {\n if (\n !isLightspeedRoute &&\n isOpen &&\n displayModeState === ChatbotDisplayMode.docked\n ) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n dockedAfterLeavingFullscreenRef.current = false;\n }\n }, [displayModeState, isLightspeedRoute, isOpen, openDrawer]);\n\n const openChatbot = useCallback(() => {\n openedViaFABRef.current = true;\n const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;\n\n if (rawMode === ChatbotDisplayMode.embedded) {\n if (!isLightspeedRoute) {\n navigate(lightspeedRoutePath(currentConversationIdState));\n }\n setDisplayModeState(ChatbotDisplayMode.embedded);\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n setIsOpen(true);\n return;\n }\n\n setDisplayModeState(rawMode);\n\n if (rawMode === ChatbotDisplayMode.docked) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n } else {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n\n setIsOpen(true);\n }, [\n closeDrawer,\n currentConversationIdState,\n isLightspeedRoute,\n navigate,\n openDrawer,\n persistedDisplayMode,\n ]);\n\n const closeChatbot = useCallback(() => {\n dockedAfterLeavingFullscreenRef.current = false;\n if (displayModeState === ChatbotDisplayMode.embedded && isLightspeedRoute) {\n navigateBackOrGoToCatalog();\n }\n if (displayModeState === ChatbotDisplayMode.docked) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n setIsOpen(false);\n }, [\n closeDrawer,\n displayModeState,\n isLightspeedRoute,\n navigateBackOrGoToCatalog,\n ]);\n\n const toggleChatbot = useCallback(() => {\n if (isOpen) {\n closeChatbot();\n } else {\n openChatbot();\n }\n }, [isOpen, openChatbot, closeChatbot]);\n\n const setCurrentConversationId = useCallback(\n (id: string | undefined) => {\n setCurrentConversationIdState(id);\n // Refs: first-stream completion calls onStart after unmount / mode change; a stale\n // embedded + /lightspeed closure would navigate back to fullscreen without this.\n if (\n persistedDisplayModeRef.current === ChatbotDisplayMode.embedded &&\n isLightspeedRouteRef.current\n ) {\n navigate(lightspeedRoutePath(id), { replace: true });\n }\n },\n [navigate],\n );\n\n const setDraftMessage = useCallback((message: string) => {\n setDraftMessageState(message);\n }, []);\n\n const setDraftFileContents = useCallback((files: FileContent[]) => {\n setDraftFileContentsState(files);\n }, []);\n\n const consumePendingOverlayThreadHandoff = useCallback(() => {\n if (!pendingOverlayThreadHandoffRef.current) {\n return false;\n }\n pendingOverlayThreadHandoffRef.current = false;\n return true;\n }, []);\n\n const setDisplayMode = useCallback(\n (mode: ChatbotDisplayMode, conversationIdParam?: string) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\n setIsOpen(true);\n } else {\n if (isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = true;\n pendingOverlayThreadHandoffRef.current = true;\n leaveLightspeedRouteForShellDisplayMode();\n }\n setIsOpen(true);\n }\n },\n [\n currentConversationIdState,\n displayModeState,\n isLightspeedRoute,\n leaveLightspeedRouteForShellDisplayMode,\n navigate,\n setPersistedDisplayMode,\n syncShellDrawerForMode,\n ],\n );\n\n const shouldRenderOverlayModal =\n isOpen &&\n displayModeState === ChatbotDisplayMode.default &&\n !isLightspeedRoute;\n\n const contextValue = useMemo(\n () => ({\n isChatbotActive: isOpen,\n toggleChatbot,\n displayMode: displayModeState,\n setDisplayMode,\n drawerWidth,\n setDrawerWidth,\n currentConversationId: currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n }),\n [\n isOpen,\n toggleChatbot,\n displayModeState,\n setDisplayMode,\n drawerWidth,\n currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n ],\n );\n\n return {\n contextValue,\n shouldRenderOverlayModal,\n closeChatbot,\n };\n}\n"],"names":[],"mappings":";;;;;;;;AA6BA,MAAM,eAAA,GAAkB,aAAA;AAExB,SAAS,oBAAoB,cAAA,EAAiC;AAC5D,EAAA,OAAO,cAAA,GACH,CAAA,EAAG,eAAe,CAAA,cAAA,EAAiB,cAAc,CAAA,CAAA,GACjD,eAAA;AACN;AAOO,SAAS,0BAAA,GAId;AACA,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,YAAA,EAAa;AACjD,EAAA,MAAM,OAAO,wBAAA,EAAyB;AACtC,EAAA,MAAM;AAAA,IACJ,WAAA,EAAa,oBAAA;AAAA,IACb,cAAA,EAAgB;AAAA,GAClB,GAAI,sBAAA,CAAuB,IAAA,EAAM,kBAAA,CAAmB,OAAO,CAAA;AAE3D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAC1C,SAA6B,oBAAoB,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,GAAG,CAAA;AAClD,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAAI,SAElE,MAAS,CAAA;AACX,EAAA,MAAM,CAAC,YAAA,EAAc,oBAAoB,CAAA,GAAI,SAAS,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,iBAAA,EAAmB,yBAAyB,CAAA,GAAI,QAAA,CAErD,EAAE,CAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,OAAO,KAAK,CAAA;AACpC,EAAA,MAAM,+BAAA,GAAkC,OAAO,KAAK,CAAA;AAEpD,EAAA,MAAM,uCAAA,GAA0C,OAAO,KAAK,CAAA;AAE5D,EAAA,MAAM,8BAAA,GAAiC,OAAO,KAAK,CAAA;AAEnD,EAAA,MAAM,oBAAA,GAAuB,OAAO,KAAK,CAAA;AACzC,EAAA,MAAM,uBAAA,GAA0B,OAAO,oBAAoB,CAAA;AAE3D,EAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,QAAA,CAAS,UAAA,CAAW,eAAe,CAAA;AACtE,EAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAC/B,EAAA,uBAAA,CAAwB,OAAA,GAAU,oBAAA;AAClC,EAAA,MAAM,iBAAA,GAAoB,QAAA;AAAA,IACxB,GAAG,eAAe,CAAA,6BAAA;AAAA,GACpB;AACA,EAAA,MAAM,cAAA,GAAiB,mBAAmB,MAAA,EAAQ,cAAA;AAElD,EAAA,MAAM,sBAAA,GAAyB,WAAA;AAAA,IAC7B,CAAC,IAAA,KAA6B;AAC5B,MAAA,IAAI,IAAA,KAAS,mBAAmB,MAAA,EAAQ;AACtC,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,+BAAA,CAAgC,OAAA,GAAU,IAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,wBAAwB,CAAA;AAAA,QACrC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,+BAAA,CAAgC,OAAA,GAAU,KAAA;AAC1C,QAAA,WAAA,CAAY,wBAAwB,CAAA;AAAA,MACtC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,iBAAA,EAAmB,UAAU;AAAA,GAC7C;AAEA,EAAA,MAAM,yBAAA,GAA4B,YAAY,MAAM;AAClD,IAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,MAAA,QAAA,CAAS,UAAU,CAAA;AACnB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAMb,EAAA,MAAM,uCAAA,GAA0C,YAAY,MAAM;AAChE,IAAA,QAAA,CAAS,UAAA,EAAY,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,uCAAA,CAAwC,OAAA,GAAU,KAAA;AAAA,IACpD;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,6BAAA,CAA8B,cAAc,CAAA;AAAA,IAC9C,WAAW,iBAAA,EAAmB;AAI5B,MAAA,6BAAA,CAA8B,MAAS,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,IACE,uCAAA,CAAwC,OAAA,IACxC,oBAAA,KAAyB,kBAAA,CAAmB,QAAA,EAC5C;AACA,QAAA,mBAAA,CAAoB,oBAAoB,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,mBAAmB,QAAQ,CAAA;AAAA,MACjD;AACA,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,IAAI,CAAC,gCAAgC,OAAA,EAAS;AAC5C,QAAA,WAAA,CAAY,wBAAwB,CAAA;AAAA,MACtC;AAAA,IACF,CAAA,MAAA,IAAW,oBAAA,KAAyB,kBAAA,CAAmB,QAAA,EAAU;AAG/D,MAAA,mBAAA,CAAoB,mBAAmB,OAAO,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,mBAAA,CAAoB,oBAAoB,CAAA;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,cAAA,EAAgB,iBAAA,EAAmB,oBAAoB,CAAC,CAAA;AAEzE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IACE,CAAC,iBAAA,IACD,MAAA,IACA,gBAAA,KAAqB,mBAAmB,MAAA,EACxC;AACA,MAAA,UAAA,CAAW,wBAAwB,CAAA;AACnC,MAAA,+BAAA,CAAgC,OAAA,GAAU,KAAA;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,gBAAA,EAAkB,iBAAA,EAAmB,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE5D,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,wBAAwB,kBAAA,CAAmB,OAAA;AAE3D,IAAA,IAAI,OAAA,KAAY,mBAAmB,QAAA,EAAU;AAC3C,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,QAAA,CAAS,mBAAA,CAAoB,0BAA0B,CAAC,CAAA;AAAA,MAC1D;AACA,MAAA,mBAAA,CAAoB,mBAAmB,QAAQ,CAAA;AAC/C,MAAA,WAAA,CAAY,wBAAwB,CAAA;AACpC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAE3B,IAAA,IAAI,OAAA,KAAY,mBAAmB,MAAA,EAAQ;AACzC,MAAA,UAAA,CAAW,wBAAwB,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,wBAAwB,CAAA;AAAA,IACtC;AAEA,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,0BAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,+BAAA,CAAgC,OAAA,GAAU,KAAA;AAC1C,IAAA,IAAI,gBAAA,KAAqB,kBAAA,CAAmB,QAAA,IAAY,iBAAA,EAAmB;AACzE,MAAA,yBAAA,EAA0B;AAAA,IAC5B;AACA,IAAA,IAAI,gBAAA,KAAqB,mBAAmB,MAAA,EAAQ;AAClD,MAAA,WAAA,CAAY,wBAAwB,CAAA;AAAA,IACtC;AACA,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,YAAA,EAAa;AAAA,IACf,CAAA,MAAO;AACL,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAA,EAAa,YAAY,CAAC,CAAA;AAEtC,EAAA,MAAM,wBAAA,GAA2B,WAAA;AAAA,IAC/B,CAAC,EAAA,KAA2B;AAC1B,MAAA,6BAAA,CAA8B,EAAE,CAAA;AAGhC,MAAA,IACE,uBAAA,CAAwB,OAAA,KAAY,kBAAA,CAAmB,QAAA,IACvD,qBAAqB,OAAA,EACrB;AACA,QAAA,QAAA,CAAS,oBAAoB,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,OAAA,KAAoB;AACvD,IAAA,oBAAA,CAAqB,OAAO,CAAA;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAA,GAAuB,WAAA,CAAY,CAAC,KAAA,KAAyB;AACjE,IAAA,yBAAA,CAA0B,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,kCAAA,GAAqC,YAAY,MAAM;AAC3D,IAAA,IAAI,CAAC,+BAA+B,OAAA,EAAS;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,8BAAA,CAA+B,OAAA,GAAU,KAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,MAA0B,mBAAA,KAAiC;AAC1D,MAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,QAAA;AAAA,MACF;AACA,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAE3B,MAAA,IAAI,IAAA,KAAS,mBAAmB,QAAA,EAAU;AACxC,QAAA,MAAM,SAAS,mBAAA,IAAuB,0BAAA;AACtC,QAAA,QAAA,CAAS,mBAAA,CAAoB,MAAM,CAAC,CAAA;AACpC,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,uCAAA,CAAwC,OAAA,GAAU,IAAA;AAClD,UAAA,8BAAA,CAA+B,OAAA,GAAU,IAAA;AACzC,UAAA,uCAAA,EAAwC;AAAA,QAC1C;AACA,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,0BAAA;AAAA,MACA,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA,uCAAA;AAAA,MACA,QAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,wBAAA,GACJ,MAAA,IACA,gBAAA,KAAqB,kBAAA,CAAmB,WACxC,CAAC,iBAAA;AAEH,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA,MACL,eAAA,EAAiB,MAAA;AAAA,MACjB,aAAA;AAAA,MACA,WAAA,EAAa,gBAAA;AAAA,MACb,cAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,wBAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,0BAAA;AAAA,MACA,wBAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useLightspeedProviderState.esm.js","sources":["../../src/hooks/useLightspeedProviderState.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';\n\nimport type {\n LightspeedDrawerContextType,\n LightspeedEmbeddedNotebooksTarget,\n} from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nconst LIGHTSPEED_PATH = '/lightspeed';\n\nfunction lightspeedRoutePath(conversationId?: string): string {\n return conversationId\n ? `${LIGHTSPEED_PATH}/conversation/${conversationId}`\n : LIGHTSPEED_PATH;\n}\n\n/**\n * Encapsulates LightspeedDrawerProvider state, routing, and ApplicationDrawer sync.\n *\n * @internal\n */\nexport function useLightspeedProviderState(): {\n contextValue: LightspeedDrawerContextType;\n shouldRenderOverlayModal: boolean;\n closeChatbot: () => void;\n} {\n const navigate = useNavigate();\n const location = useLocation();\n const { openDrawer, closeDrawer } = useAppDrawer();\n const user = useBackstageUserIdentity();\n const {\n displayMode: persistedDisplayMode,\n setDisplayMode: setPersistedDisplayMode,\n } = useDisplayModeSettings(user, ChatbotDisplayMode.default);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(persistedDisplayMode);\n const [isOpen, setIsOpen] = useState(false);\n const [drawerWidth, setDrawerWidth] = useState(400);\n const [currentConversationIdState, setCurrentConversationIdState] = useState<\n string | undefined\n >(undefined);\n const [draftMessage, setDraftMessageState] = useState('');\n const [draftFileContents, setDraftFileContentsState] = useState<\n FileContent[]\n >([]);\n const [shellViewTab, setShellViewTabState] = useState(0);\n const shellViewTabRef = useRef(shellViewTab);\n shellViewTabRef.current = shellViewTab;\n const setShellViewTab = useCallback((tab: number) => {\n const next = tab === 1 ? 1 : 0;\n shellViewTabRef.current = next;\n setShellViewTabState(next);\n }, []);\n const openedViaFABRef = useRef(false);\n const dockedAfterLeavingFullscreenRef = useRef(false);\n /** True while navigating off /lightspeed after user chose overlay/docked (URL can lag persisted mode). */\n const leavingLightspeedForNonEmbeddedShellRef = useRef(false);\n /** True until overlay/docked LightspeedChat consumes it (new mount after leaving fullscreen route). */\n const pendingOverlayThreadHandoffRef = useRef(false);\n /** Used to detect in-app moves (e.g. Chat ↔ Notebooks) so display mode is not reset to embedded. */\n const lightspeedPathnamePrevRef = useRef<string | null>(null);\n\n const isLightspeedRouteRef = useRef(false);\n const persistedDisplayModeRef = useRef(persistedDisplayMode);\n\n const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);\n isLightspeedRouteRef.current = isLightspeedRoute;\n persistedDisplayModeRef.current = persistedDisplayMode;\n const conversationMatch = useMatch(\n `${LIGHTSPEED_PATH}/conversation/:conversationId`,\n );\n const conversationId = conversationMatch?.params?.conversationId;\n\n const syncShellDrawerForMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (mode === ChatbotDisplayMode.docked) {\n if (isLightspeedRoute) {\n dockedAfterLeavingFullscreenRef.current = true;\n } else {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else {\n dockedAfterLeavingFullscreenRef.current = false;\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n },\n [closeDrawer, isLightspeedRoute, openDrawer],\n );\n\n const navigateBackOrGoToCatalog = useCallback(() => {\n if (!openedViaFABRef.current) {\n navigate('/catalog');\n openedViaFABRef.current = true;\n return;\n }\n navigate(-1);\n }, [navigate]);\n\n /**\n * Leaving /lightspeed for overlay/docked must not use navigate(-1): after the first FAB\n * open, navigateBackOrGoToCatalog uses -1 and can land back on /lightspeed (fullscreen).\n */\n const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {\n navigate('/catalog', { replace: true });\n }, [navigate]);\n\n useEffect(() => {\n const pathname = location.pathname;\n const prevPathname = lightspeedPathnamePrevRef.current;\n const isUnderLightspeedPath = (p: string | null) =>\n Boolean(p && p.startsWith(LIGHTSPEED_PATH));\n const isInternalLightspeedRouteChange =\n isUnderLightspeedPath(prevPathname) &&\n isUnderLightspeedPath(pathname) &&\n prevPathname !== pathname;\n\n if (!isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = false;\n }\n\n if (conversationId) {\n setCurrentConversationIdState(conversationId);\n } else if (isLightspeedRoute) {\n // On `/lightspeed` without a `:conversationId` segment, URL implies a fresh thread.\n // When navigating to another app route (overlay/docked), keep the last id so display\n // mode switches and re-entry to fullscreen stay on the active conversation.\n setCurrentConversationIdState(undefined);\n }\n\n if (isLightspeedRoute) {\n if (!isInternalLightspeedRouteChange) {\n if (\n leavingLightspeedForNonEmbeddedShellRef.current &&\n persistedDisplayMode !== ChatbotDisplayMode.embedded\n ) {\n setDisplayModeState(persistedDisplayMode);\n } else {\n setDisplayModeState(ChatbotDisplayMode.embedded);\n }\n }\n setIsOpen(true);\n if (!dockedAfterLeavingFullscreenRef.current) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else if (persistedDisplayMode === ChatbotDisplayMode.embedded) {\n // Off /lightspeed there is no fullscreen surface; use overlay so FAB stays available.\n // (Persisted preference remains \"fullscreen\" for the next open.)\n setDisplayModeState(ChatbotDisplayMode.default);\n } else {\n setDisplayModeState(persistedDisplayMode);\n }\n\n lightspeedPathnamePrevRef.current = pathname;\n }, [\n closeDrawer,\n conversationId,\n isLightspeedRoute,\n location.pathname,\n persistedDisplayMode,\n ]);\n\n useEffect(() => {\n if (\n !isLightspeedRoute &&\n isOpen &&\n displayModeState === ChatbotDisplayMode.docked\n ) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n dockedAfterLeavingFullscreenRef.current = false;\n }\n }, [displayModeState, isLightspeedRoute, isOpen, openDrawer]);\n\n const openChatbot = useCallback(() => {\n openedViaFABRef.current = true;\n const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;\n\n if (rawMode === ChatbotDisplayMode.embedded) {\n if (!isLightspeedRoute) {\n if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n navigate(lightspeedRoutePath(currentConversationIdState));\n }\n }\n setDisplayModeState(ChatbotDisplayMode.embedded);\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n setIsOpen(true);\n return;\n }\n\n setDisplayModeState(rawMode);\n\n if (rawMode === ChatbotDisplayMode.docked) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n } else {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n\n setIsOpen(true);\n }, [\n closeDrawer,\n currentConversationIdState,\n isLightspeedRoute,\n navigate,\n openDrawer,\n persistedDisplayMode,\n ]);\n\n const closeChatbot = useCallback(() => {\n dockedAfterLeavingFullscreenRef.current = false;\n if (displayModeState === ChatbotDisplayMode.embedded && isLightspeedRoute) {\n navigateBackOrGoToCatalog();\n }\n if (displayModeState === ChatbotDisplayMode.docked) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n setIsOpen(false);\n }, [\n closeDrawer,\n displayModeState,\n isLightspeedRoute,\n navigateBackOrGoToCatalog,\n ]);\n\n const toggleChatbot = useCallback(() => {\n if (isOpen) {\n closeChatbot();\n } else {\n openChatbot();\n }\n }, [isOpen, openChatbot, closeChatbot]);\n\n const setCurrentConversationId = useCallback(\n (id: string | undefined) => {\n setCurrentConversationIdState(id);\n // Refs: first-stream completion calls onStart after unmount / mode change; a stale\n // embedded + /lightspeed closure would navigate back to fullscreen without this.\n if (\n persistedDisplayModeRef.current === ChatbotDisplayMode.embedded &&\n isLightspeedRouteRef.current\n ) {\n navigate(lightspeedRoutePath(id), { replace: true });\n }\n },\n [navigate],\n );\n\n const setDraftMessage = useCallback((message: string) => {\n setDraftMessageState(message);\n }, []);\n\n const setDraftFileContents = useCallback((files: FileContent[]) => {\n setDraftFileContentsState(files);\n }, []);\n\n const consumePendingOverlayThreadHandoff = useCallback(() => {\n if (!pendingOverlayThreadHandoffRef.current) {\n return false;\n }\n pendingOverlayThreadHandoffRef.current = false;\n return true;\n }, []);\n\n const setDisplayMode = useCallback(\n (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n if (embeddedNotebooks) {\n const path =\n embeddedNotebooks === 'notebooks'\n ? `${LIGHTSPEED_PATH}/notebooks`\n : `${LIGHTSPEED_PATH}/notebooks/${embeddedNotebooks.notebookSessionId}`;\n navigate(path);\n } else if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\n }\n setIsOpen(true);\n } else {\n // Notebooks exist only in fullscreen; leaving embedded for overlay/docked\n // must not keep shellViewTab on Notebooks (next fullscreen open should be Chat).\n setShellViewTab(0);\n if (isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = true;\n pendingOverlayThreadHandoffRef.current = true;\n leaveLightspeedRouteForShellDisplayMode();\n }\n setIsOpen(true);\n }\n },\n [\n currentConversationIdState,\n displayModeState,\n isLightspeedRoute,\n leaveLightspeedRouteForShellDisplayMode,\n navigate,\n setPersistedDisplayMode,\n setShellViewTab,\n syncShellDrawerForMode,\n ],\n );\n\n const shouldRenderOverlayModal =\n isOpen &&\n displayModeState === ChatbotDisplayMode.default &&\n !isLightspeedRoute;\n\n const contextValue = useMemo(\n () => ({\n isChatbotActive: isOpen,\n toggleChatbot,\n displayMode: displayModeState,\n setDisplayMode,\n drawerWidth,\n setDrawerWidth,\n currentConversationId: currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n }),\n [\n isOpen,\n toggleChatbot,\n displayModeState,\n setDisplayMode,\n drawerWidth,\n currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n ],\n );\n\n return {\n contextValue,\n shouldRenderOverlayModal,\n closeChatbot,\n };\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-lightspeed",
3
- "version": "2.6.1",
3
+ "version": "2.6.3",
4
4
  "main": "./dist/index.esm.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -86,7 +86,7 @@
86
86
  "@patternfly/react-icons": "^6.3.1",
87
87
  "@patternfly/react-table": "^6.4.1",
88
88
  "@red-hat-developer-hub/backstage-plugin-app-react": "^0.0.3",
89
- "@red-hat-developer-hub/backstage-plugin-lightspeed-common": "^2.6.1",
89
+ "@red-hat-developer-hub/backstage-plugin-lightspeed-common": "^2.6.3",
90
90
  "@red-hat-developer-hub/backstage-plugin-theme": "^0.12.0",
91
91
  "@tanstack/react-query": "^5.59.15",
92
92
  "monaco-editor": "^0.55.0",