@red-hat-developer-hub/backstage-plugin-intelligent-assistant 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +23 -3
  3. package/config.schema.json +117 -0
  4. package/dist/api/NotebooksApiClient.esm.js +3 -2
  5. package/dist/api/NotebooksApiClient.esm.js.map +1 -1
  6. package/dist/api/notebooksApi.esm.js.map +1 -1
  7. package/dist/components/LightSpeedChat.esm.js +280 -118
  8. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  9. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  10. package/dist/components/LightspeedDrawerProvider.esm.js +5 -4
  11. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
  12. package/dist/components/ToastAlertGroup.esm.js +56 -0
  13. package/dist/components/ToastAlertGroup.esm.js.map +1 -0
  14. package/dist/components/notebooks/AddDocumentModal.esm.js +165 -144
  15. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
  16. package/dist/components/notebooks/DeleteDocumentModal.esm.js +73 -38
  17. package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -1
  18. package/dist/components/notebooks/DeleteNotebookModal.esm.js +80 -40
  19. package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -1
  20. package/dist/components/notebooks/NotebookHeaderActions.esm.js +78 -0
  21. package/dist/components/notebooks/NotebookHeaderActions.esm.js.map +1 -0
  22. package/dist/components/notebooks/NotebookStreamProvider.esm.js +47 -0
  23. package/dist/components/notebooks/NotebookStreamProvider.esm.js.map +1 -0
  24. package/dist/components/notebooks/NotebookView.esm.js +284 -349
  25. package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
  26. package/dist/components/notebooks/NotebooksTab.esm.js +2 -2
  27. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
  28. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +126 -82
  29. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
  30. package/dist/components/notebooks/SidebarCollapseIcon.esm.js +8 -6
  31. package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -1
  32. package/dist/components/notebooks/UploadResourceScreen.esm.js +1 -0
  33. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
  34. package/dist/components/notebooks/notebookDialogStyles.esm.js +40 -0
  35. package/dist/components/notebooks/notebookDialogStyles.esm.js.map +1 -0
  36. package/dist/components/notebooks/notebookStreamStore.esm.js +282 -0
  37. package/dist/components/notebooks/notebookStreamStore.esm.js.map +1 -0
  38. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +3 -2
  39. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -1
  40. package/dist/hooks/useConversationMessages.esm.js +31 -108
  41. package/dist/hooks/useConversationMessages.esm.js.map +1 -1
  42. package/dist/hooks/useLightspeedProviderState.esm.js +14 -5
  43. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
  44. package/dist/index.esm.js +2 -2
  45. package/dist/index.esm.js.map +1 -1
  46. package/dist/utils/dom-extractor.esm.js +816 -0
  47. package/dist/utils/dom-extractor.esm.js.map +1 -0
  48. package/dist/utils/dom-selectors.esm.js +91 -0
  49. package/dist/utils/dom-selectors.esm.js.map +1 -0
  50. package/dist/utils/scoped-dialog-utils.esm.js +35 -0
  51. package/dist/utils/scoped-dialog-utils.esm.js.map +1 -0
  52. package/dist/utils/sensitive-data-redactor.esm.js +66 -0
  53. package/dist/utils/sensitive-data-redactor.esm.js.map +1 -0
  54. package/dist/utils/stream-event-helpers.esm.js +105 -0
  55. package/dist/utils/stream-event-helpers.esm.js.map +1 -0
  56. package/package.json +14 -14
  57. package/config.d.ts +0 -99
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-extractor.esm.js","sources":["../../src/utils/dom-extractor.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 {\n ACCORDION_DETAILS_SELECTOR,\n ACCORDION_ROOT_SELECTOR,\n ACCORDION_SUMMARY_CONTENT_SELECTOR,\n ACTIVE_NAV_SELECTOR,\n ACTIVE_TAB_SELECTOR,\n ALERT_SELECTOR,\n BREADCRUMB_SELECTOR,\n BUI_NAV_ITEM_SELECTOR,\n BUI_NAV_SELECTOR,\n CARD_ITEM_SELECTOR,\n CARD_LAYOUT_SELECTOR,\n CARD_ROOT_SELECTOR,\n CARD_TITLE_SELECTOR,\n CHIP_LABEL_SELECTOR,\n DIALOG_CONTENT_SELECTOR,\n DIALOG_TITLE_SELECTOR,\n DOCKED_DRAWER_BODY_CLASS,\n DRAWER_PAPER_SELECTOR,\n EMPTY_STATE_BODY_SELECTOR,\n EMPTY_STATE_SELECTOR,\n FILTER_BOX_SELECTOR,\n FILTER_CONTAINER_SELECTOR,\n FILTER_NAV_SELECTOR,\n FORM_CONTROL_LABEL_SELECTOR,\n FORM_CONTROL_SELECTOR,\n FORM_HTML_STRIP_SELECTOR,\n FORM_LABEL_SELECTOR,\n LIST_ITEM_TEXT_PRIMARY_SELECTOR,\n LIST_ITEM_TEXT_ROOT_SELECTOR,\n LIST_ITEM_TEXT_SECONDARY_SELECTOR,\n MENU_SELECTOR,\n MODAL_DIALOG_SELECTOR,\n NOISE_SELECTOR,\n PAGE_TITLE_SELECTOR,\n PAGINATION_ACTIONS_SELECTOR,\n PAGINATION_ROOT_SELECTOR,\n PLUGIN_NAME_SELECTOR,\n RECHARTS_LEGEND_SELECTOR,\n RJSF_FORM_SELECTOR,\n SEARCH_INPUT_SELECTOR,\n SELECT_DISPLAY_SELECTOR,\n SELECTED_ITEM_SELECTOR,\n SHADOW_HOST_SELECTOR,\n SHADOW_NOISE_SELECTOR,\n STATUS_INDICATOR_SELECTOR,\n STEPPER_ACTIVE_CLASS,\n STEPPER_COMPLETED_CLASS,\n STEPPER_LABEL_SELECTOR,\n STEPPER_ROOT_SELECTOR,\n TAB_LIST_SELECTOR,\n TAB_SELECTOR,\n} from './dom-selectors';\nimport { isSensitiveElement, redactText } from './sensitive-data-redactor';\n\nconst DEFAULT_MAX_CHARS = 8000;\nconst MAX_TABLE_ROWS = 50;\nconst MAX_TABLES = 10;\nconst MAX_CARDS = 10;\nconst MAX_CARD_CHARS = 500;\nconst MIN_CARDS_THRESHOLD = 1;\nconst MAX_FORM_HTML_CHARS = 4000;\nconst SENSITIVE_VALUE = '[REDACTED]';\n\nexport interface DomExtractionOptions {\n /** Maximum characters in the output (default: 8000) */\n maxChars?: number;\n /** Additional CSS selector for elements to exclude */\n excludeSelector?: string;\n}\n\n/**\n * Extracts structured page context from the current RHDH viewport.\n * Returns a plain text string suitable for LLM consumption as an attachment.\n *\n * Extraction priority:\n * header > overlay > search inputs > filters >\n * alerts > stepper > headings > status >\n * forms (HTML) > tables > description lists > empty state > pagination >\n * body text > shadow DOM.\n *\n * Stops appending when maxChars budget is reached.\n */\nexport function extractPageContext(options?: DomExtractionOptions): string {\n try {\n return extractPageContextInternal(options);\n } catch {\n return '';\n }\n}\n\nfunction extractPageContextInternal(options?: DomExtractionOptions): string {\n const maxChars = options?.maxChars ?? DEFAULT_MAX_CHARS;\n\n const root = document.querySelector('#root');\n if (!root) {\n return '';\n }\n\n const clone = root.cloneNode(true) as HTMLElement;\n\n clone.querySelectorAll(NOISE_SELECTOR).forEach(el => el.remove());\n if (options?.excludeSelector) {\n clone.querySelectorAll(options.excludeSelector).forEach(el => el.remove());\n }\n\n const sections: string[] = [];\n let charCount = 0;\n\n const appendSection = (content: string): boolean => {\n if (!content.trim()) return true;\n if (charCount + content.length > maxChars) {\n const remaining = maxChars - charCount;\n if (remaining > 50) {\n sections.push(content.slice(0, remaining));\n charCount = maxChars;\n }\n return false;\n }\n sections.push(content);\n charCount += content.length;\n return true;\n };\n\n // 1. Header -- always included (reads from live DOM for accurate selectors)\n const headerLines = [`Page: ${window.location.pathname}`];\n\n const pluginName = document\n .querySelector(PLUGIN_NAME_SELECTOR)\n ?.textContent?.trim();\n if (pluginName) {\n headerLines.push(`Plugin: ${pluginName}`);\n }\n\n const pageTitle = document\n .querySelector(PAGE_TITLE_SELECTOR)\n ?.textContent?.trim();\n if (pageTitle) {\n headerLines.push(`Title: ${pageTitle}`);\n }\n\n const activeTab = document\n .querySelector(ACTIVE_TAB_SELECTOR)\n ?.textContent?.trim();\n if (activeTab) {\n headerLines.push(`CurrentTab: ${activeTab}`);\n }\n\n const breadcrumb = document.querySelector(BREADCRUMB_SELECTOR);\n if (breadcrumb) {\n const crumbs = Array.from(breadcrumb.querySelectorAll('li, a, p'))\n .map(el => el.textContent?.trim())\n .filter(Boolean);\n if (crumbs.length > 0) {\n headerLines.push(`Breadcrumb: ${crumbs.join(' > ')}`);\n }\n }\n\n const activeNav = document\n .querySelector(ACTIVE_NAV_SELECTOR)\n ?.textContent?.trim();\n if (activeNav) {\n headerLines.push(`Nav: ${activeNav}`);\n }\n\n headerLines.push(`Document: ${document.title}`);\n\n const header = headerLines.join('\\n');\n if (!appendSection(header)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 2. Active overlay -- dialog/modal/drawer content takes priority\n const overlayText = extractActiveOverlay();\n if (overlayText && !appendSection(overlayText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 3. Search inputs (live DOM — cloneNode does not preserve input values)\n const searchText = extractSearchInputs();\n if (searchText && !appendSection(searchText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 4. Filter sections (live DOM — needs live checked/selected state)\n const filterText = extractFilterSections();\n if (filterText && !appendSection(filterText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 5. Tabs (all tabs including active marker)\n const tabsText = extractTabs(clone);\n if (tabsText && !appendSection(tabsText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 6. Remove navigation noise (after breadcrumb/search extraction above)\n clone.querySelectorAll('nav, [role=\"navigation\"]').forEach(el => el.remove());\n\n // 7. Alerts / Toasts\n const alertText = extractAlerts(clone);\n if (alertText && !appendSection(alertText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 8. Stepper state\n const stepperText = extractStepperState(clone);\n if (stepperText && !appendSection(stepperText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 9. Cards (dashboard grouped extraction — before headings so card-internal h2/h3 don't leak)\n const cardsText = extractCards(clone);\n if (cardsText && !appendSection(cardsText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 10. Headings\n const headingsText = extractHeadings(clone);\n if (headingsText && !appendSection(headingsText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 11. Status indicators\n const statusText = extractStatusIndicators(clone);\n if (statusText && !appendSection(statusText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 12. Form fields (hybrid HTML — preserves label/input structure)\n const formsText = extractFormFields(clone);\n if (formsText && !appendSection(formsText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 13. Tables (also captures StructuredMetadataTable)\n const tablesText = extractTables(clone);\n if (tablesText && !appendSection(tablesText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 14. Description lists (dl/dt/dd key-value pairs)\n const dlText = extractDescriptionLists(clone);\n if (dlText && !appendSection(dlText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 15. Empty states\n const emptyText = extractEmptyState(clone);\n if (emptyText && !appendSection(emptyText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 16. Pagination context\n const paginationText = extractPagination(clone);\n if (paginationText && !appendSection(paginationText)) {\n return redactText(sections.join('\\n\\n'));\n }\n\n // 17. Body text (TreeWalker) -- fills remaining budget\n const bodyText = extractBodyText(clone, maxChars - charCount);\n if (bodyText) {\n appendSection(bodyText);\n }\n\n // 18. TechDocs Shadow DOM (if present on the live DOM)\n const shadowText = extractShadowDomContent();\n if (shadowText) {\n appendSection(shadowText);\n }\n\n const result = sections.join('\\n\\n');\n return result ? redactText(result) : '';\n}\n\nfunction extractActiveOverlay(): string {\n const dialog = document.querySelector(MODAL_DIALOG_SELECTOR);\n if (dialog) {\n const title = dialog\n .querySelector(DIALOG_TITLE_SELECTOR)\n ?.textContent?.trim();\n const content = collapseWhitespace(\n dialog.querySelector(DIALOG_CONTENT_SELECTOR)?.textContent || '',\n );\n const lines = ['## Active Dialog'];\n if (title) lines.push(`Title: ${title}`);\n if (content) lines.push(content);\n return lines.length > 1 ? lines.join('\\n') : '';\n }\n\n if (document.body.classList.contains(DOCKED_DRAWER_BODY_CLASS)) {\n const drawerPaper = document.querySelector(DRAWER_PAPER_SELECTOR);\n if (drawerPaper && !drawerPaper.querySelector('.pf-chatbot')) {\n const text = collapseWhitespace(drawerPaper.textContent || '');\n if (text) {\n return `## Active Drawer\\n${text.slice(0, 2000)}`;\n }\n }\n }\n\n return '';\n}\n\nfunction extractAlerts(root: HTMLElement): string {\n const alerts = root.querySelectorAll(ALERT_SELECTOR);\n if (alerts.length === 0) return '';\n\n const lines: string[] = ['## Alerts'];\n alerts.forEach(alert => {\n const text = collapseWhitespace(alert.textContent || '');\n if (text) {\n lines.push(`- ${text}`);\n }\n alert.remove();\n });\n\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractStepperState(root: HTMLElement): string {\n const steppers = root.querySelectorAll(STEPPER_ROOT_SELECTOR);\n if (steppers.length === 0) return '';\n\n const lines: string[] = ['## Stepper'];\n steppers.forEach(stepper => {\n const labels = stepper.querySelectorAll(STEPPER_LABEL_SELECTOR);\n labels.forEach(label => {\n const text = label.textContent?.trim();\n if (!text) return;\n const className = label.className || '';\n const isActive = className.includes(STEPPER_ACTIVE_CLASS);\n const isCompleted = className.includes(STEPPER_COMPLETED_CLASS);\n let marker = '';\n if (isActive) marker = ' [active]';\n else if (isCompleted) marker = ' [done]';\n lines.push(`- ${text}${marker}`);\n });\n stepper.remove();\n });\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractTabs(root: HTMLElement): string {\n const lines: string[] = ['## Tabs'];\n\n // Strategy 1: Standard role=\"tablist\" + role=\"tab\"\n const tabLists = root.querySelectorAll(TAB_LIST_SELECTOR);\n tabLists.forEach(tabList => {\n const tabs = tabList.querySelectorAll(TAB_SELECTOR);\n tabs.forEach(tab => {\n const text = collapseWhitespace(tab.textContent || '');\n if (!text) return;\n const isSelected = tab.getAttribute('aria-selected') === 'true';\n lines.push(`- ${text}${isSelected ? ' [active]' : ''}`);\n });\n tabList.remove();\n });\n\n // Strategy 2: BUI-style nav with <a aria-current=\"page\"> links\n if (lines.length <= 1) {\n const navs = root.querySelectorAll(BUI_NAV_SELECTOR);\n for (const nav of Array.from(navs)) {\n const links = nav.querySelectorAll(BUI_NAV_ITEM_SELECTOR);\n if (links.length < 2) continue;\n links.forEach(link => {\n const text = collapseWhitespace(link.textContent || '');\n if (!text) return;\n const isActive = link.getAttribute('aria-current') === 'page';\n lines.push(`- ${text}${isActive ? ' [active]' : ''}`);\n });\n nav.remove();\n break;\n }\n }\n\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractHeadings(root: HTMLElement): string {\n const headings = root.querySelectorAll('h1, h2, h3, h4');\n if (headings.length === 0) return '';\n\n const lines: string[] = ['## Headings'];\n headings.forEach(heading => {\n const level = parseInt(heading.tagName[1], 10);\n const indent = ' '.repeat(level - 1);\n const text = collapseWhitespace(heading.textContent || '');\n if (text) {\n lines.push(`${indent}- ${text}`);\n }\n heading.remove();\n });\n\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractCards(root: HTMLElement): string {\n try {\n let cardElements: Element[] = [];\n\n const hasTitle = (el: Element) => !!el.querySelector(CARD_TITLE_SELECTOR);\n\n // Strategy 1: Find cards within a recognized layout container\n const layouts = root.querySelectorAll(CARD_LAYOUT_SELECTOR);\n for (const layout of Array.from(layouts)) {\n const directCards = Array.from(layout.children).filter(el => {\n try {\n return el.matches(CARD_ITEM_SELECTOR) && hasTitle(el);\n } catch {\n return false;\n }\n });\n if (directCards.length >= MIN_CARDS_THRESHOLD) {\n cardElements = directCards;\n break;\n }\n // Also check one level deeper (grid item > card)\n const nestedCards: Element[] = [];\n for (const child of Array.from(layout.children)) {\n for (const grandchild of Array.from(child.children)) {\n try {\n if (\n grandchild.matches(CARD_ITEM_SELECTOR) &&\n hasTitle(grandchild)\n ) {\n nestedCards.push(grandchild);\n }\n } catch {\n /* skip */\n }\n }\n }\n if (nestedCards.length >= MIN_CARDS_THRESHOLD) {\n cardElements = nestedCards;\n break;\n }\n }\n\n // Strategy 2: Fallback — find all card items in root regardless of layout container\n if (cardElements.length < MIN_CARDS_THRESHOLD) {\n const allCards = Array.from(\n root.querySelectorAll(CARD_ITEM_SELECTOR),\n ).filter(el => {\n // Exclude nested cards (card within card)\n if (el.parentElement?.closest(CARD_ITEM_SELECTOR)) return false;\n return hasTitle(el);\n });\n if (allCards.length >= MIN_CARDS_THRESHOLD) {\n cardElements = allCards;\n }\n }\n\n if (cardElements.length < MIN_CARDS_THRESHOLD) return '';\n\n const sections: string[] = ['## Cards'];\n let totalChars = 0;\n let cardCount = 0;\n\n for (const card of cardElements) {\n if (cardCount >= MAX_CARDS) break;\n\n const titleEl = card.querySelector(CARD_TITLE_SELECTOR);\n const title = collapseWhitespace(titleEl?.textContent || '').replace(\n /\\s*\\*$/,\n '',\n );\n if (!title) {\n card.remove();\n continue;\n }\n\n const cardLines: string[] = [`### ${title}`];\n\n // Extract chart legend (before SVG removal in body text)\n const legendItems = card.querySelectorAll(RECHARTS_LEGEND_SELECTOR);\n if (legendItems.length > 0) {\n const seriesNames = Array.from(legendItems)\n .map(el => collapseWhitespace(el.textContent || ''))\n .filter(Boolean);\n if (seriesNames.length > 0) {\n cardLines.push(`Chart: ${seriesNames.join(', ')}`);\n }\n }\n\n // Remove noise from within card for text extraction\n card\n .querySelectorAll('svg, button, [aria-hidden=\"true\"], hr, tfoot')\n .forEach(el => el.remove());\n // Remove the title element itself to avoid duplication\n titleEl?.remove();\n\n // Extract table if present\n const table = card.querySelector('table');\n if (table) {\n const rows = table.querySelectorAll('tr');\n const tableLines: string[] = [];\n let rowCount = 0;\n rows.forEach(row => {\n if (rowCount >= MAX_TABLE_ROWS) return;\n const cells = row.querySelectorAll('th, td');\n const cellTexts = Array.from(cells).map(cell =>\n collapseWhitespace(cell.textContent || ''),\n );\n if (cellTexts.some(Boolean)) {\n tableLines.push(`| ${cellTexts.join(' | ')} |`);\n }\n rowCount++;\n });\n if (tableLines.length > 0) {\n cardLines.push(tableLines.join('\\n'));\n }\n table.remove();\n }\n\n // Extract structured key-value pairs from h2/h3 + value grids (e.g. About cards)\n const innerHeadings = card.querySelectorAll('h2, h3');\n if (innerHeadings.length >= 2) {\n let extractedKV = false;\n innerHeadings.forEach(h => {\n const key = collapseWhitespace(h.textContent || '');\n if (!key) return;\n // Get value from next sibling or parent container (after heading)\n const parent = h.parentElement;\n if (!parent) return;\n const cloned = parent.cloneNode(true) as HTMLElement;\n const hClone = cloned.querySelector(h.tagName.toLowerCase());\n hClone?.remove();\n const val = collapseWhitespace(cloned.textContent || '') || '--';\n cardLines.push(`${key}: ${val}`);\n extractedKV = true;\n h.remove();\n });\n if (extractedKV) {\n // Remove already-extracted content from raw text pass\n innerHeadings.forEach(h => h.remove());\n }\n }\n\n // Extract remaining text content (stats, summaries, empty states)\n const textContent = collapseWhitespace(card.textContent || '');\n if (textContent && textContent !== title) {\n cardLines.push(textContent);\n }\n\n const cardText = cardLines.join('\\n');\n if (totalChars + cardText.length > MAX_CARD_CHARS * MAX_CARDS) break;\n\n sections.push(\n cardText.length > MAX_CARD_CHARS\n ? cardText.slice(0, MAX_CARD_CHARS)\n : cardText,\n );\n totalChars += Math.min(cardText.length, MAX_CARD_CHARS);\n cardCount++;\n card.remove();\n }\n\n return sections.length > 1 ? sections.join('\\n\\n') : '';\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log('[DOM Cards] Error in extractCards:', e);\n return '';\n }\n}\n\nfunction extractStatusIndicators(root: HTMLElement): string {\n const indicators = root.querySelectorAll(STATUS_INDICATOR_SELECTOR);\n if (indicators.length === 0) return '';\n\n const lines: string[] = ['## Status'];\n const seen = new Set<string>();\n indicators.forEach(el => {\n if (el.closest('td, th')) return;\n const status = el.getAttribute('aria-label')?.replace('Status ', '') || '';\n const text = el.textContent?.trim();\n const entry = text ? `${status}: ${text}` : status;\n if (entry && !seen.has(entry)) {\n seen.add(entry);\n lines.push(`- ${entry}`);\n }\n el.remove();\n });\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractFormFields(root: HTMLElement): string {\n const htmlParts: string[] = [];\n let totalChars = 0;\n\n const appendHtml = (html: string): boolean => {\n if (!html) return false;\n if (totalChars + html.length > MAX_FORM_HTML_CHARS) {\n const remaining = MAX_FORM_HTML_CHARS - totalChars;\n if (remaining > 100) {\n htmlParts.push(html.slice(0, remaining));\n totalChars = MAX_FORM_HTML_CHARS;\n }\n return false;\n }\n htmlParts.push(html);\n totalChars += html.length;\n return true;\n };\n\n // Strategy 1: serialize whole RJSF / standard forms (preserves array fields, nesting)\n // Search live DOM first (allows syncing runtime input values), then fallback to clone\n const liveForms = document.querySelectorAll(RJSF_FORM_SELECTOR);\n const cloneForms = root.querySelectorAll(RJSF_FORM_SELECTOR);\n const forms = liveForms.length > 0 ? liveForms : cloneForms;\n const formsSource = liveForms.length > 0 ? 'live' : 'clone';\n // eslint-disable-next-line no-console\n console.debug('[DOM Forms] Strategy 1:', {\n selector: RJSF_FORM_SELECTOR,\n liveFound: liveForms.length,\n cloneFound: cloneForms.length,\n using: formsSource,\n });\n if (forms.length > 0) {\n forms.forEach((form, idx) => {\n if (form.closest(FILTER_CONTAINER_SELECTOR)) {\n // eslint-disable-next-line no-console\n console.debug(\n `[DOM Forms] Form ${idx} skipped: inside filter container`,\n );\n return;\n }\n try {\n const html = serializeFormControlHtml(form as HTMLElement);\n // eslint-disable-next-line no-console\n console.debug(`[DOM Forms] Form ${idx} serialized:`, {\n length: html.length,\n preview: html.slice(0, 200),\n });\n appendHtml(html);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.debug(`[DOM Forms] Form ${idx} serialization error:`, e);\n }\n });\n if (htmlParts.length > 0) {\n root.querySelectorAll(RJSF_FORM_SELECTOR).forEach(el => el.remove());\n return `## Form Fields (HTML)\\n${htmlParts.join('\\n')}`;\n }\n }\n\n // Strategy 2: individual leaf form controls\n const liveControls = Array.from(\n document.querySelectorAll(FORM_CONTROL_SELECTOR),\n );\n const cloneControls = Array.from(\n root.querySelectorAll(FORM_CONTROL_SELECTOR),\n );\n // Use live controls when available (allows syncLiveValuesToClone), fall back to clone\n const controlsSource = liveControls.length > 0 ? liveControls : cloneControls;\n // eslint-disable-next-line no-console\n console.debug('[DOM Forms] Strategy 2:', {\n selector: FORM_CONTROL_SELECTOR,\n liveCount: liveControls.length,\n cloneCount: cloneControls.length,\n using: liveControls.length > 0 ? 'live' : 'clone',\n });\n if (controlsSource.length === 0) return '';\n\n const leafControls = controlsSource.filter(\n control => !control.querySelector(FORM_CONTROL_SELECTOR),\n );\n\n leafControls.forEach(control => {\n if (control.closest(FILTER_CONTAINER_SELECTOR)) return;\n if (control.closest(RJSF_FORM_SELECTOR)) return;\n\n const searchInput = control.querySelector(SEARCH_INPUT_SELECTOR);\n if (\n searchInput &&\n !control.querySelector(\n `${SELECT_DISPLAY_SELECTOR}, ${CHIP_LABEL_SELECTOR}, input[type=\"checkbox\"]`,\n )\n ) {\n return;\n }\n\n try {\n appendHtml(serializeFormControlHtml(control as HTMLElement));\n } catch {\n // individual control serialization failure is non-fatal\n }\n });\n\n root.querySelectorAll(FORM_CONTROL_SELECTOR).forEach(el => el.remove());\n return htmlParts.length > 0\n ? `## Form Fields (HTML)\\n${htmlParts.join('\\n')}`\n : '';\n}\n\nfunction serializeFormControlHtml(control: HTMLElement): string {\n const clone = control.cloneNode(true) as HTMLElement;\n\n clone.querySelectorAll(FORM_HTML_STRIP_SELECTOR).forEach(el => el.remove());\n\n syncLiveValuesToClone(control, clone);\n redactSensitiveInClone(clone);\n stripPresentationAttributes(clone);\n unwrapNoiseDivs(clone);\n\n const html = clone.outerHTML.replace(/\\s+/g, ' ').trim();\n // eslint-disable-next-line no-console\n console.debug('[DOM Forms] serializeFormControlHtml result:', {\n inputTag: control.tagName,\n inputClass: control.className?.slice(0, 80),\n outputLength: html.length,\n });\n return html.length > 0 ? html : '';\n}\n\nfunction syncLiveValuesToClone(\n liveRoot: HTMLElement,\n cloneRoot: HTMLElement,\n): void {\n const liveInputs = liveRoot.querySelectorAll('input, textarea, select');\n const cloneInputs = cloneRoot.querySelectorAll('input, textarea, select');\n\n liveInputs.forEach((liveEl, i) => {\n const cloneEl = cloneInputs[i] as\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | undefined;\n if (!cloneEl) return;\n\n if (cloneEl instanceof HTMLSelectElement) {\n cloneEl.value = (liveEl as HTMLSelectElement).value;\n } else if (\n cloneEl instanceof HTMLInputElement &&\n (cloneEl.type === 'checkbox' || cloneEl.type === 'radio')\n ) {\n cloneEl.checked = (liveEl as HTMLInputElement).checked;\n if (cloneEl.checked) {\n cloneEl.setAttribute('checked', '');\n } else {\n cloneEl.removeAttribute('checked');\n }\n } else {\n const liveValue = (liveEl as HTMLInputElement | HTMLTextAreaElement)\n .value;\n cloneEl.value = liveValue;\n cloneEl.setAttribute('value', liveValue);\n }\n });\n}\n\nfunction redactSensitiveInClone(root: HTMLElement): void {\n root.querySelectorAll('input, textarea, select').forEach(el => {\n if (isSensitiveElement(el, document)) {\n (el as HTMLInputElement).value = SENSITIVE_VALUE;\n el.setAttribute('value', SENSITIVE_VALUE);\n if ((el as HTMLInputElement).type === 'checkbox') {\n (el as HTMLInputElement).checked = false;\n el.removeAttribute('checked');\n }\n }\n });\n}\n\nfunction stripPresentationAttributes(root: HTMLElement): void {\n root.removeAttribute('class');\n root.removeAttribute('style');\n root.querySelectorAll('*').forEach(el => {\n el.removeAttribute('class');\n el.removeAttribute('style');\n el.removeAttribute('data-testid');\n });\n}\n\n/**\n * Recursively unwraps wrapper divs/spans that have no semantic meaning\n * (no id, no aria-*, no role). Replaces the wrapper with its children in-place.\n * This flattens MUI's deeply nested grid/box structure to reduce HTML size.\n */\nfunction unwrapNoiseDivs(root: HTMLElement): void {\n const isSemanticTag = (tag: string) => !['DIV', 'SPAN'].includes(tag);\n\n const hasSemanticAttrs = (el: Element) =>\n el.hasAttribute('id') ||\n el.hasAttribute('role') ||\n el.hasAttribute('aria-label') ||\n el.hasAttribute('aria-describedby') ||\n el.hasAttribute('for') ||\n el.hasAttribute('novalidate');\n\n let changed = true;\n while (changed) {\n changed = false;\n const wrappers = root.querySelectorAll('div, span');\n for (const el of Array.from(wrappers)) {\n if (isSemanticTag(el.tagName)) continue;\n if (hasSemanticAttrs(el)) continue;\n if (el === root) continue;\n\n const parent = el.parentNode;\n if (!parent) continue;\n\n while (el.firstChild) {\n parent.insertBefore(el.firstChild, el);\n }\n parent.removeChild(el);\n changed = true;\n }\n }\n}\n\nfunction extractSearchInputs(): string {\n const searchInputs = document.querySelectorAll(SEARCH_INPUT_SELECTOR);\n if (searchInputs.length === 0) return '';\n\n const lines: string[] = ['## Search'];\n const seen = new Set<string>();\n\n searchInputs.forEach(el => {\n const input = el as HTMLInputElement;\n if (input.type === 'hidden') return;\n\n const label =\n input.getAttribute('placeholder') ||\n input.getAttribute('aria-label') ||\n input.closest('[aria-label]')?.getAttribute('aria-label') ||\n 'Search';\n\n const value = isSensitiveElement(input, document)\n ? SENSITIVE_VALUE\n : input.value;\n\n const key = `${label}:${value}`;\n if (!seen.has(key)) {\n seen.add(key);\n lines.push(`- ${label}: ${value || '(empty)'}`);\n }\n });\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractFilterSections(): string {\n const lines: string[] = ['## Filters'];\n\n const filterNavs = document.querySelectorAll(FILTER_NAV_SELECTOR);\n filterNavs.forEach(nav => {\n const heading =\n nav\n .closest(ACCORDION_ROOT_SELECTOR)\n ?.previousElementSibling?.textContent?.trim() ||\n nav\n .closest(ACCORDION_DETAILS_SELECTOR)\n ?.closest(ACCORDION_ROOT_SELECTOR)\n ?.querySelector(ACCORDION_SUMMARY_CONTENT_SELECTOR)\n ?.textContent?.trim();\n const groupLabel =\n heading ||\n nav\n .closest(FILTER_BOX_SELECTOR)\n ?.querySelector('h2')\n ?.textContent?.trim();\n\n const selected = nav.querySelector(SELECTED_ITEM_SELECTOR);\n if (selected) {\n const primary = selected\n .querySelector(LIST_ITEM_TEXT_PRIMARY_SELECTOR)\n ?.textContent?.trim();\n const secondary = selected\n .querySelector(LIST_ITEM_TEXT_SECONDARY_SELECTOR)\n ?.textContent?.trim();\n const text = secondary ? `${primary} (${secondary})` : primary;\n if (groupLabel && text) {\n lines.push(`- ${groupLabel}: ${text}`);\n }\n }\n });\n\n const menus = document.querySelectorAll(MENU_SELECTOR);\n menus.forEach(menu => {\n const groupLabel =\n menu.getAttribute('aria-label') ||\n (\n menu.closest(CARD_ROOT_SELECTOR)?.previousElementSibling as HTMLElement\n )?.textContent?.trim();\n const selected = menu.querySelector(SELECTED_ITEM_SELECTOR);\n if (selected) {\n const selectedText = selected\n .querySelector(`p, ${LIST_ITEM_TEXT_ROOT_SELECTOR}`)\n ?.textContent?.trim();\n if (groupLabel && selectedText) {\n lines.push(`- ${groupLabel}: ${selectedText}`);\n }\n }\n });\n\n const filterContainers = document.querySelectorAll(FILTER_CONTAINER_SELECTOR);\n filterContainers.forEach(container => {\n const resolved = resolveFilterControl(container as HTMLElement);\n if (resolved && resolved.label) {\n lines.push(`- ${resolved.label}: ${resolved.value || '(empty)'}`);\n }\n });\n\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction resolveFilterControl(\n container: HTMLElement,\n): { label: string; value: string } | null {\n const labelEl = container.querySelector(`label, ${FORM_LABEL_SELECTOR}`);\n let label =\n labelEl?.textContent?.trim() || container.getAttribute('aria-label') || '';\n\n const selectDisplay = container.querySelector(SELECT_DISPLAY_SELECTOR);\n if (selectDisplay) {\n if (!label) {\n label =\n container.querySelector('[aria-label]')?.getAttribute('aria-label') ||\n '';\n }\n return { label, value: selectDisplay.textContent?.trim() || '' };\n }\n\n const chips = container.querySelectorAll(CHIP_LABEL_SELECTOR);\n if (chips.length > 0) {\n const chipValues = Array.from(chips)\n .map(c => c.textContent?.trim())\n .filter(Boolean);\n return { label, value: chipValues.join(', ') };\n }\n\n const checkboxes = container.querySelectorAll('input[type=\"checkbox\"]');\n if (checkboxes.length > 0) {\n const checked: string[] = [];\n checkboxes.forEach(cb => {\n const input = cb as HTMLInputElement;\n if (input.checked) {\n const cbLabel =\n cb\n .closest('label')\n ?.querySelector(FORM_CONTROL_LABEL_SELECTOR)\n ?.textContent?.trim() || input.value;\n checked.push(cbLabel);\n }\n });\n return { label, value: checked.join(', ') };\n }\n\n const input = container.querySelector(\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([aria-hidden=\"true\"]):not([placeholder*=\"earch\" i]), textarea',\n ) as HTMLInputElement | null;\n if (input) {\n if (!label) {\n label = input.getAttribute('placeholder') || '';\n }\n const value = isSensitiveElement(input, document)\n ? SENSITIVE_VALUE\n : input.value || '';\n return { label, value };\n }\n\n return null;\n}\n\nfunction extractTables(root: HTMLElement): string {\n const tables = root.querySelectorAll('table');\n if (tables.length === 0) return '';\n\n const output: string[] = ['## Tables'];\n let tableCount = 0;\n\n tables.forEach(table => {\n if (tableCount >= MAX_TABLES) {\n table.remove();\n return;\n }\n\n // Strip pagination footers and empty spacer rows\n table.querySelectorAll('tfoot').forEach(el => el.remove());\n table\n .querySelectorAll('[class*=\"TablePagination\"]')\n .forEach(el => el.remove());\n\n const rows = table.querySelectorAll('tr');\n const tableLines: string[] = [];\n let rowCount = 0;\n\n rows.forEach(row => {\n if (rowCount >= MAX_TABLE_ROWS) return;\n // Skip empty spacer rows (height-only, no content)\n if (!row.querySelector('th, td') || row.children.length === 0) return;\n const cells = row.querySelectorAll('th, td');\n const cellTexts = Array.from(cells).map(cell =>\n collapseWhitespace(cell.textContent || ''),\n );\n if (cellTexts.some(Boolean)) {\n tableLines.push(`| ${cellTexts.join(' | ')} |`);\n }\n rowCount++;\n });\n\n if (tableLines.length > 0) {\n output.push(tableLines.join('\\n'));\n }\n\n table.remove();\n tableCount++;\n });\n\n return output.length > 1 ? output.join('\\n') : '';\n}\n\nfunction extractDescriptionLists(root: HTMLElement): string {\n const dls = root.querySelectorAll('dl');\n if (dls.length === 0) return '';\n\n const lines: string[] = ['## Details'];\n dls.forEach(dl => {\n const terms = dl.querySelectorAll('dt');\n terms.forEach(dt => {\n const key = collapseWhitespace(dt.textContent || '');\n const dd = dt.nextElementSibling;\n const val =\n dd?.tagName === 'DD' ? collapseWhitespace(dd.textContent || '') : '';\n if (key) lines.push(`- ${key}: ${val}`);\n });\n dl.remove();\n });\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractEmptyState(root: HTMLElement): string {\n const emptyState = root.querySelector(EMPTY_STATE_SELECTOR);\n if (!emptyState) return '';\n\n const title = emptyState.querySelector('h5')?.textContent?.trim();\n const desc = emptyState\n .querySelector(EMPTY_STATE_BODY_SELECTOR)\n ?.textContent?.trim();\n const lines = ['## Empty State'];\n if (title) lines.push(`Title: ${title}`);\n if (desc) lines.push(desc);\n emptyState.remove();\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractPagination(root: HTMLElement): string {\n const paginations = root.querySelectorAll(PAGINATION_ROOT_SELECTOR);\n if (paginations.length === 0) return '';\n\n const lines: string[] = [];\n paginations.forEach(pg => {\n const hasActions = pg.querySelector(PAGINATION_ACTIONS_SELECTOR);\n if (hasActions) {\n const text = collapseWhitespace(pg.textContent || '');\n if (text) lines.push(`Pagination: ${text}`);\n }\n pg.remove();\n });\n return lines.length > 0 ? lines.join('\\n') : '';\n}\n\nfunction extractBodyText(root: HTMLElement, budget: number): string {\n if (budget <= 0) return '';\n\n const preBlocks = root.querySelectorAll('pre');\n const preTexts: string[] = [];\n preBlocks.forEach(pre => {\n const text = pre.textContent || '';\n if (text.trim()) {\n preTexts.push(text.slice(0, 500));\n }\n pre.remove();\n });\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n const lines: string[] = ['## Content'];\n let length = lines[0].length;\n const seen = new Set<string>();\n\n for (const preText of preTexts) {\n const block = `\\`\\`\\`\\n${preText}\\n\\`\\`\\``;\n const blockLength = block.length + 1;\n if (length + blockLength > budget) break;\n lines.push(block);\n length += blockLength;\n }\n\n let node = walker.nextNode();\n while (node) {\n const text = collapseWhitespace(node.textContent || '');\n if (text && text.length > 1 && !seen.has(text)) {\n seen.add(text);\n const lineLength = text.length + 1;\n if (length + lineLength > budget) {\n break;\n }\n lines.push(text);\n length += lineLength;\n }\n node = walker.nextNode();\n }\n\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction extractShadowDomContent(): string {\n const shadowHosts = document.querySelectorAll(SHADOW_HOST_SELECTOR);\n if (shadowHosts.length === 0) return '';\n\n const lines: string[] = ['## Documentation'];\n\n shadowHosts.forEach(host => {\n const root = host.shadowRoot;\n if (!root) return;\n\n const container =\n root.querySelector('article.md-content__inner') ||\n root.querySelector('.md-content__inner') ||\n root.querySelector('.md-typeset') ||\n root.querySelector('.md-content') ||\n root.querySelector('main');\n\n if (!container) return;\n\n container\n .querySelectorAll(SHADOW_NOISE_SELECTOR)\n .forEach(el => el.remove());\n\n const headings = container.querySelectorAll('h1, h2, h3, h4');\n if (headings.length > 0) {\n headings.forEach(h => {\n const level = parseInt(h.tagName[1], 10);\n const indent = ' '.repeat(level - 1);\n const text = h.textContent?.trim().replace(/¶/g, '');\n if (text) lines.push(`${indent}- ${text}`);\n });\n lines.push('');\n }\n\n container.querySelectorAll('p').forEach(p => {\n if (p.closest('.md-nav, .md-sidebar, .md-footer')) return;\n const text = collapseWhitespace(p.textContent || '').replace(/¶/g, '');\n if (text && text.length > 2) lines.push(text);\n });\n\n container.querySelectorAll('ul, ol').forEach(list => {\n if (list.closest('.md-nav, .md-sidebar, .md-footer')) return;\n list.querySelectorAll(':scope > li').forEach(li => {\n const text = collapseWhitespace(li.textContent || '').replace(/¶/g, '');\n if (text && text.length > 2) lines.push(`- ${text}`);\n });\n });\n\n container.querySelectorAll('pre').forEach(pre => {\n const code = pre.textContent?.trim();\n if (code) {\n lines.push(`\\`\\`\\`\\n${code.slice(0, 500)}\\n\\`\\`\\``);\n }\n });\n });\n\n return lines.length > 1 ? lines.join('\\n') : '';\n}\n\nfunction collapseWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n"],"names":["input"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ const NOISE_SELECTORS = [
2
+ ".pf-chatbot",
3
+ "script",
4
+ "style",
5
+ "noscript",
6
+ "svg",
7
+ "canvas",
8
+ "img",
9
+ "video",
10
+ "iframe",
11
+ '[aria-hidden="true"]:not([aria-label^="Status"])',
12
+ "[data-screen-capture-exclude]",
13
+ "[hidden]",
14
+ "footer",
15
+ '[class*="MuiCollapse-hidden"]',
16
+ '[data-testid="techdocs-native-shadowroot"]'
17
+ ];
18
+ const NOISE_SELECTOR = NOISE_SELECTORS.join(", ");
19
+ const PLUGIN_NAME_SELECTOR = ".bui-PluginHeaderToolbarName";
20
+ const PAGE_TITLE_SELECTOR = ".bui-HeaderTitle";
21
+ const ACTIVE_TAB_SELECTOR = '[role="tab"][aria-selected="true"]';
22
+ const BREADCRUMB_SELECTOR = '[aria-label="breadcrumb"], [class*="MuiBreadcrumbs-root"], [class*="bui-HeaderBreadcrumb"]';
23
+ const ACTIVE_NAV_SELECTOR = '[aria-current="page"]';
24
+ const TAB_LIST_SELECTOR = '[role="tablist"]';
25
+ const TAB_SELECTOR = '[role="tab"]';
26
+ const BUI_NAV_SELECTOR = 'nav[aria-label*="navigation" i], nav[class*="bui-HeaderNav"]';
27
+ const BUI_NAV_ITEM_SELECTOR = 'a[class*="NavItem"], a[href]';
28
+ const MODAL_DIALOG_SELECTOR = '[role="dialog"][aria-modal="true"]';
29
+ const DIALOG_TITLE_SELECTOR = '[class*="MuiDialogTitle"], [class*="bui-DialogHeaderTitle"]';
30
+ const DIALOG_CONTENT_SELECTOR = '[class*="MuiDialogContent"], [class*="bui-DialogBody"]';
31
+ const DRAWER_PAPER_SELECTOR = '[class*="MuiDrawer-paper"]';
32
+ const DOCKED_DRAWER_BODY_CLASS = "docked-drawer-open";
33
+ const ALERT_SELECTOR = '[role="alert"], [aria-live="assertive"], [class*="MuiAlert-root"], [class*="bui-Alert"]';
34
+ const STEPPER_ROOT_SELECTOR = '[class*="MuiStepper-root"]';
35
+ const STEPPER_LABEL_SELECTOR = '[class*="MuiStepLabel-label"]:not([class*="labelContainer"])';
36
+ const STEPPER_ACTIVE_CLASS = "Mui-active";
37
+ const STEPPER_COMPLETED_CLASS = "Mui-completed";
38
+ const STATUS_INDICATOR_SELECTOR = '[aria-label^="Status"]';
39
+ const RJSF_FORM_SELECTOR = 'form.rjsf, form[class*="rjsf"]';
40
+ const FORM_CONTROL_SELECTOR = '[class*="MuiFormControl-root"], [class*="MuiTextField-root"], [class*="bui-TextField"]';
41
+ const CHIP_LABEL_SELECTOR = '[class*="MuiChip-label"]';
42
+ const SELECT_DISPLAY_SELECTOR = '[class*="MuiSelect-select"]:not([class*="MuiTablePagination-select"])';
43
+ const FORM_CONTROL_LABEL_SELECTOR = '[class*="MuiFormControlLabel-label"]';
44
+ const FORM_LABEL_SELECTOR = '[class*="MuiFormLabel-root"], [class*="MuiInputLabel-root"]';
45
+ const FORM_HTML_STRIP_SELECTOR = [
46
+ "script",
47
+ "style",
48
+ "svg",
49
+ 'input[aria-hidden="true"]',
50
+ '[aria-hidden="true"]',
51
+ '[class*="MuiTouchRipple-root"]',
52
+ '[class*="MuiInputAdornment-root"]',
53
+ "fieldset",
54
+ "button"
55
+ ].join(", ");
56
+ const SEARCH_INPUT_SELECTOR = 'input[placeholder*="earch" i], input[aria-label*="earch" i], [aria-label="search" i] input';
57
+ const FILTER_CONTAINER_SELECTOR = '[data-testid*="filter"]';
58
+ const FILTER_NAV_SELECTOR = 'nav[aria-label*="filter"], [class*="MuiAccordionDetails-root"] nav';
59
+ const ACCORDION_ROOT_SELECTOR = '[class*="MuiAccordion-root"]';
60
+ const ACCORDION_DETAILS_SELECTOR = '[class*="MuiAccordionDetails-root"]';
61
+ const ACCORDION_SUMMARY_CONTENT_SELECTOR = '[class*="MuiAccordionSummary-content"]';
62
+ const FILTER_BOX_SELECTOR = '[class*="MuiBox-root"]';
63
+ const SELECTED_ITEM_SELECTOR = '[class*="Mui-selected"]';
64
+ const LIST_ITEM_TEXT_PRIMARY_SELECTOR = '[class*="MuiListItemText-primary"]';
65
+ const LIST_ITEM_TEXT_SECONDARY_SELECTOR = '[class*="MuiListItemText-secondary"]';
66
+ const MENU_SELECTOR = 'ul[role="menu"]';
67
+ const CARD_ROOT_SELECTOR = '[class*="MuiCard-root"]';
68
+ const LIST_ITEM_TEXT_ROOT_SELECTOR = '[class*="MuiListItemText-root"]';
69
+ const PAGINATION_ROOT_SELECTOR = '[class*="MuiTablePagination-root"], [class*="TablePagination"], [class*="bui-TablePagination"]';
70
+ const PAGINATION_ACTIONS_SELECTOR = '[class*="MuiTablePagination-actions"] button:not([disabled]), [class*="PaginationActions"] button:not([disabled])';
71
+ const CARD_LAYOUT_SELECTOR = [
72
+ '[class*="MuiMasonry-root"]',
73
+ '[class*="MuiGrid-container"]',
74
+ '[class*="pf-l-gallery"]',
75
+ '[class*="bui-Grid"]'
76
+ ].join(", ");
77
+ const CARD_ITEM_SELECTOR = [
78
+ '[class*="MuiPaper-root"]',
79
+ '[class*="MuiCard-root"]',
80
+ '.pf-v5-c-card, [class*="pf-c-card"]',
81
+ '[class*="bui-Card"]'
82
+ ].join(", ");
83
+ const CARD_TITLE_SELECTOR = 'h3, h4, h5, h6, [class*="CardHeader-title"]';
84
+ const RECHARTS_LEGEND_SELECTOR = '.recharts-legend-wrapper p, .recharts-legend-wrapper span[class*="Text"]';
85
+ const EMPTY_STATE_SELECTOR = '[class*="BackstageEmptyState"]';
86
+ const EMPTY_STATE_BODY_SELECTOR = '[class*="body1"]';
87
+ const SHADOW_HOST_SELECTOR = '[data-testid="techdocs-native-shadowroot"], [class*="shadowDom" i]';
88
+ const SHADOW_NOISE_SELECTOR = "style, script, link, noscript, svg, img, template";
89
+
90
+ export { ACCORDION_DETAILS_SELECTOR, ACCORDION_ROOT_SELECTOR, ACCORDION_SUMMARY_CONTENT_SELECTOR, ACTIVE_NAV_SELECTOR, ACTIVE_TAB_SELECTOR, ALERT_SELECTOR, BREADCRUMB_SELECTOR, BUI_NAV_ITEM_SELECTOR, BUI_NAV_SELECTOR, CARD_ITEM_SELECTOR, CARD_LAYOUT_SELECTOR, CARD_ROOT_SELECTOR, CARD_TITLE_SELECTOR, CHIP_LABEL_SELECTOR, DIALOG_CONTENT_SELECTOR, DIALOG_TITLE_SELECTOR, DOCKED_DRAWER_BODY_CLASS, DRAWER_PAPER_SELECTOR, EMPTY_STATE_BODY_SELECTOR, EMPTY_STATE_SELECTOR, FILTER_BOX_SELECTOR, FILTER_CONTAINER_SELECTOR, FILTER_NAV_SELECTOR, FORM_CONTROL_LABEL_SELECTOR, FORM_CONTROL_SELECTOR, FORM_HTML_STRIP_SELECTOR, FORM_LABEL_SELECTOR, LIST_ITEM_TEXT_PRIMARY_SELECTOR, LIST_ITEM_TEXT_ROOT_SELECTOR, LIST_ITEM_TEXT_SECONDARY_SELECTOR, MENU_SELECTOR, MODAL_DIALOG_SELECTOR, NOISE_SELECTOR, NOISE_SELECTORS, PAGE_TITLE_SELECTOR, PAGINATION_ACTIONS_SELECTOR, PAGINATION_ROOT_SELECTOR, PLUGIN_NAME_SELECTOR, RECHARTS_LEGEND_SELECTOR, RJSF_FORM_SELECTOR, SEARCH_INPUT_SELECTOR, SELECTED_ITEM_SELECTOR, SELECT_DISPLAY_SELECTOR, SHADOW_HOST_SELECTOR, SHADOW_NOISE_SELECTOR, STATUS_INDICATOR_SELECTOR, STEPPER_ACTIVE_CLASS, STEPPER_COMPLETED_CLASS, STEPPER_LABEL_SELECTOR, STEPPER_ROOT_SELECTOR, TAB_LIST_SELECTOR, TAB_SELECTOR };
91
+ //# sourceMappingURL=dom-selectors.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-selectors.esm.js","sources":["../../src/utils/dom-selectors.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\n/**\n * Centralized CSS selectors for DOM extraction.\n * Library-specific selectors (MUI, BUI, PF) are grouped here so they can be\n * updated in one place when BUI equivalents land upstream.\n *\n * MUI selectors use [class*=\"...\"] because JSS emits hashed class names\n * (e.g. MuiFormControl-root-12213) that do not match exact class selectors.\n */\n\n// ── Noise / exclusion ──\n\nexport const NOISE_SELECTORS = [\n '.pf-chatbot',\n 'script',\n 'style',\n 'noscript',\n 'svg',\n 'canvas',\n 'img',\n 'video',\n 'iframe',\n '[aria-hidden=\"true\"]:not([aria-label^=\"Status\"])',\n '[data-screen-capture-exclude]',\n '[hidden]',\n 'footer',\n '[class*=\"MuiCollapse-hidden\"]',\n '[data-testid=\"techdocs-native-shadowroot\"]',\n] as const;\n\nexport const NOISE_SELECTOR = NOISE_SELECTORS.join(', ');\n\n// ── Header ──\n\nexport const PLUGIN_NAME_SELECTOR = '.bui-PluginHeaderToolbarName';\nexport const PAGE_TITLE_SELECTOR = '.bui-HeaderTitle';\nexport const ACTIVE_TAB_SELECTOR = '[role=\"tab\"][aria-selected=\"true\"]';\nexport const BREADCRUMB_SELECTOR =\n '[aria-label=\"breadcrumb\"], [class*=\"MuiBreadcrumbs-root\"], [class*=\"bui-HeaderBreadcrumb\"]';\nexport const ACTIVE_NAV_SELECTOR = '[aria-current=\"page\"]';\n\n// ── Tabs ──\n\nexport const TAB_LIST_SELECTOR = '[role=\"tablist\"]';\nexport const TAB_SELECTOR = '[role=\"tab\"]';\nexport const BUI_NAV_SELECTOR =\n 'nav[aria-label*=\"navigation\" i], nav[class*=\"bui-HeaderNav\"]';\nexport const BUI_NAV_ITEM_SELECTOR = 'a[class*=\"NavItem\"], a[href]';\n\n// ── Dialog / overlay ──\n\nexport const MODAL_DIALOG_SELECTOR = '[role=\"dialog\"][aria-modal=\"true\"]';\nexport const DIALOG_TITLE_SELECTOR =\n '[class*=\"MuiDialogTitle\"], [class*=\"bui-DialogHeaderTitle\"]';\nexport const DIALOG_CONTENT_SELECTOR =\n '[class*=\"MuiDialogContent\"], [class*=\"bui-DialogBody\"]';\nexport const DRAWER_PAPER_SELECTOR = '[class*=\"MuiDrawer-paper\"]';\nexport const DOCKED_DRAWER_BODY_CLASS = 'docked-drawer-open';\n\n// ── Alerts ──\n\nexport const ALERT_SELECTOR =\n '[role=\"alert\"], [aria-live=\"assertive\"], [class*=\"MuiAlert-root\"], [class*=\"bui-Alert\"]';\n\n// ── Stepper ──\n\nexport const STEPPER_ROOT_SELECTOR = '[class*=\"MuiStepper-root\"]';\nexport const STEPPER_LABEL_SELECTOR =\n '[class*=\"MuiStepLabel-label\"]:not([class*=\"labelContainer\"])';\nexport const STEPPER_ACTIVE_CLASS = 'Mui-active';\nexport const STEPPER_COMPLETED_CLASS = 'Mui-completed';\n\n// ── Status ──\n\nexport const STATUS_INDICATOR_SELECTOR = '[aria-label^=\"Status\"]';\n\n// ── Forms ──\n\nexport const RJSF_FORM_SELECTOR = 'form.rjsf, form[class*=\"rjsf\"]';\nexport const FORM_CONTROL_SELECTOR =\n '[class*=\"MuiFormControl-root\"], [class*=\"MuiTextField-root\"], [class*=\"bui-TextField\"]';\nexport const FORM_HELPER_SELECTOR =\n '[class*=\"MuiFormHelperText-root\"], [slot=\"description\"]';\nexport const AUTOCOMPLETE_ROOT_SELECTOR = '[class*=\"MuiAutocomplete-root\"]';\nexport const TYPOGRAPHY_SELECTOR = '[class*=\"MuiTypography\"]';\nexport const CHIP_LABEL_SELECTOR = '[class*=\"MuiChip-label\"]';\nexport const SELECT_DISPLAY_SELECTOR =\n '[class*=\"MuiSelect-select\"]:not([class*=\"MuiTablePagination-select\"])';\nexport const SELECT_NATIVE_INPUT_SELECTOR = '[class*=\"MuiSelect-nativeInput\"]';\nexport const FORM_CONTROL_LABEL_SELECTOR =\n '[class*=\"MuiFormControlLabel-label\"]';\nexport const FORM_LABEL_SELECTOR =\n '[class*=\"MuiFormLabel-root\"], [class*=\"MuiInputLabel-root\"]';\n\n/** Nodes stripped when serializing form controls to compact HTML */\nexport const FORM_HTML_STRIP_SELECTOR = [\n 'script',\n 'style',\n 'svg',\n 'input[aria-hidden=\"true\"]',\n '[aria-hidden=\"true\"]',\n '[class*=\"MuiTouchRipple-root\"]',\n '[class*=\"MuiInputAdornment-root\"]',\n 'fieldset',\n 'button',\n].join(', ');\n\n// ── Search ──\n\nexport const SEARCH_INPUT_SELECTOR =\n 'input[placeholder*=\"earch\" i], input[aria-label*=\"earch\" i], [aria-label=\"search\" i] input';\n\n// ── Filters ──\n\nexport const FILTER_CONTAINER_SELECTOR = '[data-testid*=\"filter\"]';\nexport const FILTER_NAV_SELECTOR =\n 'nav[aria-label*=\"filter\"], [class*=\"MuiAccordionDetails-root\"] nav';\nexport const ACCORDION_ROOT_SELECTOR = '[class*=\"MuiAccordion-root\"]';\nexport const ACCORDION_DETAILS_SELECTOR = '[class*=\"MuiAccordionDetails-root\"]';\nexport const ACCORDION_SUMMARY_CONTENT_SELECTOR =\n '[class*=\"MuiAccordionSummary-content\"]';\nexport const FILTER_BOX_SELECTOR = '[class*=\"MuiBox-root\"]';\nexport const SELECTED_ITEM_SELECTOR = '[class*=\"Mui-selected\"]';\nexport const LIST_ITEM_TEXT_PRIMARY_SELECTOR =\n '[class*=\"MuiListItemText-primary\"]';\nexport const LIST_ITEM_TEXT_SECONDARY_SELECTOR =\n '[class*=\"MuiListItemText-secondary\"]';\nexport const MENU_SELECTOR = 'ul[role=\"menu\"]';\nexport const CARD_ROOT_SELECTOR = '[class*=\"MuiCard-root\"]';\nexport const LIST_ITEM_TEXT_ROOT_SELECTOR = '[class*=\"MuiListItemText-root\"]';\n\n// ── Pagination ──\n\nexport const PAGINATION_ROOT_SELECTOR =\n '[class*=\"MuiTablePagination-root\"], [class*=\"TablePagination\"], [class*=\"bui-TablePagination\"]';\nexport const PAGINATION_ACTIONS_SELECTOR =\n '[class*=\"MuiTablePagination-actions\"] button:not([disabled]), [class*=\"PaginationActions\"] button:not([disabled])';\n\n// ── Cards / Dashboard layout ──\n\nexport const CARD_LAYOUT_SELECTOR = [\n '[class*=\"MuiMasonry-root\"]',\n '[class*=\"MuiGrid-container\"]',\n '[class*=\"pf-l-gallery\"]',\n '[class*=\"bui-Grid\"]',\n].join(', ');\n\nexport const CARD_ITEM_SELECTOR = [\n '[class*=\"MuiPaper-root\"]',\n '[class*=\"MuiCard-root\"]',\n '.pf-v5-c-card, [class*=\"pf-c-card\"]',\n '[class*=\"bui-Card\"]',\n].join(', ');\n\nexport const CARD_TITLE_SELECTOR =\n 'h3, h4, h5, h6, [class*=\"CardHeader-title\"]';\n\nexport const RECHARTS_LEGEND_SELECTOR =\n '.recharts-legend-wrapper p, .recharts-legend-wrapper span[class*=\"Text\"]';\n\n// ── Empty state ──\n\nexport const EMPTY_STATE_SELECTOR = '[class*=\"BackstageEmptyState\"]';\nexport const EMPTY_STATE_BODY_SELECTOR = '[class*=\"body1\"]';\n\n// ── Shadow DOM (TechDocs) ──\n\nexport const SHADOW_HOST_SELECTOR =\n '[data-testid=\"techdocs-native-shadowroot\"], [class*=\"shadowDom\" i]';\nexport const SHADOW_NOISE_SELECTOR =\n 'style, script, link, noscript, svg, img, template';\n"],"names":[],"mappings":"AA2BO,MAAM,eAAA,GAAkB;AAAA,EAC7B,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,kDAAA;AAAA,EACA,+BAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,+BAAA;AAAA,EACA;AACF;AAEO,MAAM,cAAA,GAAiB,eAAA,CAAgB,IAAA,CAAK,IAAI;AAIhD,MAAM,oBAAA,GAAuB;AAC7B,MAAM,mBAAA,GAAsB;AAC5B,MAAM,mBAAA,GAAsB;AAC5B,MAAM,mBAAA,GACX;AACK,MAAM,mBAAA,GAAsB;AAI5B,MAAM,iBAAA,GAAoB;AAC1B,MAAM,YAAA,GAAe;AACrB,MAAM,gBAAA,GACX;AACK,MAAM,qBAAA,GAAwB;AAI9B,MAAM,qBAAA,GAAwB;AAC9B,MAAM,qBAAA,GACX;AACK,MAAM,uBAAA,GACX;AACK,MAAM,qBAAA,GAAwB;AAC9B,MAAM,wBAAA,GAA2B;AAIjC,MAAM,cAAA,GACX;AAIK,MAAM,qBAAA,GAAwB;AAC9B,MAAM,sBAAA,GACX;AACK,MAAM,oBAAA,GAAuB;AAC7B,MAAM,uBAAA,GAA0B;AAIhC,MAAM,yBAAA,GAA4B;AAIlC,MAAM,kBAAA,GAAqB;AAC3B,MAAM,qBAAA,GACX;AAKK,MAAM,mBAAA,GAAsB;AAC5B,MAAM,uBAAA,GACX;AAEK,MAAM,2BAAA,GACX;AACK,MAAM,mBAAA,GACX;AAGK,MAAM,wBAAA,GAA2B;AAAA,EACtC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,2BAAA;AAAA,EACA,sBAAA;AAAA,EACA,gCAAA;AAAA,EACA,mCAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI;AAIJ,MAAM,qBAAA,GACX;AAIK,MAAM,yBAAA,GAA4B;AAClC,MAAM,mBAAA,GACX;AACK,MAAM,uBAAA,GAA0B;AAChC,MAAM,0BAAA,GAA6B;AACnC,MAAM,kCAAA,GACX;AACK,MAAM,mBAAA,GAAsB;AAC5B,MAAM,sBAAA,GAAyB;AAC/B,MAAM,+BAAA,GACX;AACK,MAAM,iCAAA,GACX;AACK,MAAM,aAAA,GAAgB;AACtB,MAAM,kBAAA,GAAqB;AAC3B,MAAM,4BAAA,GAA+B;AAIrC,MAAM,wBAAA,GACX;AACK,MAAM,2BAAA,GACX;AAIK,MAAM,oBAAA,GAAuB;AAAA,EAClC,4BAAA;AAAA,EACA,8BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI;AAEJ,MAAM,kBAAA,GAAqB;AAAA,EAChC,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qCAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI;AAEJ,MAAM,mBAAA,GACX;AAEK,MAAM,wBAAA,GACX;AAIK,MAAM,oBAAA,GAAuB;AAC7B,MAAM,yBAAA,GAA4B;AAIlC,MAAM,oBAAA,GACX;AACK,MAAM,qBAAA,GACX;;;;"}
@@ -0,0 +1,35 @@
1
+ function getScopedDialogProps(isCompact) {
2
+ if (!isCompact) return {};
3
+ return {
4
+ disablePortal: true,
5
+ disableScrollLock: true,
6
+ fullWidth: true,
7
+ maxWidth: false,
8
+ sx: {
9
+ position: "absolute",
10
+ inset: 0,
11
+ margin: 0,
12
+ '& [class*="Backdrop-root"]': {
13
+ position: "absolute"
14
+ }
15
+ },
16
+ PaperProps: {
17
+ sx: {
18
+ marginTop: "16px !important",
19
+ marginBottom: "16px !important",
20
+ marginLeft: "40px !important",
21
+ marginRight: "40px !important",
22
+ borderRadius: "12px !important",
23
+ width: "calc(100% - 80px) !important",
24
+ maxWidth: "min(480px, calc(100% - 80px)) !important",
25
+ maxHeight: "calc(100% - 32px) !important",
26
+ overflowX: "hidden",
27
+ overflowY: "auto",
28
+ boxSizing: "border-box"
29
+ }
30
+ }
31
+ };
32
+ }
33
+
34
+ export { getScopedDialogProps };
35
+ //# sourceMappingURL=scoped-dialog-utils.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-dialog-utils.esm.js","sources":["../../src/utils/scoped-dialog-utils.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 type { DialogProps } from '@mui/material/Dialog';\n\nexport function getScopedDialogProps(isCompact: boolean): Partial<DialogProps> {\n if (!isCompact) return {};\n return {\n disablePortal: true,\n disableScrollLock: true,\n fullWidth: true,\n maxWidth: false,\n sx: {\n position: 'absolute',\n inset: 0,\n margin: 0,\n '& [class*=\"Backdrop-root\"]': {\n position: 'absolute',\n },\n },\n PaperProps: {\n sx: {\n marginTop: '16px !important',\n marginBottom: '16px !important',\n marginLeft: '40px !important',\n marginRight: '40px !important',\n borderRadius: '12px !important',\n width: 'calc(100% - 80px) !important',\n maxWidth: 'min(480px, calc(100% - 80px)) !important',\n maxHeight: 'calc(100% - 32px) !important',\n overflowX: 'hidden',\n overflowY: 'auto',\n boxSizing: 'border-box',\n },\n },\n };\n}\n"],"names":[],"mappings":"AAkBO,SAAS,qBAAqB,SAAA,EAA0C;AAC7E,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AACxB,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,IAAA;AAAA,IACf,iBAAA,EAAmB,IAAA;AAAA,IACnB,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,KAAA;AAAA,IACV,EAAA,EAAI;AAAA,MACF,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,4BAAA,EAA8B;AAAA,QAC5B,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,EAAA,EAAI;AAAA,QACF,SAAA,EAAW,iBAAA;AAAA,QACX,YAAA,EAAc,iBAAA;AAAA,QACd,UAAA,EAAY,iBAAA;AAAA,QACZ,WAAA,EAAa,iBAAA;AAAA,QACb,YAAA,EAAc,iBAAA;AAAA,QACd,KAAA,EAAO,8BAAA;AAAA,QACP,QAAA,EAAU,0CAAA;AAAA,QACV,SAAA,EAAW,8BAAA;AAAA,QACX,SAAA,EAAW,QAAA;AAAA,QACX,SAAA,EAAW,MAAA;AAAA,QACX,SAAA,EAAW;AAAA;AACb;AACF,GACF;AACF;;;;"}
@@ -0,0 +1,66 @@
1
+ const REDACTED = "[REDACTED]";
2
+ const SECRET_PATTERNS = [
3
+ // GitHub tokens (classic PAT, server-to-server, OAuth, fine-grained, user-to-server, refresh)
4
+ /gh[pousr]_[a-zA-Z0-9]{36,}/g,
5
+ /github_pat_[a-zA-Z0-9_]{22,}/g,
6
+ // GitLab PAT
7
+ /glpat-[a-zA-Z0-9\-_]{20,}/g,
8
+ // OpenAI / Anthropic API keys
9
+ /sk-[a-zA-Z0-9-]{32,}/g,
10
+ // AWS access key IDs
11
+ /AKIA[0-9A-Z]{16}/g,
12
+ // Slack tokens (app, bot, refresh, session, user)
13
+ /xox[abrsp]-[0-9]+-[A-Za-z0-9]+/g,
14
+ // Slack incoming webhooks
15
+ /https:\/\/hooks\.slack\.com\/services\/T[A-Za-z0-9]+\/B[A-Za-z0-9]+\/[A-Za-z0-9]+/g,
16
+ // npm access tokens
17
+ /npm_[A-Za-z0-9]{36,}/g,
18
+ // Google API keys
19
+ /AIza[A-Za-z0-9_-]{35}/g,
20
+ // Azure AD client secrets (v2 format: 3 chars + 7Q~ or 8Q~ + 31 chars)
21
+ /[\w~.-]{3}[78]Q~[\w~.-]{31}/g,
22
+ // JWTs
23
+ /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,
24
+ // PEM private keys
25
+ /-----BEGIN[A-Z ]*PRIVATE KEY-----[\s\S]*?-----END[A-Z ]*PRIVATE KEY-----/g,
26
+ // Basic auth in URIs (e.g. https://user:pass@host)
27
+ /\w+:\/\/[^/\s:]+:[^/\s@]+@[^/\s]+/g,
28
+ // Bearer tokens
29
+ /Bearer\s+[A-Za-z0-9\-._~+/]{20,}=*/g
30
+ ];
31
+ const SENSITIVE_LABEL_PATTERN = /secret|token|password|api.?key|credential|private.?key|access.?key/i;
32
+ const SAFE_LABEL_EXCLUSIONS = /token usage|token count|token limit|token budget/i;
33
+ function redactText(text) {
34
+ let result = text;
35
+ for (const pattern of SECRET_PATTERNS) {
36
+ pattern.lastIndex = 0;
37
+ result = result.replace(pattern, REDACTED);
38
+ }
39
+ return result;
40
+ }
41
+ function isSensitiveElement(el, doc) {
42
+ if (el.type === "password") {
43
+ return true;
44
+ }
45
+ for (const attr of ["aria-label", "name", "title", "placeholder"]) {
46
+ const val = el.getAttribute(attr) || "";
47
+ if (SENSITIVE_LABEL_PATTERN.test(val) && !SAFE_LABEL_EXCLUSIONS.test(val)) {
48
+ return true;
49
+ }
50
+ }
51
+ const id = el.getAttribute("id");
52
+ if (id) {
53
+ const label = doc.querySelector(`label[for="${CSS.escape(id)}"]`);
54
+ if (label?.textContent && SENSITIVE_LABEL_PATTERN.test(label.textContent)) {
55
+ return !SAFE_LABEL_EXCLUSIONS.test(label.textContent);
56
+ }
57
+ }
58
+ const parentLabel = el.closest("label");
59
+ if (parentLabel?.textContent && SENSITIVE_LABEL_PATTERN.test(parentLabel.textContent)) {
60
+ return !SAFE_LABEL_EXCLUSIONS.test(parentLabel.textContent);
61
+ }
62
+ return false;
63
+ }
64
+
65
+ export { SAFE_LABEL_EXCLUSIONS, SECRET_PATTERNS, SENSITIVE_LABEL_PATTERN, isSensitiveElement, redactText };
66
+ //# sourceMappingURL=sensitive-data-redactor.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-data-redactor.esm.js","sources":["../../src/utils/sensitive-data-redactor.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\nconst REDACTED = '[REDACTED]';\nconst MASK = '••••••••';\n\n/**\n * Regex patterns matching known secret/token formats.\n * Each pattern uses the global flag for replaceAll behavior.\n * WARNING: These regexes are stateful (/g). Reset lastIndex before calling\n * .test() or .exec() directly. Prefer using redactText() instead.\n */\nexport const SECRET_PATTERNS: RegExp[] = [\n // GitHub tokens (classic PAT, server-to-server, OAuth, fine-grained, user-to-server, refresh)\n /gh[pousr]_[a-zA-Z0-9]{36,}/g,\n /github_pat_[a-zA-Z0-9_]{22,}/g,\n // GitLab PAT\n /glpat-[a-zA-Z0-9\\-_]{20,}/g,\n // OpenAI / Anthropic API keys\n /sk-[a-zA-Z0-9-]{32,}/g,\n // AWS access key IDs\n /AKIA[0-9A-Z]{16}/g,\n // Slack tokens (app, bot, refresh, session, user)\n /xox[abrsp]-[0-9]+-[A-Za-z0-9]+/g,\n // Slack incoming webhooks\n /https:\\/\\/hooks\\.slack\\.com\\/services\\/T[A-Za-z0-9]+\\/B[A-Za-z0-9]+\\/[A-Za-z0-9]+/g,\n // npm access tokens\n /npm_[A-Za-z0-9]{36,}/g,\n // Google API keys\n /AIza[A-Za-z0-9_-]{35}/g,\n // Azure AD client secrets (v2 format: 3 chars + 7Q~ or 8Q~ + 31 chars)\n /[\\w~.-]{3}[78]Q~[\\w~.-]{31}/g,\n // JWTs\n /eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]*/g,\n // PEM private keys\n /-----BEGIN[A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END[A-Z ]*PRIVATE KEY-----/g,\n // Basic auth in URIs (e.g. https://user:pass@host)\n /\\w+:\\/\\/[^/\\s:]+:[^/\\s@]+@[^/\\s]+/g,\n // Bearer tokens\n /Bearer\\s+[A-Za-z0-9\\-._~+/]{20,}=*/g,\n];\n\n/**\n * Label text patterns that indicate a field holds sensitive content.\n */\nexport const SENSITIVE_LABEL_PATTERN =\n /secret|token|password|api.?key|credential|private.?key|access.?key/i;\n\n/**\n * Label patterns that are safe false-positives and should NOT trigger redaction.\n */\nexport const SAFE_LABEL_EXCLUSIONS =\n /token usage|token count|token limit|token budget/i;\n\n/**\n * Scans text for known secret patterns and replaces them with [REDACTED].\n * Used by DOM extraction to sanitize extracted text before sending.\n */\nexport function redactText(text: string): string {\n let result = text;\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0;\n result = result.replace(pattern, REDACTED);\n }\n return result;\n}\n\n/**\n * Determines if an input/textarea element is likely holding a secret,\n * based on its type, aria-label, or associated label element.\n */\nexport function isSensitiveElement(el: Element, doc: Document): boolean {\n if ((el as HTMLInputElement).type === 'password') {\n return true;\n }\n\n for (const attr of ['aria-label', 'name', 'title', 'placeholder']) {\n const val = el.getAttribute(attr) || '';\n if (SENSITIVE_LABEL_PATTERN.test(val) && !SAFE_LABEL_EXCLUSIONS.test(val)) {\n return true;\n }\n }\n\n const id = el.getAttribute('id');\n if (id) {\n const label = doc.querySelector(`label[for=\"${CSS.escape(id)}\"]`);\n if (label?.textContent && SENSITIVE_LABEL_PATTERN.test(label.textContent)) {\n return !SAFE_LABEL_EXCLUSIONS.test(label.textContent);\n }\n }\n\n const parentLabel = el.closest('label');\n if (\n parentLabel?.textContent &&\n SENSITIVE_LABEL_PATTERN.test(parentLabel.textContent)\n ) {\n return !SAFE_LABEL_EXCLUSIONS.test(parentLabel.textContent);\n }\n\n return false;\n}\n\n/**\n * Sanitizes a cloned DOM before it is rendered to canvas.\n * Used in html2canvas onclone callback.\n * Mutates the clone — safe because it's not the live DOM.\n */\nexport function sanitizeClonedDom(clonedDoc: Document): void {\n // 1. Mask all sensitive inputs/textareas (password fields + label-detected)\n // 2. Regex-scan all remaining input/textarea values for token patterns\n clonedDoc.querySelectorAll('input, textarea').forEach(el => {\n if (isSensitiveElement(el, clonedDoc)) {\n (el as HTMLInputElement).value = MASK;\n } else {\n const inp = el as HTMLInputElement;\n if (inp.value) {\n inp.value = redactText(inp.value);\n }\n }\n });\n\n // 3. Regex scan all text nodes for token patterns\n const walker = clonedDoc.createTreeWalker(\n clonedDoc.body,\n NodeFilter.SHOW_TEXT,\n );\n let node = walker.nextNode();\n while (node) {\n if (node.textContent) {\n const redacted = redactText(node.textContent);\n if (redacted !== node.textContent) {\n node.textContent = redacted;\n }\n }\n node = walker.nextNode();\n }\n\n // 4. Handle visibility-toggle secrets (e.g. Akeyless show/hide pattern)\n clonedDoc\n .querySelectorAll(\n '[aria-label*=\"Hide secret\" i], [aria-label*=\"Hide value\" i]',\n )\n .forEach(btn => {\n const container = btn.closest('[class*=\"Box\"], [class*=\"flex\"]');\n if (container) {\n const textEl = container.querySelector('pre, code, span, p');\n if (textEl?.textContent && textEl.textContent !== MASK) {\n textEl.textContent = MASK;\n }\n }\n });\n}\n"],"names":[],"mappings":"AAgBA,MAAM,QAAA,GAAW,YAAA;AASV,MAAM,eAAA,GAA4B;AAAA;AAAA,EAEvC,6BAAA;AAAA,EACA,+BAAA;AAAA;AAAA,EAEA,4BAAA;AAAA;AAAA,EAEA,uBAAA;AAAA;AAAA,EAEA,mBAAA;AAAA;AAAA,EAEA,iCAAA;AAAA;AAAA,EAEA,oFAAA;AAAA;AAAA,EAEA,uBAAA;AAAA;AAAA,EAEA,wBAAA;AAAA;AAAA,EAEA,8BAAA;AAAA;AAAA,EAEA,4DAAA;AAAA;AAAA,EAEA,2EAAA;AAAA;AAAA,EAEA,oCAAA;AAAA;AAAA,EAEA;AACF;AAKO,MAAM,uBAAA,GACX;AAKK,MAAM,qBAAA,GACX;AAMK,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,kBAAA,CAAmB,IAAa,GAAA,EAAwB;AACtE,EAAA,IAAK,EAAA,CAAwB,SAAS,UAAA,EAAY;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,QAAQ,CAAC,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAS,aAAa,CAAA,EAAG;AACjE,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA,IAAK,EAAA;AACrC,IAAA,IAAI,uBAAA,CAAwB,KAAK,GAAG,CAAA,IAAK,CAAC,qBAAA,CAAsB,IAAA,CAAK,GAAG,CAAA,EAAG;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAChE,IAAA,IAAI,OAAO,WAAA,IAAe,uBAAA,CAAwB,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AACzE,MAAA,OAAO,CAAC,qBAAA,CAAsB,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACtC,EAAA,IACE,aAAa,WAAA,IACb,uBAAA,CAAwB,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA,EACpD;AACA,IAAA,OAAO,CAAC,qBAAA,CAAsB,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,KAAA;AACT;;;;"}
@@ -0,0 +1,105 @@
1
+ const toolCallIdKey = (id) => String(id);
2
+ const normalizeToolCalls = (calls) => (calls ?? []).filter((tc) => tc !== null);
3
+ const isMcpStyleToolCallPayload = (data) => !!data && typeof data.name === "string" && data.name.trim().length > 0 && data.id !== null;
4
+ const isLegacyToolResultToken = (token) => !!token && typeof token === "object" && !Array.isArray(token) && typeof token.tool_name === "string" && token.tool_name.length > 0;
5
+ const legacyToolResultToString = (response) => {
6
+ if (!response) return "";
7
+ if (typeof response === "string") return response;
8
+ try {
9
+ return JSON.stringify(response);
10
+ } catch {
11
+ return String(response);
12
+ }
13
+ };
14
+ let tempToolCallsCachePrefixFallbackSeq = 0;
15
+ function createTempToolCallsCacheSessionPrefix() {
16
+ const suffix = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${++tempToolCallsCachePrefixFallbackSeq}`;
17
+ return `lightspeed-temp:${suffix}`;
18
+ }
19
+ function parseSSEBuffer(buffer) {
20
+ const parts = buffer.split("\n\n");
21
+ const remainder = parts.pop();
22
+ const events = [];
23
+ const parseErrors = [];
24
+ for (const part of parts) {
25
+ const lines = part.split("\n").filter((line) => line.startsWith("data:"));
26
+ const jsonString = lines.map((line) => line.trim().slice(5).trim()).join("");
27
+ try {
28
+ events.push(JSON.parse(jsonString));
29
+ } catch (error) {
30
+ parseErrors.push(error);
31
+ }
32
+ }
33
+ return { events, parseErrors, remainder };
34
+ }
35
+ function parseToolCallFromEvent(data) {
36
+ const toolCallData = data?.token;
37
+ const legacyObjectCall = typeof toolCallData === "object" && toolCallData !== null && !Array.isArray(toolCallData) && toolCallData.tool_name;
38
+ const mcpStyle = isMcpStyleToolCallPayload(data);
39
+ const rawArgs = data?.args ?? data?.arguments;
40
+ const mcpArgs = rawArgs && typeof rawArgs === "object" && !Array.isArray(rawArgs) ? rawArgs : {};
41
+ if (legacyObjectCall && data.id !== null) {
42
+ return {
43
+ id: data.id,
44
+ toolName: toolCallData.tool_name,
45
+ arguments: toolCallData.arguments || {},
46
+ startTime: Date.now(),
47
+ isLoading: true
48
+ };
49
+ }
50
+ if (mcpStyle) {
51
+ return {
52
+ id: data.id,
53
+ toolName: data.name.trim(),
54
+ description: typeof data.type === "string" && data.type !== data.name ? data.type : void 0,
55
+ arguments: mcpArgs,
56
+ startTime: Date.now(),
57
+ isLoading: true
58
+ };
59
+ }
60
+ return void 0;
61
+ }
62
+ function parseToolResultFromEvent(data, pendingToolCalls) {
63
+ const tokenResult = data?.token;
64
+ const legacyResult = isLegacyToolResultToken(tokenResult);
65
+ const mcpHasContent = data?.id !== null && data.content !== void 0 && !legacyResult;
66
+ let responsePayload;
67
+ let matchToolName;
68
+ let toolIdKey;
69
+ if (legacyResult) {
70
+ responsePayload = legacyToolResultToString(tokenResult.response);
71
+ matchToolName = tokenResult.tool_name;
72
+ toolIdKey = data?.id !== null ? toolCallIdKey(data.id) : void 0;
73
+ } else if (mcpHasContent) {
74
+ toolIdKey = toolCallIdKey(data.id);
75
+ responsePayload = typeof data.content === "string" ? data.content : JSON.stringify(data.content);
76
+ if (typeof data.status === "string" && data.status !== "success") {
77
+ responsePayload = `[${data.status}] ${responsePayload}`;
78
+ }
79
+ }
80
+ if (responsePayload === void 0 || toolIdKey === void 0) {
81
+ return void 0;
82
+ }
83
+ const pendingCall = pendingToolCalls[toolIdKey];
84
+ const endTime = Date.now();
85
+ const executionTime = pendingCall ? (endTime - pendingCall.startTime) / 1e3 : 0;
86
+ return { responsePayload, matchToolName, toolIdKey, endTime, executionTime };
87
+ }
88
+ function applyToolResultToToolCalls(toolCalls, result) {
89
+ return toolCalls.map((tc) => {
90
+ const idMatches = toolCallIdKey(tc.id) === result.toolIdKey || result.matchToolName !== void 0 && tc.toolName === result.matchToolName;
91
+ if (idMatches) {
92
+ return {
93
+ ...tc,
94
+ response: result.responsePayload,
95
+ endTime: result.endTime,
96
+ executionTime: result.executionTime,
97
+ isLoading: false
98
+ };
99
+ }
100
+ return tc;
101
+ });
102
+ }
103
+
104
+ export { applyToolResultToToolCalls, createTempToolCallsCacheSessionPrefix, isLegacyToolResultToken, isMcpStyleToolCallPayload, legacyToolResultToString, normalizeToolCalls, parseSSEBuffer, parseToolCallFromEvent, parseToolResultFromEvent, toolCallIdKey };
105
+ //# sourceMappingURL=stream-event-helpers.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-event-helpers.esm.js","sources":["../../src/utils/stream-event-helpers.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 { ToolCall } from '../types';\n\nexport const toolCallIdKey = (id: string | number): string => String(id);\n\nexport const normalizeToolCalls = (\n calls: (ToolCall | undefined)[] | undefined,\n): ToolCall[] => (calls ?? []).filter((tc): tc is ToolCall => tc !== null);\n\nexport const isMcpStyleToolCallPayload = (\n data: Record<string, any> | undefined,\n): boolean =>\n !!data &&\n typeof data.name === 'string' &&\n data.name.trim().length > 0 &&\n data.id !== null;\n\n/** Legacy tool_result uses data.token with at least tool_name and response. */\nexport const isLegacyToolResultToken = (\n token: unknown,\n): token is { tool_name: string; response?: unknown } =>\n !!token &&\n typeof token === 'object' &&\n !Array.isArray(token) &&\n typeof (token as { tool_name?: string }).tool_name === 'string' &&\n (token as { tool_name: string }).tool_name.length > 0;\n\nexport const legacyToolResultToString = (response: unknown): string => {\n if (!response) return '';\n if (typeof response === 'string') return response;\n try {\n return JSON.stringify(response);\n } catch {\n return String(response);\n }\n};\n\nlet tempToolCallsCachePrefixFallbackSeq = 0;\n\n/** Unique prefix per temp send so late streams cannot migrate another session's tool cache. */\nexport function createTempToolCallsCacheSessionPrefix(): string {\n const suffix =\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now()}-${++tempToolCallsCachePrefixFallbackSeq}`;\n return `lightspeed-temp:${suffix}`;\n}\n\n/**\n * Parse an SSE buffer into discrete JSON events, returning the unparsed\n * remainder (incomplete trailing chunk).\n */\nexport function parseSSEBuffer(buffer: string): {\n events: Array<{ event: string; data: any }>;\n parseErrors: unknown[];\n remainder: string;\n} {\n const parts = buffer.split('\\n\\n');\n const remainder = parts.pop()!;\n const events: Array<{ event: string; data: any }> = [];\n const parseErrors: unknown[] = [];\n\n for (const part of parts) {\n const lines = part.split('\\n').filter(line => line.startsWith('data:'));\n const jsonString = lines.map(line => line.trim().slice(5).trim()).join('');\n try {\n events.push(JSON.parse(jsonString));\n } catch (error) {\n parseErrors.push(error);\n }\n }\n\n return { events, parseErrors, remainder };\n}\n\n/**\n * Parse a `tool_call` SSE event payload into a ToolCall object.\n * Returns undefined if the payload doesn't match any known format.\n */\nexport function parseToolCallFromEvent(\n data: Record<string, any>,\n): ToolCall | undefined {\n const toolCallData = data?.token;\n const legacyObjectCall =\n typeof toolCallData === 'object' &&\n toolCallData !== null &&\n !Array.isArray(toolCallData) &&\n (toolCallData as { tool_name?: string }).tool_name;\n\n const mcpStyle = isMcpStyleToolCallPayload(data);\n const rawArgs = data?.args ?? data?.arguments;\n const mcpArgs: Record<string, any> =\n rawArgs && typeof rawArgs === 'object' && !Array.isArray(rawArgs)\n ? rawArgs\n : {};\n\n if (legacyObjectCall && data.id !== null) {\n return {\n id: data.id,\n toolName: (toolCallData as { tool_name: string }).tool_name,\n arguments:\n (toolCallData as { arguments?: Record<string, any> }).arguments || {},\n startTime: Date.now(),\n isLoading: true,\n };\n }\n\n if (mcpStyle) {\n return {\n id: data.id,\n toolName: data.name.trim(),\n description:\n typeof data.type === 'string' && data.type !== data.name\n ? data.type\n : undefined,\n arguments: mcpArgs,\n startTime: Date.now(),\n isLoading: true,\n };\n }\n\n return undefined;\n}\n\nexport interface ToolResultParsed {\n responsePayload: string;\n matchToolName: string | undefined;\n toolIdKey: string;\n endTime: number;\n executionTime: number;\n}\n\n/**\n * Parse a `tool_result` SSE event payload and compute execution time.\n * Returns undefined if the payload doesn't match any known format.\n */\nexport function parseToolResultFromEvent(\n data: Record<string, any>,\n pendingToolCalls: Record<string, ToolCall>,\n): ToolResultParsed | undefined {\n const tokenResult = data?.token;\n const legacyResult = isLegacyToolResultToken(tokenResult);\n const mcpHasContent =\n data?.id !== null && data.content !== undefined && !legacyResult;\n\n let responsePayload: string | undefined;\n let matchToolName: string | undefined;\n let toolIdKey: string | undefined;\n\n if (legacyResult) {\n responsePayload = legacyToolResultToString(tokenResult.response);\n matchToolName = tokenResult.tool_name;\n toolIdKey = data?.id !== null ? toolCallIdKey(data.id) : undefined;\n } else if (mcpHasContent) {\n toolIdKey = toolCallIdKey(data.id);\n responsePayload =\n typeof data.content === 'string'\n ? data.content\n : JSON.stringify(data.content);\n if (typeof data.status === 'string' && data.status !== 'success') {\n responsePayload = `[${data.status}] ${responsePayload}`;\n }\n }\n\n if (responsePayload === undefined || toolIdKey === undefined) {\n return undefined;\n }\n\n const pendingCall = pendingToolCalls[toolIdKey];\n const endTime = Date.now();\n const executionTime = pendingCall\n ? (endTime - pendingCall.startTime) / 1000\n : 0;\n\n return { responsePayload, matchToolName, toolIdKey, endTime, executionTime };\n}\n\n/**\n * Apply a tool result to a list of tool calls, returning the updated array.\n */\nexport function applyToolResultToToolCalls(\n toolCalls: ToolCall[],\n result: ToolResultParsed,\n): ToolCall[] {\n return toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === result.toolIdKey ||\n (result.matchToolName !== undefined &&\n tc.toolName === result.matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: result.responsePayload,\n endTime: result.endTime,\n executionTime: result.executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n}\n"],"names":[],"mappings":"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"}